Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8203a06e authored by Vatsal Bucha's avatar Vatsal Bucha Committed by Gerrit - the friendly Code Review server
Browse files

ASoC: rouleur: Change hph and ear gain according to soc capacity



Register to power supply framework to get soc capacity.
Reduce ear and hph gain for reduced voltage to optimize
power consumption. Also set LD22 voltage to lower value
for low SoC.

Change-Id: I94de9341b8c7307128d3cd41c7398c31d57fa685
Signed-off-by: default avatarVatsal Bucha <vbucha@codeaurora.org>
parent ead188cb
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -232,6 +232,12 @@ static int bolero_cdc_update_wcd_event(void *handle, u16 event, u32 data)
				priv->component,
				BOLERO_MACRO_EVT_BCS_CLK_OFF, data);
		break;
	case WCD_BOLERO_EVT_RX_PA_GAIN_UPDATE:
		if (priv->macro_params[RX_MACRO].event_handler)
			priv->macro_params[RX_MACRO].event_handler(
				priv->component,
				BOLERO_MACRO_EVT_RX_PA_GAIN_UPDATE, data);
		break;
	default:
		dev_err(priv->dev, "%s: Invalid event %d trigger from wcd\n",
			__func__, event);
+1 −0
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ enum {
	BOLERO_MACRO_EVT_BCS_CLK_OFF,
	BOLERO_MACRO_EVT_SSR_GFMUX_UP,
	BOLERO_MACRO_EVT_PRE_SSR_UP,
	BOLERO_MACRO_EVT_RX_PA_GAIN_UPDATE,
};

