Skip to content

Commit

Permalink
mfd: TWL5030 version checking in twl-core
Browse files Browse the repository at this point in the history
Added API to get the TWL5030 Si version from the IDCODE register.
It is used for enabling the workaround for TWL erratum 27.

Signed-off-by: Lesly A M <[email protected]>
Cc: Nishanth Menon <[email protected]>
Cc: David Derrick <[email protected]>
Signed-off-by: Samuel Ortiz <[email protected]>
  • Loading branch information
Lesly A M authored and Samuel Ortiz committed May 26, 2011
1 parent d7ac829 commit ca972d1
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 1 deletion.
62 changes: 62 additions & 0 deletions drivers/mfd/twl-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,9 @@
/* is driver active, bound to a chip? */
static bool inuse;

/* TWL IDCODE Register value */
static u32 twl_idcode;

static unsigned int twl_id;
unsigned int twl_rev(void)
{
Expand Down Expand Up @@ -487,6 +490,58 @@ EXPORT_SYMBOL(twl_i2c_read_u8);

/*----------------------------------------------------------------------*/

/**
* twl_read_idcode_register - API to read the IDCODE register.
*
* Unlocks the IDCODE register and read the 32 bit value.
*/
static int twl_read_idcode_register(void)
{
int err;

err = twl_i2c_write_u8(TWL4030_MODULE_INTBR, TWL_EEPROM_R_UNLOCK,
REG_UNLOCK_TEST_REG);
if (err) {
pr_err("TWL4030 Unable to unlock IDCODE registers -%d\n", err);
goto fail;
}

err = twl_i2c_read(TWL4030_MODULE_INTBR, (u8 *)(&twl_idcode),
REG_IDCODE_7_0, 4);
if (err) {
pr_err("TWL4030: unable to read IDCODE -%d\n", err);
goto fail;
}

err = twl_i2c_write_u8(TWL4030_MODULE_INTBR, 0x0, REG_UNLOCK_TEST_REG);
if (err)
pr_err("TWL4030 Unable to relock IDCODE registers -%d\n", err);
fail:
return err;
}

/**
* twl_get_type - API to get TWL Si type.
*
* Api to get the TWL Si type from IDCODE value.
*/
int twl_get_type(void)
{
return TWL_SIL_TYPE(twl_idcode);
}
EXPORT_SYMBOL_GPL(twl_get_type);

/**
* twl_get_version - API to get TWL Si version.
*
* Api to get the TWL Si version from IDCODE value.
*/
int twl_get_version(void)
{
return TWL_SIL_REV(twl_idcode);
}
EXPORT_SYMBOL_GPL(twl_get_version);

static struct device *
add_numbered_child(unsigned chip, const char *name, int num,
void *pdata, unsigned pdata_len,
Expand Down Expand Up @@ -1014,6 +1069,7 @@ twl_probe(struct i2c_client *client, const struct i2c_device_id *id)
unsigned i;
struct twl4030_platform_data *pdata = client->dev.platform_data;
u8 temp;
int ret = 0;

if (!pdata) {
dev_dbg(&client->dev, "no platform data?\n");
Expand Down Expand Up @@ -1060,6 +1116,12 @@ twl_probe(struct i2c_client *client, const struct i2c_device_id *id)
/* setup clock framework */
clocks_init(&client->dev, pdata->clock);

/* read TWL IDCODE Register */
if (twl_id == TWL4030_CLASS_ID) {
ret = twl_read_idcode_register();
WARN(ret < 0, "Error: reading twl_idcode register value\n");
}

/* load power event scripts */
if (twl_has_power() && pdata->power)
twl4030_power_init(pdata->power);
Expand Down
17 changes: 16 additions & 1 deletion include/linux/i2c/twl.h
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,12 @@
#define MMC_PU (0x1 << 3)
#define MMC_PD (0x1 << 2)


#define TWL_SIL_TYPE(rev) ((rev) & 0x00FFFFFF)
#define TWL_SIL_REV(rev) ((rev) >> 24)
#define TWL_SIL_5030 0x09002F
#define TWL5030_REV_1_0 0x00
#define TWL5030_REV_1_1 0x10
#define TWL5030_REV_1_2 0x30

#define TWL4030_CLASS_ID 0x4030
#define TWL6030_CLASS_ID 0x6030
Expand Down Expand Up @@ -180,6 +185,9 @@ int twl_i2c_read_u8(u8 mod_no, u8 *val, u8 reg);
int twl_i2c_write(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes);
int twl_i2c_read(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes);

int twl_get_type(void);
int twl_get_version(void);

int twl6030_interrupt_unmask(u8 bit_mask, u8 offset);
int twl6030_interrupt_mask(u8 bit_mask, u8 offset);

Expand Down Expand Up @@ -279,7 +287,12 @@ static inline int twl6030_mmc_card_detect(struct device *dev, int slot)
*(Use TWL_4030_MODULE_INTBR)
*/

#define REG_IDCODE_7_0 0x00
#define REG_IDCODE_15_8 0x01
#define REG_IDCODE_16_23 0x02
#define REG_IDCODE_31_24 0x03
#define REG_GPPUPDCTR1 0x0F
#define REG_UNLOCK_TEST_REG 0x12

/*I2C1 and I2C4(SR) SDA/SCL pull-up control bits */

Expand All @@ -288,6 +301,8 @@ static inline int twl6030_mmc_card_detect(struct device *dev, int slot)
#define SR_I2C_SCL_CTRL_PU BIT(4)
#define SR_I2C_SDA_CTRL_PU BIT(6)

#define TWL_EEPROM_R_UNLOCK 0x49

/*----------------------------------------------------------------------*/

/*
Expand Down

0 comments on commit ca972d1

Please sign in to comment.