static void arizona_start_mic(struct arizona_extcon_info *info) { struct arizona *arizona = info->arizona; bool change; int ret; info->detecting = true; info->mic = false; info->jack_flips = 0; /* Microphone detection can't use idle mode */ pm_runtime_get(info->dev); ret = regulator_enable(info->micvdd); if (ret != 0) { dev_err(arizona->dev, "Failed to enable MICVDD: %d\n", ret); } if (info->micd_reva) { regmap_write(arizona->regmap, 0x80, 0x3); regmap_write(arizona->regmap, 0x294, 0); regmap_write(arizona->regmap, 0x80, 0x0); } regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1, ARIZONA_MICD_ENA, ARIZONA_MICD_ENA, &change); if (!change) { regulator_disable(info->micvdd); pm_runtime_put_autosuspend(info->dev); } }
static void arizona_disable_fll(struct arizona_fll *fll) { struct arizona *arizona = fll->arizona; bool change; regmap_update_bits(arizona->regmap, fll->base + 1, ARIZONA_FLL1_FREERUN, ARIZONA_FLL1_FREERUN); regmap_update_bits_check(arizona->regmap, fll->base + 1, ARIZONA_FLL1_ENA, 0, &change); regmap_update_bits(arizona->regmap, fll->base + 0x11, ARIZONA_FLL1_SYNC_ENA, 0); if (change) pm_runtime_put_autosuspend(arizona->dev); }
static void arizona_stop_mic(struct arizona_extcon_info *info) { struct arizona *arizona = info->arizona; bool change; regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1, ARIZONA_MICD_ENA, 0, &change); if (info->micd_reva) { regmap_write(arizona->regmap, 0x80, 0x3); regmap_write(arizona->regmap, 0x294, 2); regmap_write(arizona->regmap, 0x80, 0x0); } if (change) { regulator_disable(info->micvdd); pm_runtime_put_autosuspend(info->dev); } }