enum {
+1 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ enum {
	WCD_BOLERO_EVT_IMPED_FALSE,  /* for imped false */
	WCD_BOLERO_EVT_RX_COMPANDER_SOFT_RST,
	WCD_BOLERO_EVT_BCS_CLK_OFF,
	WCD_BOLERO_EVT_RX_PA_GAIN_UPDATE,
};

struct wcd_ctrl_platform_data {
+49 −0
Original line number Diff line number Diff line
@@ -77,6 +77,11 @@ static const struct snd_kcontrol_new name##_mux = \
#define RX_MACRO_EC_MIX_TX1_MASK 0x0f
#define RX_MACRO_EC_MIX_TX2_MASK 0x0f

#define RX_MACRO_GAIN_MAX_VAL 0x28
#define RX_MACRO_GAIN_VAL_UNITY 0x0
/* Define macros to increase PA Gain by half */
#define RX_MACRO_MOD_GAIN (RX_MACRO_GAIN_VAL_UNITY + 6)

#define COMP_MAX_COEFF 25

struct wcd_imped_val {
@@ -452,6 +457,8 @@ struct rx_macro_priv {
	struct rx_macro_bcl_pmic_params bcl_pmic_params;
	u16 clk_id;
	u16 default_clk_id;
	int8_t rx0_gain_val;
	int8_t rx1_gain_val;
};

static struct snd_soc_dai_driver rx_macro_dai[];
@@ -1416,6 +1423,46 @@ static int rx_macro_event_handler(struct snd_soc_component *component,
	case BOLERO_MACRO_EVT_CLK_RESET:
		bolero_rsc_clk_reset(rx_dev, RX_CORE_CLK);
		break;
	case BOLERO_MACRO_EVT_RX_PA_GAIN_UPDATE:
		rx_priv->rx0_gain_val = snd_soc_component_read32(component,
					BOLERO_CDC_RX_RX0_RX_VOL_CTL);
		rx_priv->rx1_gain_val = snd_soc_component_read32(component,
					BOLERO_CDC_RX_RX1_RX_VOL_CTL);
		if (data) {
			/* Reduce gain by half only if its greater than -6DB */
			if ((rx_priv->rx0_gain_val >= RX_MACRO_GAIN_VAL_UNITY)
			&& (rx_priv->rx0_gain_val <= RX_MACRO_GAIN_MAX_VAL))
				snd_soc_component_update_bits(component,
					BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xFF,
					(rx_priv->rx0_gain_val -
					 RX_MACRO_MOD_GAIN));
			if ((rx_priv->rx1_gain_val >= RX_MACRO_GAIN_VAL_UNITY)
			&& (rx_priv->rx1_gain_val <= RX_MACRO_GAIN_MAX_VAL))
				snd_soc_component_update_bits(component,
					BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xFF,
					(rx_priv->rx1_gain_val -
					 RX_MACRO_MOD_GAIN));
		}
		else {
			/* Reset gain value to default */
			if ((rx_priv->rx0_gain_val >=
			    (RX_MACRO_GAIN_VAL_UNITY - RX_MACRO_MOD_GAIN)) &&
			    (rx_priv->rx0_gain_val <= (RX_MACRO_GAIN_MAX_VAL -
			    RX_MACRO_MOD_GAIN)))
				snd_soc_component_update_bits(component,
					BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xFF,
					(rx_priv->rx0_gain_val +
					 RX_MACRO_MOD_GAIN));
			if ((rx_priv->rx1_gain_val >=
			    (RX_MACRO_GAIN_VAL_UNITY - RX_MACRO_MOD_GAIN)) &&
			    (rx_priv->rx1_gain_val <= (RX_MACRO_GAIN_MAX_VAL -
			    RX_MACRO_MOD_GAIN)))
				snd_soc_component_update_bits(component,
					BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xFF,
					(rx_priv->rx1_gain_val +
					 RX_MACRO_MOD_GAIN));
		}
		break;
	}
done:
	return ret;
@@ -3825,6 +3872,8 @@ static int rx_macro_init(struct snd_soc_component *component)
		return ret;
	}
	rx_priv->dev_up = true;
	rx_priv->rx0_gain_val = 0;
	rx_priv->rx1_gain_val = 0;
	snd_soc_dapm_ignore_suspend(dapm, "RX_MACRO_AIF1 Playback");
	snd_soc_dapm_ignore_suspend(dapm, "RX_MACRO_AIF2 Playback");
	snd_soc_dapm_ignore_suspend(dapm, "RX_MACRO_AIF3 Playback");
+46 −0
Original line number Diff line number Diff line
@@ -172,6 +172,52 @@ bool msm_cdc_is_ondemand_supply(struct device *dev,
}
EXPORT_SYMBOL(msm_cdc_is_ondemand_supply);

/*
 * msm_cdc_set_supply_min_voltage:
 *	Set min supply voltage for particular supply
 *
 * @dev: pointer to codec device
 * @supplies: pointer to regulator bulk data
 * @cdc_vreg: pointer to platform regulator data
 * @num_supplies: number of supplies
 * @supply_name: Supply name to change voltage for
 * @vval_min: Min voltage to be set in uV
 * @override_min_vol: True if override min voltage from default
 * Return error code if unable to set voltage
 */
int msm_cdc_set_supply_min_voltage(struct device *dev,
				    struct regulator_bulk_data *supplies,
				    struct cdc_regulator *cdc_vreg,
				    int num_supplies, char *supply_name,
				    int vval_min, bool override_min_vol)
{
	int rc = 0, i;

	if ((!supply_name) || (!supplies)) {
		pr_err("%s: either dev or supplies or cdc_vreg is NULL\n",
				__func__);
		return -EINVAL;
	}
	/* input parameter validation */
	rc = msm_cdc_check_supply_param(dev, cdc_vreg, num_supplies);
	if (rc)
		return rc;
	for (i = 0; i < num_supplies; i++) {
		if (!strcmp(cdc_vreg[i].name, supply_name)) {
			if (override_min_vol)
				regulator_set_voltage(supplies[i].consumer,
					vval_min, cdc_vreg[i].max_uV);
			else
				regulator_set_voltage(supplies[i].consumer,
				    cdc_vreg[i].min_uV, cdc_vreg[i].max_uV);
			break;
		}
	}

	return rc;
}
EXPORT_SYMBOL(msm_cdc_set_supply_min_voltage);

/*
 * msm_cdc_disable_ondemand_supply:
 *	Disable codec ondemand supply
Loading