Loading drivers/switch/switch-arizona.c +109 −58 Original line number Diff line number Diff line Loading @@ -418,7 +418,7 @@ static void arizona_extcon_hp_clamp(struct arizona_extcon_info *info, default: mask = 0; break; } }; arizona->hpdet_clamp = clamp; Loading @@ -443,30 +443,33 @@ static void arizona_extcon_hp_clamp(struct arizona_extcon_info *info, } if (mask) { if (info->accdet_ip == 1) { switch (info->accdet_ip) { case 0: ret = regmap_update_bits(arizona->regmap, MOON_HEADPHONE_DETECT_0, MOON_HPD_OVD_ENA_SEL_MASK, val); ARIZONA_HP_CTRL_1L, mask, val); if (ret != 0) dev_warn(arizona->dev, "Failed to do clamp: %d\n", ret); } else { ret = regmap_update_bits(arizona->regmap, ARIZONA_HP_CTRL_1L, mask, val); ARIZONA_HP_CTRL_1R, mask, val); if (ret != 0) dev_warn(arizona->dev, "Failed to do clamp: %d\n", ret); break; default: ret = regmap_update_bits(arizona->regmap, ARIZONA_HP_CTRL_1R, mask, val); MOON_HEADPHONE_DETECT_0, MOON_HPD_OVD_ENA_SEL_MASK, val); if (ret != 0) dev_warn(arizona->dev, "Failed to do clamp: %d\n", ret); break; } } /* Restore the desired state while not doing the clamp */ if (!clamp && (HOHM_TO_OHM(arizona->hp_impedance_x100) > if (!clamp && (arizona->hp_impedance > arizona->pdata.hpdet_short_circuit_imp) && !ep_sel) { ret = regmap_update_bits(arizona->regmap, ARIZONA_OUTPUT_ENABLES_1, Loading Loading @@ -580,7 +583,17 @@ static void arizona_extcon_set_mode(struct arizona_extcon_info *info, int mode) info->micd_modes[mode].gpio); } } if (info->accdet_ip == 1) { switch (info->accdet_ip) { case 0: regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1, ARIZONA_MICD_BIAS_SRC_MASK, info->micd_modes[mode].bias << ARIZONA_MICD_BIAS_SRC_SHIFT); regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1, ARIZONA_ACCDET_SRC, info->micd_modes[mode].src); break; default: regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1, MOON_MICD_BIAS_SRC_MASK, info->micd_modes[mode].bias << Loading @@ -597,14 +610,7 @@ static void arizona_extcon_set_mode(struct arizona_extcon_info *info, int mode) MOON_HP1_GND_SEL_MASK, info->micd_modes[mode].gnd << MOON_HP1_GND_SEL_SHIFT); } else { regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1, ARIZONA_MICD_BIAS_SRC_MASK, info->micd_modes[mode].bias << ARIZONA_MICD_BIAS_SRC_SHIFT); regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1, ARIZONA_ACCDET_SRC, info->micd_modes[mode].src); break; } info->micd_mode = mode; Loading Loading @@ -891,7 +897,10 @@ static int arizona_hpdet_read(struct arizona_extcon_info *info) return ret; } if (info->accdet_ip == 1) { switch (info->accdet_ip) { case 0: break; default: regmap_read(arizona->regmap, MOON_HEADPHONE_DETECT_0, &sense_pin); sense_pin = (sense_pin & MOON_HPD_SENSE_SEL_MASK) Loading @@ -904,6 +913,7 @@ static int arizona_hpdet_read(struct arizona_extcon_info *info) default: is_jdx_micdetx_pin = true; } break; } switch (info->hpdet_ip_version) { Loading Loading @@ -1462,6 +1472,44 @@ void arizona_set_headphone_imp(struct arizona_extcon_info *info, int imp) } EXPORT_SYMBOL_GPL(arizona_set_headphone_imp); static void arizona_hpdet_start_micd(struct arizona_extcon_info *info) { struct arizona *arizona = info->arizona; regmap_update_bits(arizona->regmap, MOON_MIC_DETECT_0, MOON_MICD1_ADC_MODE_MASK, MOON_MICD1_ADC_MODE_MASK); regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1, ARIZONA_MICD_BIAS_STARTTIME_MASK | ARIZONA_MICD_RATE_MASK | ARIZONA_MICD_DBTIME_MASK | ARIZONA_MICD_ENA, ARIZONA_MICD_ENA); } static void arizona_hpdet_stop_micd(struct arizona_extcon_info *info) { struct arizona *arizona = info->arizona; unsigned int start_time = 1, dbtime = 1, rate = 1; if (arizona->pdata.micd_bias_start_time) start_time = arizona->pdata.micd_bias_start_time; if (arizona->pdata.micd_rate) rate = arizona->pdata.micd_rate; if (arizona->pdata.micd_dbtime) dbtime = arizona->pdata.micd_dbtime; regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1, ARIZONA_MICD_BIAS_STARTTIME_MASK | ARIZONA_MICD_RATE_MASK | ARIZONA_MICD_DBTIME_MASK | ARIZONA_MICD_ENA, start_time << ARIZONA_MICD_BIAS_STARTTIME_SHIFT | rate << ARIZONA_MICD_RATE_SHIFT | dbtime << ARIZONA_MICD_DBTIME_SHIFT); } int arizona_hpdet_start(struct arizona_extcon_info *info) { struct arizona *arizona = info->arizona; Loading @@ -1483,7 +1531,20 @@ int arizona_hpdet_start(struct arizona_extcon_info *info) /* Make sure we keep the device enabled during the measurement */ pm_runtime_get_sync(info->dev); if (info->accdet_ip == 1) { switch (info->accdet_ip) { case 0: arizona_extcon_hp_clamp(info, true); ret = regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1, ARIZONA_ACCDET_MODE_MASK, info->state->mode); if (ret != 0) { dev_err(arizona->dev, "Failed to set HPDET mode (%d): %d\n", info->state->mode, ret); goto err; } break; default: if (info->state->mode == ARIZONA_ACCDET_MODE_HPL) { hpd_clamp = arizona->pdata.hpd_l_pins.clamp_pin; hpd_sense = arizona->pdata.hpd_l_pins.impd_pin; Loading Loading @@ -1511,17 +1572,7 @@ int arizona_hpdet_start(struct arizona_extcon_info *info) goto err; } arizona_extcon_hp_clamp(info, true); } else { arizona_extcon_hp_clamp(info, true); ret = regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1, ARIZONA_ACCDET_MODE_MASK, info->state->mode); if (ret != 0) { dev_err(arizona->dev, "Failed to set HPDET mode (%d): %d\n", info->state->mode, ret); goto err; } break; } ret = regmap_update_bits(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1, Loading Loading @@ -1570,11 +1621,15 @@ void arizona_hpdet_stop(struct arizona_extcon_info *info) ARIZONA_HP_IMPEDANCE_RANGE_MASK | ARIZONA_HP_POLL, 0); if (info->accdet_ip != 1) { switch (info->accdet_ip) { case 0: /* Reset to default mode */ regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1, ARIZONA_ACCDET_MODE_MASK, 0); break; default: break; } arizona_extcon_hp_clamp(info, false); Loading Loading @@ -1648,7 +1703,13 @@ int arizona_micd_start(struct arizona_extcon_info *info) mutex_unlock(&arizona->reg_setting_lock); } if (info->accdet_ip == 1) { switch (info->accdet_ip) { case 0: regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1, ARIZONA_ACCDET_MODE_MASK, info->state->mode); break; default: if (info->state->mode == ARIZONA_ACCDET_MODE_ADC) micd_mode = MOON_MICD1_ADC_MODE_MASK; else Loading @@ -1656,10 +1717,7 @@ int arizona_micd_start(struct arizona_extcon_info *info) regmap_update_bits(arizona->regmap, MOON_MIC_DETECT_0, MOON_MICD1_ADC_MODE_MASK, micd_mode); } else { regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1, ARIZONA_ACCDET_MODE_MASK, info->state->mode); break; } arizona_extcon_set_micd_bias(info, Loading Loading @@ -3154,6 +3212,8 @@ static int arizona_extcon_probe(struct platform_device *pdev) arizona->extcon_info = info; switch (arizona->type) { case WM8997: break; case WM5102: switch (arizona->rev) { case 0: Loading @@ -3165,6 +3225,11 @@ static int arizona_extcon_probe(struct platform_device *pdev) break; } break; case WM8998: case WM1814: info->micd_clamp = true; info->hpdet_ip_version = 2; break; case WM8280: case WM5110: switch (arizona->rev) { Loading @@ -3187,23 +3252,6 @@ static int arizona_extcon_probe(struct platform_device *pdev) default: info->micd_clamp = true; info->hpdet_ip_version = 2; break; } switch (arizona->type) { case WM5102: case WM5110: case WM8997: case WM8280: case WM8998: case WM1814: case WM8285: case WM1840: case WM1831: case CS47L24: info->accdet_ip = 0; break; default: info->accdet_ip = 1; break; } Loading Loading @@ -3232,13 +3280,16 @@ static int arizona_extcon_probe(struct platform_device *pdev) info->micd_modes = pdata->micd_configs; info->micd_num_modes = pdata->num_micd_configs; } else { if (info->accdet_ip == 1) { switch (info->accdet_ip) { case 0: info->micd_modes = micd_default_modes; info->micd_num_modes = ARRAY_SIZE(micd_default_modes); break; default: info->micd_modes = moon_micd_default_modes; info->micd_num_modes = ARRAY_SIZE(moon_micd_default_modes); } else { info->micd_modes = micd_default_modes; info->micd_num_modes = ARRAY_SIZE(micd_default_modes); break; } } Loading Loading
drivers/switch/switch-arizona.c +109 −58 Original line number Diff line number Diff line Loading @@ -418,7 +418,7 @@ static void arizona_extcon_hp_clamp(struct arizona_extcon_info *info, default: mask = 0; break; } }; arizona->hpdet_clamp = clamp; Loading @@ -443,30 +443,33 @@ static void arizona_extcon_hp_clamp(struct arizona_extcon_info *info, } if (mask) { if (info->accdet_ip == 1) { switch (info->accdet_ip) { case 0: ret = regmap_update_bits(arizona->regmap, MOON_HEADPHONE_DETECT_0, MOON_HPD_OVD_ENA_SEL_MASK, val); ARIZONA_HP_CTRL_1L, mask, val); if (ret != 0) dev_warn(arizona->dev, "Failed to do clamp: %d\n", ret); } else { ret = regmap_update_bits(arizona->regmap, ARIZONA_HP_CTRL_1L, mask, val); ARIZONA_HP_CTRL_1R, mask, val); if (ret != 0) dev_warn(arizona->dev, "Failed to do clamp: %d\n", ret); break; default: ret = regmap_update_bits(arizona->regmap, ARIZONA_HP_CTRL_1R, mask, val); MOON_HEADPHONE_DETECT_0, MOON_HPD_OVD_ENA_SEL_MASK, val); if (ret != 0) dev_warn(arizona->dev, "Failed to do clamp: %d\n", ret); break; } } /* Restore the desired state while not doing the clamp */ if (!clamp && (HOHM_TO_OHM(arizona->hp_impedance_x100) > if (!clamp && (arizona->hp_impedance > arizona->pdata.hpdet_short_circuit_imp) && !ep_sel) { ret = regmap_update_bits(arizona->regmap, ARIZONA_OUTPUT_ENABLES_1, Loading Loading @@ -580,7 +583,17 @@ static void arizona_extcon_set_mode(struct arizona_extcon_info *info, int mode) info->micd_modes[mode].gpio); } } if (info->accdet_ip == 1) { switch (info->accdet_ip) { case 0: regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1, ARIZONA_MICD_BIAS_SRC_MASK, info->micd_modes[mode].bias << ARIZONA_MICD_BIAS_SRC_SHIFT); regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1, ARIZONA_ACCDET_SRC, info->micd_modes[mode].src); break; default: regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1, MOON_MICD_BIAS_SRC_MASK, info->micd_modes[mode].bias << Loading @@ -597,14 +610,7 @@ static void arizona_extcon_set_mode(struct arizona_extcon_info *info, int mode) MOON_HP1_GND_SEL_MASK, info->micd_modes[mode].gnd << MOON_HP1_GND_SEL_SHIFT); } else { regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1, ARIZONA_MICD_BIAS_SRC_MASK, info->micd_modes[mode].bias << ARIZONA_MICD_BIAS_SRC_SHIFT); regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1, ARIZONA_ACCDET_SRC, info->micd_modes[mode].src); break; } info->micd_mode = mode; Loading Loading @@ -891,7 +897,10 @@ static int arizona_hpdet_read(struct arizona_extcon_info *info) return ret; } if (info->accdet_ip == 1) { switch (info->accdet_ip) { case 0: break; default: regmap_read(arizona->regmap, MOON_HEADPHONE_DETECT_0, &sense_pin); sense_pin = (sense_pin & MOON_HPD_SENSE_SEL_MASK) Loading @@ -904,6 +913,7 @@ static int arizona_hpdet_read(struct arizona_extcon_info *info) default: is_jdx_micdetx_pin = true; } break; } switch (info->hpdet_ip_version) { Loading Loading @@ -1462,6 +1472,44 @@ void arizona_set_headphone_imp(struct arizona_extcon_info *info, int imp) } EXPORT_SYMBOL_GPL(arizona_set_headphone_imp); static void arizona_hpdet_start_micd(struct arizona_extcon_info *info) { struct arizona *arizona = info->arizona; regmap_update_bits(arizona->regmap, MOON_MIC_DETECT_0, MOON_MICD1_ADC_MODE_MASK, MOON_MICD1_ADC_MODE_MASK); regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1, ARIZONA_MICD_BIAS_STARTTIME_MASK | ARIZONA_MICD_RATE_MASK | ARIZONA_MICD_DBTIME_MASK | ARIZONA_MICD_ENA, ARIZONA_MICD_ENA); } static void arizona_hpdet_stop_micd(struct arizona_extcon_info *info) { struct arizona *arizona = info->arizona; unsigned int start_time = 1, dbtime = 1, rate = 1; if (arizona->pdata.micd_bias_start_time) start_time = arizona->pdata.micd_bias_start_time; if (arizona->pdata.micd_rate) rate = arizona->pdata.micd_rate; if (arizona->pdata.micd_dbtime) dbtime = arizona->pdata.micd_dbtime; regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1, ARIZONA_MICD_BIAS_STARTTIME_MASK | ARIZONA_MICD_RATE_MASK | ARIZONA_MICD_DBTIME_MASK | ARIZONA_MICD_ENA, start_time << ARIZONA_MICD_BIAS_STARTTIME_SHIFT | rate << ARIZONA_MICD_RATE_SHIFT | dbtime << ARIZONA_MICD_DBTIME_SHIFT); } int arizona_hpdet_start(struct arizona_extcon_info *info) { struct arizona *arizona = info->arizona; Loading @@ -1483,7 +1531,20 @@ int arizona_hpdet_start(struct arizona_extcon_info *info) /* Make sure we keep the device enabled during the measurement */ pm_runtime_get_sync(info->dev); if (info->accdet_ip == 1) { switch (info->accdet_ip) { case 0: arizona_extcon_hp_clamp(info, true); ret = regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1, ARIZONA_ACCDET_MODE_MASK, info->state->mode); if (ret != 0) { dev_err(arizona->dev, "Failed to set HPDET mode (%d): %d\n", info->state->mode, ret); goto err; } break; default: if (info->state->mode == ARIZONA_ACCDET_MODE_HPL) { hpd_clamp = arizona->pdata.hpd_l_pins.clamp_pin; hpd_sense = arizona->pdata.hpd_l_pins.impd_pin; Loading Loading @@ -1511,17 +1572,7 @@ int arizona_hpdet_start(struct arizona_extcon_info *info) goto err; } arizona_extcon_hp_clamp(info, true); } else { arizona_extcon_hp_clamp(info, true); ret = regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1, ARIZONA_ACCDET_MODE_MASK, info->state->mode); if (ret != 0) { dev_err(arizona->dev, "Failed to set HPDET mode (%d): %d\n", info->state->mode, ret); goto err; } break; } ret = regmap_update_bits(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1, Loading Loading @@ -1570,11 +1621,15 @@ void arizona_hpdet_stop(struct arizona_extcon_info *info) ARIZONA_HP_IMPEDANCE_RANGE_MASK | ARIZONA_HP_POLL, 0); if (info->accdet_ip != 1) { switch (info->accdet_ip) { case 0: /* Reset to default mode */ regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1, ARIZONA_ACCDET_MODE_MASK, 0); break; default: break; } arizona_extcon_hp_clamp(info, false); Loading Loading @@ -1648,7 +1703,13 @@ int arizona_micd_start(struct arizona_extcon_info *info) mutex_unlock(&arizona->reg_setting_lock); } if (info->accdet_ip == 1) { switch (info->accdet_ip) { case 0: regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1, ARIZONA_ACCDET_MODE_MASK, info->state->mode); break; default: if (info->state->mode == ARIZONA_ACCDET_MODE_ADC) micd_mode = MOON_MICD1_ADC_MODE_MASK; else Loading @@ -1656,10 +1717,7 @@ int arizona_micd_start(struct arizona_extcon_info *info) regmap_update_bits(arizona->regmap, MOON_MIC_DETECT_0, MOON_MICD1_ADC_MODE_MASK, micd_mode); } else { regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1, ARIZONA_ACCDET_MODE_MASK, info->state->mode); break; } arizona_extcon_set_micd_bias(info, Loading Loading @@ -3154,6 +3212,8 @@ static int arizona_extcon_probe(struct platform_device *pdev) arizona->extcon_info = info; switch (arizona->type) { case WM8997: break; case WM5102: switch (arizona->rev) { case 0: Loading @@ -3165,6 +3225,11 @@ static int arizona_extcon_probe(struct platform_device *pdev) break; } break; case WM8998: case WM1814: info->micd_clamp = true; info->hpdet_ip_version = 2; break; case WM8280: case WM5110: switch (arizona->rev) { Loading @@ -3187,23 +3252,6 @@ static int arizona_extcon_probe(struct platform_device *pdev) default: info->micd_clamp = true; info->hpdet_ip_version = 2; break; } switch (arizona->type) { case WM5102: case WM5110: case WM8997: case WM8280: case WM8998: case WM1814: case WM8285: case WM1840: case WM1831: case CS47L24: info->accdet_ip = 0; break; default: info->accdet_ip = 1; break; } Loading Loading @@ -3232,13 +3280,16 @@ static int arizona_extcon_probe(struct platform_device *pdev) info->micd_modes = pdata->micd_configs; info->micd_num_modes = pdata->num_micd_configs; } else { if (info->accdet_ip == 1) { switch (info->accdet_ip) { case 0: info->micd_modes = micd_default_modes; info->micd_num_modes = ARRAY_SIZE(micd_default_modes); break; default: info->micd_modes = moon_micd_default_modes; info->micd_num_modes = ARRAY_SIZE(moon_micd_default_modes); } else { info->micd_modes = micd_default_modes; info->micd_num_modes = ARRAY_SIZE(micd_default_modes); break; } } Loading