i2c: designware: Don't set SCL timings and speed mode when in slave mode
Subsystems (3)
PATCH 1/1 i2c: designware: Don't set SCL timings and speed mode when in slave mode
According to data sheet SCL timing parameters and DW_IC_CON SPEED mode bits are not used when operating in slave mode.
---
I've done quick testing with i2c-slave-eeprom and i2cdump over together hooked busses without issues. Would like to hear tested by or comment from Luis though. Patch is not urgent so can wait after vacation etc.
--- drivers/i2c/busses/i2c-designware-platdrv.c | 11 ----- drivers/i2c/busses/i2c-designware-slave.c | 64 ----------------------------- 2 files changed, 75 deletions(-)
drivers/i2c/busses/i2c-designware-platdrv.c +0 -11
@@ -201,17 +201,6 @@ static void i2c_dw_configure_slave(struct dw_i2c_dev *dev)DW_IC_CON_RESTART_EN |DW_IC_CON_STOP_DET_IFADDRESSED ; dev->mode =DW_IC_SLAVE ; - -switch (dev->clk_freq) { -case 100000 : - dev->slave_cfg |=DW_IC_CON_SPEED_STD ; -break ; -case 3400000 : - dev->slave_cfg |=DW_IC_CON_SPEED_HIGH ; -break ; -default : - dev->slave_cfg |=DW_IC_CON_SPEED_FAST ; - } }static int i2c_dw_plat_prepare_clk (struct dw_i2c_dev *i_dev,bool prepare)
drivers/i2c/busses/i2c-designware-slave.c +0 -64
77 lines not on this page · raw message
Signature · 1 line
2.14.1
Quoted 8 lines · Jarkko Nikula
According to data sheet SCL timing parameters and
DW_IC_CONSPEED mode bits are not used when operating in slave mode.Signed-off-by Jarkko Nikula <[email protected]>---
I've done quick testing with i2c-slave-eeprom and i2cdump over together hooked busses without issues. Would like to hear tested by or comment from Luis though. Patch is not urgent so can wait after vacation etc.
Luis?
Quoted 113 lines
--- drivers/i2c/busses/i2c-designware-platdrv.c | 11 ----- drivers/i2c/busses/i2c-designware-slave.c | 64 ----------------------------- 2 files changed, 75 deletions(-)drivers/i2c/busses/i2c-designware-platdrv.c +0
-11@@ -201,17 +201,6 @@ static void i2c_dw_configure_slave(struct dw_i2c_dev *dev)DW_IC_CON_RESTART_EN |DW_IC_CON_STOP_DET_IFADDRESSED ; dev->mode =DW_IC_SLAVE ; - -switch (dev->clk_freq) { -case 100000 : - dev->slave_cfg |=DW_IC_CON_SPEED_STD ; -break ; -case 3400000 : - dev->slave_cfg |=DW_IC_CON_SPEED_HIGH ; -break ; -default : - dev->slave_cfg |=DW_IC_CON_SPEED_FAST ; - } }static int i2c_dw_plat_prepare_clk (struct dw_i2c_dev *i_dev,bool prepare)drivers/i2c/busses/i2c-designware-slave.c +0
-64@@ -51,9 +51,7 @@ static void i2c_dw_configure_fifo_slave(struct dw_i2c_dev *dev)*/ static int i2c_dw_init_slave (struct dw_i2c_dev *dev) { -u32 sda_falling_time, scl_falling_time;u32 reg, comp_param1; -u32 hcnt, lcnt;int ret; ret =i2c_dw_acquire_lock (dev);@@ -79,68 +77,6 @@ static int i2c_dw_init_slave(struct dw_i2c_dev *dev)/* Disable the adapter. */ __i2c_dw_enable_and_wait (dev, false); -/* Set standard and fast speed deviders for high/low periods. */ - sda_falling_time = dev->sda_falling_time ?:300 ;/* ns */ - scl_falling_time = dev->scl_falling_time ?:300 ;/* ns */ - -/* Set SCL timing parameters for standard-mode. */ -if (dev->ss_hcnt && dev->ss_lcnt) { - hcnt = dev->ss_hcnt; - lcnt = dev->ss_lcnt; - }else { - hcnt =i2c_dw_scl_hcnt (i2c_dw_clk_rate (dev), -4000 ,/* tHD;STA = tHIGH = 4.0 us */ - sda_falling_time, -0 ,/* 0: DW default, 1: Ideal */ -0 );/* No offset */ - lcnt =i2c_dw_scl_lcnt (i2c_dw_clk_rate (dev), -4700 ,/* tLOW = 4.7 us */ - scl_falling_time, -0 );/* No offset */ - } -dw_writel (dev, hcnt,DW_IC_SS_SCL_HCNT ); -dw_writel (dev, lcnt,DW_IC_SS_SCL_LCNT ); -dev_dbg (dev->dev,"Standard-mode HCNT:LCNT = %d:%d\n" , hcnt, lcnt); - -/* Set SCL timing parameters for fast-mode or fast-mode plus. */ -if ((dev->clk_freq ==1000000 ) && dev->fp_hcnt && dev->fp_lcnt) { - hcnt = dev->fp_hcnt; - lcnt = dev->fp_lcnt; - }else if (dev->fs_hcnt && dev->fs_lcnt) { - hcnt = dev->fs_hcnt; - lcnt = dev->fs_lcnt; - }else { - hcnt =i2c_dw_scl_hcnt (i2c_dw_clk_rate (dev), -600 ,/* tHD;STA = tHIGH = 0.6 us */ - sda_falling_time, -0 ,/* 0: DW default, 1: Ideal */ -0 );/* No offset */ - lcnt =i2c_dw_scl_lcnt (i2c_dw_clk_rate (dev), -1300 ,/* tLOW = 1.3 us */ - scl_falling_time, -0 );/* No offset */ - } -dw_writel (dev, hcnt,DW_IC_FS_SCL_HCNT ); -dw_writel (dev, lcnt,DW_IC_FS_SCL_LCNT ); -dev_dbg (dev->dev,"Fast-mode HCNT:LCNT = %d:%d\n" , hcnt, lcnt); - -if ((dev->slave_cfg &DW_IC_CON_SPEED_MASK ) == -DW_IC_CON_SPEED_HIGH ) { -if ((comp_param1 &DW_IC_COMP_PARAM_1_SPEED_MODE_MASK ) - !=DW_IC_COMP_PARAM_1_SPEED_MODE_HIGH ) { -dev_err (dev->dev,"High Speed not supported!\n" ); - dev->slave_cfg &= ~DW_IC_CON_SPEED_MASK ; - dev->slave_cfg |=DW_IC_CON_SPEED_FAST ; - }else if (dev->hs_hcnt && dev->hs_lcnt) { - hcnt = dev->hs_hcnt; - lcnt = dev->hs_lcnt; -dw_writel (dev, hcnt,DW_IC_HS_SCL_HCNT ); -dw_writel (dev, lcnt,DW_IC_HS_SCL_LCNT ); -dev_dbg (dev->dev,"HighSpeed-mode HCNT:LCNT = %d:%d\n" , - hcnt, lcnt); - } - } -/* Configure SDA Hold Time if required. */ reg =dw_readl (dev,DW_IC_COMP_VERSION );if (reg >=DW_IC_SDA_HOLD_MIN_VERS ) {Signature · 1 line
2.14.1
Hi Luis
Quoted 4 lines · Wolfram Sang
Quoted 3 lines · Jarkko Nikula
According to data sheet SCL timing parameters and
DW_IC_CONSPEED mode bits are not used when operating in slave mode.
Quoted 8 lines
Quoted 5 lines
Signed-off-by Jarkko Nikula <[email protected]>---
I've done quick testing with i2c-slave-eeprom and i2cdump over together hooked busses without issues. Would like to hear tested by or comment from Luis though. Patch is not urgent so can wait after vacation etc.Luis?
Do you have possibility test my patch it doesn't break anything?
Signature · 1 line
Jarkko
Hi Jarkko
I will try to have my hardware available asap. But for what I saw it should run smoothly.
Quoted 13 lines · Jarkko Nikula
Hi Luis
Quoted 10 lines · Wolfram Sang
Quoted 8 lines · Jarkko Nikula
According to data sheet SCL timing parameters and
DW_IC_CONSPEED mode bits are not used when operating in slave mode.Signed-off-by Jarkko Nikula <[email protected]>---
I've done quick testing with i2c-slave-eeprom and i2cdump over together hooked busses without issues. Would like to hear tested by or comment from Luis though. Patch is not urgent so can wait after vacation etc.
Quoted 4 lines
Quoted 2 lines
Luis?
Do you have possibility test my patch it doesn't break anything?
Regards,
Luis
Hi Luis
Quoted 5 lines · Luis Oliveira
Hi Jarkko
I will try to have my hardware available asap. But for what I saw it should run smoothly.
Were you able to test my patch ?
Signature · 1 line
Jarkko
Hi Jarkko,
Sorry for making you wait so long but finally I've got my setup back. I tested it and everything works fine.
Quoted 109 lines · Jarkko Nikula
According to data sheet SCL timing parameters and
DW_IC_CONSPEED mode bits are not used when operating in slave mode.Signed-off-by Jarkko Nikula <[email protected]>---
I've done quick testing with i2c-slave-eeprom and i2cdump over together hooked busses without issues. Would like to hear tested by or comment from Luis though. Patch is not urgent so can wait after vacation etc.--- drivers/i2c/busses/i2c-designware-platdrv.c | 11 ----- drivers/i2c/busses/i2c-designware-slave.c | 64 ----------------------------- 2 files changed, 75 deletions(-)drivers/i2c/busses/i2c-designware-platdrv.c +0
-11@@ -201,17 +201,6 @@ static void i2c_dw_configure_slave(struct dw_i2c_dev *dev)DW_IC_CON_RESTART_EN |DW_IC_CON_STOP_DET_IFADDRESSED ; dev->mode =DW_IC_SLAVE ; - -switch (dev->clk_freq) { -case 100000 : - dev->slave_cfg |=DW_IC_CON_SPEED_STD ; -break ; -case 3400000 : - dev->slave_cfg |=DW_IC_CON_SPEED_HIGH ; -break ; -default : - dev->slave_cfg |=DW_IC_CON_SPEED_FAST ; - } }static int i2c_dw_plat_prepare_clk (struct dw_i2c_dev *i_dev,bool prepare)drivers/i2c/busses/i2c-designware-slave.c +0
-57@@ -51,9 +51,7 @@ static void i2c_dw_configure_fifo_slave(struct dw_i2c_dev *dev)*/ static int i2c_dw_init_slave (struct dw_i2c_dev *dev) { -u32 sda_falling_time, scl_falling_time;u32 reg, comp_param1; -u32 hcnt, lcnt;int ret; ret =i2c_dw_acquire_lock (dev);@@ -79,68 +77,6 @@ static int i2c_dw_init_slave(struct dw_i2c_dev *dev)/* Disable the adapter. */ __i2c_dw_enable_and_wait (dev, false); -/* Set standard and fast speed deviders for high/low periods. */ - sda_falling_time = dev->sda_falling_time ?:300 ;/* ns */ - scl_falling_time = dev->scl_falling_time ?:300 ;/* ns */ - -/* Set SCL timing parameters for standard-mode. */ -if (dev->ss_hcnt && dev->ss_lcnt) { - hcnt = dev->ss_hcnt; - lcnt = dev->ss_lcnt; - }else { - hcnt =i2c_dw_scl_hcnt (i2c_dw_clk_rate (dev), -4000 ,/* tHD;STA = tHIGH = 4.0 us */ - sda_falling_time, -0 ,/* 0: DW default, 1: Ideal */ -0 );/* No offset */ - lcnt =i2c_dw_scl_lcnt (i2c_dw_clk_rate (dev), -4700 ,/* tLOW = 4.7 us */ - scl_falling_time, -0 );/* No offset */ - } -dw_writel (dev, hcnt,DW_IC_SS_SCL_HCNT ); -dw_writel (dev, lcnt,DW_IC_SS_SCL_LCNT ); -dev_dbg (dev->dev,"Standard-mode HCNT:LCNT = %d:%d\n" , hcnt, lcnt); - -/* Set SCL timing parameters for fast-mode or fast-mode plus. */ -if ((dev->clk_freq ==1000000 ) && dev->fp_hcnt && dev->fp_lcnt) { - hcnt = dev->fp_hcnt; - lcnt = dev->fp_lcnt; - }else if (dev->fs_hcnt && dev->fs_lcnt) { - hcnt = dev->fs_hcnt; - lcnt = dev->fs_lcnt; - }else { - hcnt =i2c_dw_scl_hcnt (i2c_dw_clk_rate (dev), -600 ,/* tHD;STA = tHIGH = 0.6 us */ - sda_falling_time, -0 ,/* 0: DW default, 1: Ideal */ -0 );/* No offset */ - lcnt =i2c_dw_scl_lcnt (i2c_dw_clk_rate (dev), -1300 ,/* tLOW = 1.3 us */ - scl_falling_time, -0 );/* No offset */ - } -dw_writel (dev, hcnt,DW_IC_FS_SCL_HCNT ); -dw_writel (dev, lcnt,DW_IC_FS_SCL_LCNT ); -dev_dbg (dev->dev,"Fast-mode HCNT:LCNT = %d:%d\n" , hcnt, lcnt); - -if ((dev->slave_cfg &DW_IC_CON_SPEED_MASK ) == -DW_IC_CON_SPEED_HIGH ) { -if ((comp_param1 &DW_IC_COMP_PARAM_1_SPEED_MODE_MASK ) - !=DW_IC_COMP_PARAM_1_SPEED_MODE_HIGH ) { -dev_err (dev->dev,"High Speed not supported!\n" ); - dev->slave_cfg &= ~DW_IC_CON_SPEED_MASK ; - dev->slave_cfg |=DW_IC_CON_SPEED_FAST ; - }else if (dev->hs_hcnt && dev->hs_lcnt) { - hcnt = dev->hs_hcnt; - lcnt = dev->hs_lcnt;
drivers/i2c/busses/i2c-designware-slave.c static int i2c_dw_init_slave(struct dw_i2c_dev *dev) · line 82
Quoted 10 lines
drivers/i2c/busses/i2c-designware-slave.c +0
-7-dw_writel (dev, hcnt,DW_IC_HS_SCL_HCNT ); -dw_writel (dev, lcnt,DW_IC_HS_SCL_LCNT ); -dev_dbg (dev->dev,"HighSpeed-mode HCNT:LCNT = %d:%d\n" , - hcnt, lcnt); - } - } -/* Configure SDA Hold Time if required. */ reg =dw_readl (dev,DW_IC_COMP_VERSION );if (reg >=DW_IC_SDA_HOLD_MIN_VERS ) {
Quoted 5 lines · Luis Oliveira
Hi Jarkko,
Sorry for making you wait so long but finally I've got my setup back. I tested it and everything works fine.
Thanks for testing, no worries, cleanups like this are not so urgent :-)
Quoted 2 lines
Tested-by Luis Oliveira <[email protected]>
Signature · 1 line
Jarkko
Wolfram Sang
AppliedQuoted 4 lines · Jarkko Nikula
According to data sheet SCL timing parameters and
DW_IC_CONSPEED mode bits are not used when operating in slave mode.Signed-off-by Jarkko Nikula <[email protected]>
Applied to for-next, thanks!