Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}