static void max97236_jack_event(struct max97236_priv *max97236) { unsigned int status_reg[3]; regmap_read(max97236->regmap, M97236_REG_00_STATUS1, &status_reg[0]); regmap_read(max97236->regmap, M97236_REG_01_STATUS2, &status_reg[1]); /* Key press or jack removal? */ if ((status_reg[0] & M97236_IMBH_MASK) || (status_reg[0] & M97236_IMCSW_MASK) || (status_reg[1] & M97236_IKEY_MASK)) { max97236_keypress(max97236, status_reg); } else { if (max97236_jacksw_active(max97236)) goto max97236_jack_event_10; regmap_update_bits(max97236->regmap, M97236_REG_07_LEFT_VOLUME, M97236_MUTEL_MASK, M97236_MUTEL_MASK); regmap_update_bits(max97236->regmap, M97236_REG_08_RIGHT_VOLUME, M97236_MUTER_MASK, M97236_MUTER_MASK); regmap_write(max97236->regmap, M97236_REG_19_STATE_FORCING, M97236_STATE_FLOAT); regmap_update_bits(max97236->regmap, M97236_REG_1D_ENABLE_1, M97236_SHDNN_MASK, 0); status_reg[0] = 0; status_reg[1] = 0; status_reg[2] = 0; max97236_report_jack_state(max97236, status_reg); } max97236_jack_event_10: max97236_configure_for_detection(max97236, M97236_AUTO_MODE_0); return; }
static void max97236_jack_event(struct max97236_priv *max97236) { unsigned int status_reg[3]; int count; regmap_read(max97236->regmap, M97236_REG_00_STATUS1, &status_reg[0]); regmap_read(max97236->regmap, M97236_REG_01_STATUS2, &status_reg[1]); /* First check for a key press */ if (((status_reg[0] & M97236_IMBH_MASK) || (status_reg[0] & M97236_IMCSW_MASK) || (status_reg[1] & M97236_IKEY_MASK)) && (status_reg[0] & 0x80)) { max97236_keypress(max97236, status_reg); } else { if (max97236_jacksw_active(max97236)) goto max97236_jack_event_10; count = 30; do { msleep(20); regmap_read(max97236->regmap, M97236_REG_00_STATUS1, &status_reg[0]); } while (((status_reg[0] & 0x80) == 0x80) && --count); regmap_read(max97236->regmap, M97236_REG_00_STATUS1, &status_reg[0]); regmap_read(max97236->regmap, M97236_REG_01_STATUS2, &status_reg[1]); regmap_read(max97236->regmap, M97236_REG_02_STATUS3, &status_reg[2]); /* test for jack switch malfunction indication */ if ((status_reg[1] & M97236_IJACKSWINC_MASK) && (status_reg[0] & 0x80)) pr_err("JACKSWINC set\n"); max97236_report_jack_state(max97236, status_reg); if (max97236->jack_state == M97236_JACK_STATE_NONE) { regmap_update_bits(max97236->regmap, M97236_REG_07_LEFT_VOLUME, M97236_MUTEL_MASK, M97236_MUTEL_MASK); regmap_update_bits(max97236->regmap, M97236_REG_08_RIGHT_VOLUME, M97236_MUTER_MASK, M97236_MUTER_MASK); regmap_update_bits(max97236->regmap, M97236_REG_1D_ENABLE_1, M97236_SHDNN_MASK, 0); } } max97236_jack_event_10: max97236_configure_for_detection(max97236, M97236_AUTO_MODE_1); return; }
static void max97236_jack_event(struct max97236_priv *max97236) { unsigned int status_reg[3]; int i; int test_value = 0; wake_lock(&wakelock_h); regmap_read(max97236->regmap, M97236_REG_00_STATUS1, &status_reg[0]); regmap_read(max97236->regmap, M97236_REG_01_STATUS2, &status_reg[1]); /* Overwrite above code using board id */ if (board_info.board_id == BOARD_E1690) { test_value = 0; } else { /* ERS */ test_value = 4; } /* Key press or jack removal? */ /* For Key press, it need make sure it is headset connected */ for (i = 0; i < 4; i++) { if ((status_reg[0] & M97236_JACKSW_MASK) == test_value) { break; } else { msleep(20); regmap_read(max97236->regmap, M97236_REG_00_STATUS1, &status_reg[0]); regmap_read(max97236->regmap, M97236_REG_01_STATUS2, &status_reg[1]); } } if (((status_reg[0] & M97236_IMBH_MASK) || (status_reg[0] & M97236_IMCSW_MASK) || (status_reg[1] & M97236_IKEY_MASK)) && (status_reg[0] & M97236_JACKSW_MASK) == test_value) { /* headset detect feature WJ 21/01/14 */ if (max97236_jacksw_active(max97236)){ max97236_keypress(max97236, status_reg); }else{ regmap_update_bits(max97236->regmap, M97236_REG_07_LEFT_VOLUME, M97236_MUTEL_MASK, M97236_MUTEL_MASK); regmap_update_bits(max97236->regmap, M97236_REG_08_RIGHT_VOLUME, M97236_MUTER_MASK, M97236_MUTER_MASK); regmap_write(max97236->regmap, M97236_REG_23_TEST_DATA_3, 0x00); regmap_write(max97236->regmap, M97236_REG_19_STATE_FORCING, M97236_STATE_FLOAT); regmap_update_bits(max97236->regmap, M97236_REG_1D_ENABLE_1, M97236_SHDNN_MASK, 0); status_reg[0] = 0; status_reg[1] = 0; status_reg[2] = 0; max97236_report_jack_state(max97236, status_reg); } /* headset detect feature WJ 21/01/14 end*/ } else { if (max97236_jacksw_active(max97236)) goto max97236_jack_event_10; regmap_update_bits(max97236->regmap, M97236_REG_07_LEFT_VOLUME, M97236_MUTEL_MASK, M97236_MUTEL_MASK); regmap_update_bits(max97236->regmap, M97236_REG_08_RIGHT_VOLUME, M97236_MUTER_MASK, M97236_MUTER_MASK); regmap_write(max97236->regmap, M97236_REG_23_TEST_DATA_3, 0x00); regmap_write(max97236->regmap, M97236_REG_19_STATE_FORCING, M97236_STATE_FLOAT); if (verbosity) pr_info("%s: M97236_STATE_FLOAT set\n", __func__); regmap_update_bits(max97236->regmap, M97236_REG_1D_ENABLE_1, M97236_SHDNN_MASK, 0); status_reg[0] = 0; status_reg[1] = 0; status_reg[2] = 0; max97236_report_jack_state(max97236, status_reg); } max97236_jack_event_10: max97236_configure_for_detection(max97236, M97236_AUTO_MODE_0); wake_unlock(&wakelock_h); return; }