static unsigned int msm_bahama_core_config(int type) { int rc = 0; if (type == BAHAMA_ID) { int i; struct marimba config = { .mod_id = SLAVE_ID_BAHAMA}; const struct bahama_config_register v20_init[] = { /* reg, value, mask */ { 0xF4, 0x84, 0xFF }, /* AREG */ { 0xF0, 0x04, 0xFF } /* DREG */ }; if (marimba_read_bahama_ver(&config) == BAHAMA_VER_2_0) { for (i = 0; i < ARRAY_SIZE(v20_init); i++) { u8 value = v20_init[i].value; rc = marimba_write_bit_mask(&config, v20_init[i].reg, &value, sizeof(v20_init[i].value), v20_init[i].mask); if (rc < 0) { pr_err("%s: reg %d write failed: %d\n", __func__, v20_init[i].reg, rc); return rc; } pr_debug("%s: reg 0x%02x value 0x%02x" " mask 0x%02x\n", __func__, v20_init[i].reg, v20_init[i].value, v20_init[i].mask); } } }
static int adie_codec_write(u8 reg, u8 mask, u8 val) { int rc; rc = marimba_write_bit_mask(adie_codec.pdrv_ptr, reg, &val, 1, mask); if (IS_ERR_VALUE(rc)) { pr_err("%s: fail to write reg %x\n", __func__, reg); return -EIO; } pr_debug("%s: write reg %x val %x\n", __func__, reg, val); return 0; }
static int timpani_codec_write(struct snd_soc_codec *codec, unsigned int reg, unsigned int value) { struct marimba *pdrv = codec->control_data; int rc; rc = marimba_write_bit_mask(pdrv, reg, (u8 *)&value, 1, 0xFF); if (IS_ERR_VALUE(rc)) { pr_err("%s: fail to write reg %x\n", __func__, reg); return -EIO; } pr_debug("%s: write reg %x val %x\n", __func__, reg, value); return 0; }
static int adie_codec_write(u8 reg, u8 mask, u8 val) { int rc; /* Avoid to disable PA bias current when usb headset connected */ if (adie_codec.usb_state && reg == 0x33) { mask |= 0x8f; val |= 0x8f; } rc = marimba_write_bit_mask(adie_codec.pdrv_ptr, reg, &val, 1, mask); if (IS_ERR_VALUE(rc)) { pr_aud_err("%s: fail to write reg %x\n", __func__, reg); return -EIO; } pr_debug("%s: write reg %x val %x\n", __func__, reg, val); return 0; }
static int bahama_bt(int on) { int rc = 0; int i; struct marimba config = { .mod_id = SLAVE_ID_BAHAMA}; struct bahama_variant_register { const size_t size; const struct bahama_config_register *set; }; const struct bahama_config_register *p; u8 version; const struct bahama_config_register v10_bt_on[] = { { 0xE9, 0x00, 0xFF }, { 0xF4, 0x80, 0xFF }, { 0xE4, 0x00, 0xFF }, { 0xE5, 0x00, 0x0F }, #ifdef CONFIG_WLAN { 0xE6, 0x38, 0x7F }, { 0xE7, 0x06, 0xFF }, #endif { 0xE9, 0x21, 0xFF }, { 0x01, 0x0C, 0x1F }, { 0x01, 0x08, 0x1F }, }; const struct bahama_config_register v20_bt_on_fm_off[] = { { 0x11, 0x0C, 0xFF }, { 0x13, 0x01, 0xFF }, { 0xF4, 0x80, 0xFF }, { 0xF0, 0x00, 0xFF }, { 0xE9, 0x00, 0xFF }, #ifdef CONFIG_WLAN { 0x81, 0x00, 0x7F }, { 0x82, 0x00, 0xFF }, { 0xE6, 0x38, 0x7F }, { 0xE7, 0x06, 0xFF }, #endif { 0x8E, 0x15, 0xFF }, { 0x8F, 0x15, 0xFF }, { 0x90, 0x15, 0xFF }, { 0xE9, 0x21, 0xFF }, }; const struct bahama_config_register v20_bt_on_fm_on[] = { { 0x11, 0x0C, 0xFF }, { 0x13, 0x01, 0xFF }, { 0xF4, 0x86, 0xFF }, { 0xF0, 0x06, 0xFF }, { 0xE9, 0x00, 0xFF }, #ifdef CONFIG_WLAN { 0x81, 0x00, 0x7F }, { 0x82, 0x00, 0xFF }, { 0xE6, 0x38, 0x7F }, { 0xE7, 0x06, 0xFF }, #endif { 0xE9, 0x21, 0xFF }, }; const struct bahama_config_register v10_bt_off[] = { { 0xE9, 0x00, 0xFF }, }; const struct bahama_config_register v20_bt_off_fm_off[] = { { 0xF4, 0x84, 0xFF }, { 0xF0, 0x04, 0xFF }, { 0xE9, 0x00, 0xFF } }; const struct bahama_config_register v20_bt_off_fm_on[] = { { 0xF4, 0x86, 0xFF }, { 0xF0, 0x06, 0xFF }, { 0xE9, 0x00, 0xFF } }; const struct bahama_variant_register bt_bahama[2][3] = { { { ARRAY_SIZE(v10_bt_off), v10_bt_off }, { ARRAY_SIZE(v20_bt_off_fm_off), v20_bt_off_fm_off }, { ARRAY_SIZE(v20_bt_off_fm_on), v20_bt_off_fm_on } }, { { ARRAY_SIZE(v10_bt_on), v10_bt_on }, { ARRAY_SIZE(v20_bt_on_fm_off), v20_bt_on_fm_off }, { ARRAY_SIZE(v20_bt_on_fm_on), v20_bt_on_fm_on } } }; u8 offset = 0; /* index into bahama configs */ on = on ? 1 : 0; version = marimba_read_bahama_ver(&config); if ((int)version < 0 || version == BAHAMA_VER_UNSUPPORTED) { dev_err(&msm_bt_power_device.dev, "%s : Bahama " "version read Error, version = %d\n", __func__, version); return -EIO; } if (version == BAHAMA_VER_2_0) { if (marimba_get_fm_status(&config)) offset = 0x01; } p = bt_bahama[on][version + offset].set; dev_info(&msm_bt_power_device.dev, "%s: found version %d\n", __func__, version); for (i = 0; i < bt_bahama[on][version + offset].size; i++) { u8 value = (p+i)->value; rc = marimba_write_bit_mask(&config, (p+i)->reg, &value, sizeof((p+i)->value), (p+i)->mask); if (rc < 0) { dev_err(&msm_bt_power_device.dev, "%s: reg %x write failed: %d\n", __func__, (p+i)->reg, rc); return rc; } dev_dbg(&msm_bt_power_device.dev, "%s: reg 0x%02x write value 0x%02x mask 0x%02x\n", __func__, (p+i)->reg, value, (p+i)->mask); value = 0; rc = marimba_read_bit_mask(&config, (p+i)->reg, &value, sizeof((p+i)->value), (p+i)->mask); if (rc < 0) dev_err(&msm_bt_power_device.dev, "%s marimba_read_bit_mask- error", __func__); dev_dbg(&msm_bt_power_device.dev, "%s: reg 0x%02x read value 0x%02x mask 0x%02x\n", __func__, (p+i)->reg, value, (p+i)->mask); } /* Update BT Status */ if (on) marimba_set_bt_status(&config, true); else marimba_set_bt_status(&config, false); return rc; }
static int fm_radio_setup(struct marimba_fm_platform_data *pdata) { int rc = 0; const char *id = "FMPW"; uint32_t irqcfg; struct marimba config = { .mod_id = SLAVE_ID_BAHAMA}; u8 value; /* Voting for 1.8V Regulator */ fm_regulator = regulator_get(NULL , "msme1"); if (IS_ERR(fm_regulator)) { rc = PTR_ERR(fm_regulator); pr_err("%s: could not get regulator: %d\n", __func__, rc); goto out; } /* Set the voltage level to 1.8V */ rc = regulator_set_voltage(fm_regulator, 1800000, 1800000); if (rc < 0) { pr_err("%s: could not set voltage: %d\n", __func__, rc); goto reg_free; } /* Enabling the 1.8V regulator */ rc = regulator_enable(fm_regulator); if (rc) { pr_err("%s: could not enable regulator: %d\n", __func__, rc); goto reg_free; } /* Voting for 19.2MHz clock */ rc = pmapp_clock_vote(id, PMAPP_CLOCK_ID_D1, PMAPP_CLOCK_VOTE_ON); if (rc < 0) { pr_err("%s: clock vote failed with :(%d)\n", __func__, rc); goto reg_disable; } rc = bt_set_gpio(1); if (rc) { pr_err("%s: bt_set_gpio = %d", __func__, rc); goto gpio_deconfig; } /*re-write FM Slave Id, after reset*/ value = BAHAMA_SLAVE_ID_FM_ADDR; rc = marimba_write_bit_mask(&config, BAHAMA_SLAVE_ID_FM_REG, &value, 1, 0xFF); if (rc < 0) { pr_err("%s: FM Slave ID rewrite Failed = %d", __func__, rc); goto gpio_deconfig; } /* Configuring the FM GPIO */ irqcfg = GPIO_CFG(FM_GPIO, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA); rc = gpio_tlmm_config(irqcfg, GPIO_CFG_ENABLE); if (rc) { pr_err("%s: gpio_tlmm_config(%#x)=%d\n", __func__, irqcfg, rc); goto gpio_deconfig; } return 0; gpio_deconfig: pmapp_clock_vote(id, PMAPP_CLOCK_ID_D1, PMAPP_CLOCK_VOTE_OFF); bt_set_gpio(0); reg_disable: regulator_disable(fm_regulator); reg_free: regulator_put(fm_regulator); fm_regulator = NULL; out: return rc; };
int timpani_write(struct marimba *marimba, u8 reg, u8 *value, unsigned num_bytes) { return marimba_write_bit_mask(marimba, reg, value, num_bytes, 0xff); }