static void smb347_default_setback(void) { struct i2c_client *client = charger->client; int err; if(grouper_query_pcba_revision() > 0x02) { /* Enable volatile writes to registers */ err = smb347_volatile_writes(client, smb347_ENABLE_WRITE); if (err < 0) { dev_err(&client->dev, "%s() error in configuring charger..\n", __func__); } err = smb347_update_reg(client, smb347_PIN_CTRL, PIN_CTRL); if (err < 0) { dev_err(&client->dev, "%s: err %d\n", __func__, err); } err = smb347_update_reg(client, smb347_CHRG_CTRL, ENABLE_APSD); if (err < 0) { dev_err(&client->dev, "%s: err %d\n", __func__, err); } /* Disable volatile writes to registers */ err = smb347_volatile_writes(client, smb347_DISABLE_WRITE); if (err < 0) { dev_err(&client->dev, "%s() error in configuring charger..\n", __func__); } printk("grouper_query_pcba_revision=0x%02x\n", grouper_query_pcba_revision()); } }
int smb347_volatile_writes(struct i2c_client *client, uint8_t value) { int ret = 0; if (value == smb347_ENABLE_WRITE) { /* Enable volatile write to config registers */ ret = smb347_update_reg(client, smb347_CMD_REG, ENABLE_WRT_ACCESS); if (ret < 0) { dev_err(&client->dev, "%s(): Failed in writing" "register 0x%02x\n", __func__, smb347_CMD_REG); return ret; } } else { ret = smb347_read(client, smb347_CMD_REG); if (ret < 0) { dev_err(&client->dev, "%s: err %d\n", __func__, ret); return ret; } ret = smb347_write(client, smb347_CMD_REG, ret & (~(1<<7))); if (ret < 0) { dev_err(&client->dev, "%s: err %d\n", __func__, ret); return ret; } } return ret; }
static int smb347_pin_control(bool state) { struct i2c_client *client = charger->client; u8 ret = 0; mutex_lock(&charger->pinctrl_lock); if (state) { /*Pin Controls -active low */ ret = smb347_update_reg(client, smb347_PIN_CTRL, PIN_ACT_LOW); if (ret < 0) { dev_err(&client->dev, "%s(): Failed to" "enable charger\n", __func__); } } else { /*Pin Controls -active high */ ret = smb347_clear_reg(client, smb347_PIN_CTRL, PIN_ACT_LOW); if (ret < 0) { dev_err(&client->dev, "%s(): Failed to" "disable charger\n", __func__); } } mutex_unlock(&charger->pinctrl_lock); return ret; }
static int smb347_configure_charger(struct i2c_client *client, int value) { int ret = 0; /* Enable volatile writes to registers */ ret = smb347_volatile_writes(client, smb347_ENABLE_WRITE); if (ret < 0) { dev_err(&client->dev, "%s() error in configuring charger..\n", __func__); goto error; } if (value) { /* Enable charging */ ret = smb347_update_reg(client, smb347_CMD_REG, ENABLE_CHARGE); if (ret < 0) { dev_err(&client->dev, "%s(): Failed in writing register" "0x%02x\n", __func__, smb347_CMD_REG); goto error; } /* Configure THERM ctrl */ /* ret = smb347_update_reg(client, smb347_THERM_CTRL, THERM_CTRL); if (ret < 0) { dev_err(&client->dev, "%s: err %d\n", __func__, ret); goto error; } */ } else { /* Disable charging */ ret = smb347_read(client, smb347_CMD_REG); if (ret < 0) { dev_err(&client->dev, "%s: err %d\n", __func__, ret); goto error; } ret = smb347_write(client, smb347_CMD_REG, (ret & (~(1<<1)))); if (ret < 0) { dev_err(&client->dev, "%s: err %d\n", __func__, ret); goto error; } } /* Disable volatile writes to registers */ ret = smb347_volatile_writes(client, smb347_DISABLE_WRITE); if (ret < 0) { dev_err(&client->dev, "%s() error in configuring charger..\n", __func__); goto error; } error: return ret; }
static int smb347_configure_interrupts(struct i2c_client *client) { int ret = 0; /* Enable volatile writes to registers */ ret = smb347_volatile_writes(client, smb347_ENABLE_WRITE); if (ret < 0) { dev_err(&client->dev, "%s() error in configuring charger..\n", __func__); goto error; } /* Setting: Fault assert STAT IRQ */ ret = smb347_update_reg(client, smb347_FAULT_INTR, 0x00); if (ret < 0) { dev_err(&client->dev, "%s(): Failed in writing register" "0x%02x\n", __func__, smb347_CMD_REG); goto error; } /* Setting: Status assert STAT IRQ */ ret = smb347_update_reg(client, smb347_STS_INTR_1, 0x14); if (ret < 0) { dev_err(&client->dev, "%s: err %d\n", __func__, ret); goto error; } /* Disable volatile writes to registers */ ret = smb347_volatile_writes(client, smb347_DISABLE_WRITE); if (ret < 0) { dev_err(&client->dev, "%s() error in configuring charger..\n", __func__); goto error; } error: return ret; }
static int smb347_charger_enable(bool enable) { struct i2c_client *client = charger->client; u8 ret = 0; if (enable) { /*Pin Controls -active low */ ret = smb347_update_reg(client, smb347_PIN_CTRL, PIN_ACT_LOW); if (ret < 0) { dev_err(&client->dev, "%s(): Failed to" "enable charger\n", __func__); return ret; } } else { /*Pin Controls -active high */ ret = smb347_clear_reg(client, smb347_PIN_CTRL, PIN_ACT_LOW); if (ret < 0) { dev_err(&client->dev, "%s(): Failed to" "disable charger\n", __func__); return ret; } } return ret; }
static int smb347_configure_otg(struct i2c_client *client, int enable) { int ret = 0; /*Enable volatile writes to registers*/ ret = smb347_volatile_writes(client, smb347_ENABLE_WRITE); if (ret < 0) { dev_err(&client->dev, "%s error in configuring otg..\n", __func__); goto error; } if (enable) { /* Configure INOK to be active high */ ret = smb347_update_reg(client, smb347_SYSOK_USB3, 0x01); if (ret < 0) { dev_err(&client->dev, "%s: err %d\n", __func__, ret); goto error; } /* Change "OTG output current limit" to 250mA */ ret = smb347_read(client, smb347_OTG_TLIM_REG); if (ret < 0) { dev_err(&client->dev, "%s: err %d\n", __func__, ret); goto error; } ret = smb347_write(client, smb347_OTG_TLIM_REG, (ret & (~(1<<3)))); if (ret < 0) { dev_err(&client->dev, "%s: err %d\n", __func__, ret); goto error; } /* Enable OTG */ ret = smb347_update_reg(client, smb347_CMD_REG, 0x10); if (ret < 0) { dev_err(&client->dev, "%s: Failed in writing register" "0x%02x\n", __func__, smb347_CMD_REG); goto error; } /* Change "OTG output current limit" from 250mA to 750mA */ ret = smb347_update_reg(client, smb347_OTG_TLIM_REG, 0x08); if (ret < 0) { dev_err(&client->dev, "%s: Failed in writing register" "0x%02x\n", __func__, smb347_OTG_TLIM_REG); goto error; } } else { /* Disable OTG */ ret = smb347_read(client, smb347_CMD_REG); if (ret < 0) { dev_err(&client->dev, "%s: err %d\n", __func__, ret); goto error; } ret = smb347_write(client, smb347_CMD_REG, (ret & (~(1<<4)))); if (ret < 0) { dev_err(&client->dev, "%s: err %d\n", __func__, ret); goto error; } /* Configure INOK to be active low */ ret = smb347_read(client, smb347_SYSOK_USB3); if (ret < 0) { dev_err(&client->dev, "%s: err %d\n", __func__, ret); goto error; } ret = smb347_write(client, smb347_SYSOK_USB3, (ret & (~(1)))); if (ret < 0) { dev_err(&client->dev, "%s: err %d\n", __func__, ret); goto error; } } /* Disable volatile writes to registers */ ret = smb347_volatile_writes(client, smb347_DISABLE_WRITE); if (ret < 0) { dev_err(&client->dev, "%s error in configuring OTG..\n", __func__); goto error; } error: return ret; }
int smb347_hc_mode_callback(bool enable, int cur) { struct i2c_client *client = charger->client; u8 ret = 0; if((pcba_ver > GROUPER_PCBA_ER2) && (project_id == GROUPER_PROJECT_NAKASI)) return 0; if (charger->suspend_ongoing) return 0; printk("smb347_hc_mode_callback+\n"); /* Enable volatile writes to registers */ ret = smb347_volatile_writes(client, smb347_ENABLE_WRITE); if (ret < 0) { dev_err(&client->dev, "%s() error in configuring charger..\n", __func__); goto error; } if(enable) { /* Force switch to HC mode */ ret = smb347_update_reg(client, smb347_CMD_REG_B, HC_MODE); if (ret < 0) { dev_err(&client->dev, "%s(): Failed in writing" "register 0x%02x\n", __func__, smb347_CMD_REG_B); return ret; } /* Change to i2c register control */ ret = smb347_clear_reg(client, smb347_PIN_CTRL, PIN_CTRL); if (ret < 0) { dev_err(&client->dev, "%s(): Failed in writing" "register 0x%02x\n", __func__, smb347_PIN_CTRL); return ret; } } else { /* USB 2.0 input current limit (ICL) */ ret = smb347_clear_reg(client, smb347_SYSOK_USB3, USB_30); if (ret < 0) { dev_err(&client->dev, "%s(): Failed in writing" "register 0x%02x\n", __func__, smb347_SYSOK_USB3); return ret; } /* Switch back to USB mode */ ret = smb347_clear_reg(client, smb347_CMD_REG_B, HC_MODE); if (ret < 0) { dev_err(&client->dev, "%s(): Failed in writing" "register 0x%02x\n", __func__, smb347_CMD_REG_B); return ret; } if(cur) { /* USB 500mA */ ret = smb347_update_reg(client, smb347_CMD_REG_B, USB_5_9_CUR); if (ret < 0) { dev_err(&client->dev, "%s(): Failed in writing" "register 0x%02x\n", __func__, smb347_CMD_REG_B); return ret; } } else { /* USB 100mA */ ret = smb347_clear_reg(client, smb347_CMD_REG_B, USB_5_9_CUR); if (ret < 0) { dev_err(&client->dev, "%s(): Failed in writing" "register 0x%02x\n", __func__, smb347_CMD_REG_B); return ret; } } /* Disable auto power source detection (APSD) */ ret = smb347_clear_reg(client, smb347_CHRG_CTRL, ENABLE_APSD); if (ret < 0) { dev_err(&client->dev, "%s(): Failed in writing" "register 0x%02x\n", __func__, smb347_CHRG_CTRL); return ret; } /* Change to i2c register control */ ret = smb347_clear_reg(client, smb347_PIN_CTRL, PIN_CTRL); if (ret < 0) { dev_err(&client->dev, "%s(): Failed in writing" "register 0x%02x\n", __func__, smb347_PIN_CTRL); return ret; } } /* Disable volatile writes to registers */ ret = smb347_volatile_writes(client, smb347_DISABLE_WRITE); if (ret < 0) { dev_err(&client->dev, "%s() error in configuring charger..\n", __func__); goto error; } printk("smb347_hc_mode_callback-\n"); return ret; error: return ret; }