2019-05-29 16:57:50 -07:00
// SPDX-License-Identifier: GPL-2.0-only
2009-12-11 16:16:32 -08:00
/*
* Helper module for board specific I2C bus registration
*
* Copyright ( C ) 2009 Nokia Corporation .
*/
2012-10-05 13:25:59 -07:00
# include "soc.h"
2012-10-02 17:41:35 -07:00
# include "omap_hwmod.h"
2012-10-02 17:25:48 -07:00
# include "omap_device.h"
2009-12-11 16:16:32 -08:00
2012-10-29 20:57:44 -06:00
# include "prm.h"
# include "common.h"
2012-10-08 09:11:22 -07:00
# include "i2c.h"
2009-12-11 16:16:32 -08:00
2011-07-10 05:27:16 -06:00
/* In register I2C_CON, Bit 15 is the I2C enable bit */
# define I2C_EN BIT(15)
# define OMAP2_I2C_CON_OFFSET 0x24
# define OMAP4_I2C_CON_OFFSET 0xA4
2012-10-08 09:11:22 -07:00
# define MAX_OMAP_I2C_HWMOD_NAME_LEN 16
2011-07-10 05:27:16 -06:00
/**
* omap_i2c_reset - reset the omap i2c module .
* @ oh : struct omap_hwmod *
*
* The i2c moudle in omap2 , omap3 had a special sequence to reset . The
* sequence is :
* - Disable the I2C .
* - Write to SOFTRESET bit .
* - Enable the I2C .
* - Poll on the RESETDONE bit .
* The sequence is implemented in below function . This is called for 2420 ,
* 2430 and omap3 .
*/
int omap_i2c_reset ( struct omap_hwmod * oh )
{
u32 v ;
u16 i2c_con ;
int c = 0 ;
2019-03-21 11:00:21 -07:00
if ( soc_is_omap24xx ( ) | | soc_is_omap34xx ( ) | | soc_is_am35xx ( ) )
2011-07-10 05:27:16 -06:00
i2c_con = OMAP2_I2C_CON_OFFSET ;
2019-03-21 11:00:21 -07:00
else
i2c_con = OMAP4_I2C_CON_OFFSET ;
2011-07-10 05:27:16 -06:00
/* Disable I2C */
v = omap_hwmod_read ( oh , i2c_con ) ;
v & = ~ I2C_EN ;
omap_hwmod_write ( v , oh , i2c_con ) ;
/* Write to the SOFTRESET bit */
omap_hwmod_softreset ( oh ) ;
/* Enable I2C */
v = omap_hwmod_read ( oh , i2c_con ) ;
v | = I2C_EN ;
omap_hwmod_write ( v , oh , i2c_con ) ;
/* Poll on RESETDONE bit */
omap_test_timeout ( ( omap_hwmod_read ( oh ,
oh - > class - > sysc - > syss_offs )
& SYSS_RESETDONE_MASK ) ,
MAX_MODULE_SOFTRESET_WAIT , c ) ;
if ( c = = MAX_MODULE_SOFTRESET_WAIT )
2014-09-13 11:31:16 -07:00
pr_warn ( " %s: %s: softreset failed (waited %d usec) \n " ,
2011-07-10 05:27:16 -06:00
__func__ , oh - > name , MAX_MODULE_SOFTRESET_WAIT ) ;
else
pr_debug ( " %s: %s: softreset in %d usec \n " , __func__ ,
oh - > name , c ) ;
return 0 ;
}