static int smb347_intr_sts(struct i2c_client *client) { int ret = 0; #define INOK 0x04 #define TERM_TAPER_CHG 0x10 // 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..enable\n", __func__); goto error; } ret = smb347_clear_reg(client, smb347_STS_INTR_1, (TERM_TAPER_CHG|INOK)); if (ret < 0) { dev_err(&client->dev, "%s(): Failed to" "clear STATUS Interrupt Register\n", __func__); } else { dev_notice(&client->dev, "%s(): Success to" "clear STATUS Interrupt Register\n", __func__); } // 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..disable\n", __func__); goto error; } error: return ret; }
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_battery_online(void) { int val, ret; struct i2c_client *client = charger->client; /* 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; } val = smb347_read(client, smb347_INTR_STS_B); if (val < 0) { dev_err(&client->dev, "%s(): Failed in reading register" "0x%02x\n", __func__, smb347_INTR_STS_B); return val; } if (val & BATTERY_MISSING) return 0; else return 1; /* 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_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_temp_limit_setting(void) { struct i2c_client *client = charger->client; int ret = 0, retval, val; /* 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; } val = smb347_read(client, smb347_HRD_SFT_TEMP); if (val < 0) { dev_err(&client->dev, "%s(): Failed in reading 0x%02x", __func__, smb347_HRD_SFT_TEMP); goto error; } val &= 0xcf; /* Set Hard Limit Hot Temperature 59 Degree */ ret = smb347_write(client, smb347_HRD_SFT_TEMP, val | 0x20); if (ret < 0) { dev_err(&client->dev, "%s(): Failed in writing 0x%02x to register" "0x%02x\n", __func__, val, smb347_HRD_SFT_TEMP); 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; } return 0; error: return -1; }
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; }
int smb347_charger_enable(bool state) { struct i2c_client *client = charger->client; u8 ret = 0; ret = smb347_volatile_writes(client, smb347_ENABLE_WRITE); if (ret < 0) { dev_err(&client->dev, "%s() error in configuring charger..\n", __func__); goto error; } charge_en_flag = state; smb347_pin_control(state); 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_set_InputCurrentlimit(struct i2c_client *client, u32 current_limit) { int ret = 0, retval; u8 setting = 0; if (charger->curr_limit == current_limit) return ret; wake_lock(&charger_wakelock); /* 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; } /* disable charger */ smb347_charger_enable(0); /* AICL disable */ retval = smb347_read(client, smb347_VRS_FUNC); if (retval < 0) { dev_err(&client->dev, "%s(): Failed in reading 0x%02x", __func__, smb347_VRS_FUNC); goto error; } setting = retval & (~(BIT(4))); printk(KERN_INFO "[charger] Disable AICL, retval=%x setting=%x\n", retval, setting); ret = smb347_write(client, smb347_VRS_FUNC, setting); if (ret < 0) { dev_err(&client->dev, "%s(): Failed in writing 0x%02x to register" "0x%02x\n", __func__, setting, smb347_VRS_FUNC); goto error; } /* set input current limit */ retval = smb347_read(client, smb347_CHRG_CRNTS); if (retval < 0) { dev_err(&client->dev, "%s(): Failed in reading 0x%02x", __func__, smb347_CHRG_CRNTS); goto error; } setting = retval & 0xF0; if (current_limit > 900) setting |= 0x06; else setting |= 0x03; printk(KERN_INFO "[charger] set cahrger limmit, limit=%u retval =%x setting=%x\n", current_limit, retval, setting); ret = smb347_write(client, smb347_CHRG_CRNTS, setting); if (ret < 0) { dev_err(&client->dev, "%s(): Failed in writing 0x%02x to register" "0x%02x\n", __func__, setting, smb347_CHRG_CRNTS); goto error; } if (current_limit > 900) { charger->time_of_1800mA_limit = jiffies; charger->curr_limit = 1800; } else{ charger->time_of_1800mA_limit = 0; charger->curr_limit = 900; } /* AICL enable */ retval = smb347_read(client, smb347_VRS_FUNC); if (retval < 0) { dev_err(&client->dev, "%s(): Failed in reading 0x%02x", __func__, smb347_VRS_FUNC); goto error; } setting = retval | BIT(4); printk(KERN_INFO "[charger] re-enable AICL, setting=%x\n", setting); msleep(20); ret = smb347_write(client, smb347_VRS_FUNC, setting); if (ret < 0) { dev_err(&client->dev, "%s(): Failed in writing 0x%02x to register" "0x%02x\n", __func__, setting, smb347_VRS_FUNC); goto error; } /* enable charger */ smb347_charger_enable(1); /* 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: wake_unlock(&charger_wakelock); 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; }