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

Commit 91d55e93 authored by Sudheer Papothi's avatar Sudheer Papothi
Browse files

ASoC: wsa881x: Update register cache while getting temperature



Temperature from wsa881x thermal zone sensor is not correct
when wsa881x codec is in suspend state. Bring codec out of
reset and update register cache to read proper temperature
value from thermal zone sensor.

Change-Id: I428ba35cbc10fd6c8ac80f6eb26f218466f44ebc
Signed-off-by: default avatarSudheer Papothi <spapothi@codeaurora.org>
parent da9777c8
Loading
Loading
Loading
Loading
+39 −1
Original line number Original line Diff line number Diff line
@@ -70,6 +70,11 @@ struct swr_port {
	u8 num_ch;
	u8 num_ch;
};
};


enum {
	WSA881X_DEV_DOWN,
	WSA881X_DEV_UP,
};

/*
/*
 * Private data Structure for wsa881x. All parameters related to
 * Private data Structure for wsa881x. All parameters related to
 * WSA881X codec needs to be defined here.
 * WSA881X codec needs to be defined here.
@@ -91,6 +96,7 @@ struct wsa881x_priv {
	struct mutex res_lock;
	struct mutex res_lock;
	struct snd_info_entry *entry;
	struct snd_info_entry *entry;
	struct snd_info_entry *version_entry;
	struct snd_info_entry *version_entry;
	int state;
};
};


#define SWR_SLV_MAX_REG_ADDR	0x390
#define SWR_SLV_MAX_REG_ADDR	0x390
@@ -833,6 +839,32 @@ static int32_t wsa881x_resource_acquire(struct snd_soc_codec *codec,
	return 0;
	return 0;
}
}


static int32_t wsa881x_thermal_resource_acquire(struct snd_soc_codec *codec,
						bool enable)
{
	struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
	struct swr_device *dev;
	u8 devnum = 0;

	if (!wsa881x) {
		dev_err(codec->dev, "%s: wsa881x is NULL\n", __func__);
		return -EINVAL;
	}
	dev = wsa881x->swr_slave;
	if (dev && (wsa881x->state == WSA881X_DEV_DOWN)) {
		if (swr_get_logical_dev_num(dev, dev->addr, &devnum)) {
			dev_err(codec->dev,
				"%s get devnum %d for dev addr %lx failed\n",
				__func__, devnum, dev->addr);
			return -EINVAL;
		}
		regcache_sync(wsa881x->regmap);
	}
	wsa881x_resource_acquire(codec, enable);

	return 0;
}

static int wsa881x_probe(struct snd_soc_codec *codec)
static int wsa881x_probe(struct snd_soc_codec *codec)
{
{
	struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
	struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
@@ -865,10 +897,12 @@ static int wsa881x_probe(struct snd_soc_codec *codec)
		"%s.%x", "wsatz", (u8)dev->addr);
		"%s.%x", "wsatz", (u8)dev->addr);
	wsa881x->bg_cnt = 0;
	wsa881x->bg_cnt = 0;
	wsa881x->clk_cnt = 0;
	wsa881x->clk_cnt = 0;
	wsa881x->state = WSA881X_DEV_UP;
	wsa881x->tz_pdata.codec = codec;
	wsa881x->tz_pdata.codec = codec;
	wsa881x->tz_pdata.dig_base = WSA881X_DIGITAL_BASE;
	wsa881x->tz_pdata.dig_base = WSA881X_DIGITAL_BASE;
	wsa881x->tz_pdata.ana_base = WSA881X_ANALOG_BASE;
	wsa881x->tz_pdata.ana_base = WSA881X_ANALOG_BASE;
	wsa881x->tz_pdata.wsa_resource_acquire = wsa881x_resource_acquire;
	wsa881x->tz_pdata.wsa_resource_acquire =
				wsa881x_thermal_resource_acquire;
	wsa881x_init_thermal(&wsa881x->tz_pdata);
	wsa881x_init_thermal(&wsa881x->tz_pdata);
	return ret;
	return ret;
}
}
@@ -1041,6 +1075,8 @@ static int wsa881x_swr_up(struct swr_device *pdev)
	ret = wsa881x_gpio_ctrl(wsa881x, true);
	ret = wsa881x_gpio_ctrl(wsa881x, true);
	if (ret)
	if (ret)
		dev_err(&pdev->dev, "%s: Failed to enable gpio\n", __func__);
		dev_err(&pdev->dev, "%s: Failed to enable gpio\n", __func__);
	else
		wsa881x->state = WSA881X_DEV_UP;


	return ret;
	return ret;
}
}
@@ -1059,6 +1095,8 @@ static int wsa881x_swr_down(struct swr_device *pdev)
	ret = wsa881x_gpio_ctrl(wsa881x, false);
	ret = wsa881x_gpio_ctrl(wsa881x, false);
	if (ret)
	if (ret)
		dev_err(&pdev->dev, "%s: Failed to disable gpio\n", __func__);
		dev_err(&pdev->dev, "%s: Failed to disable gpio\n", __func__);
	else
		wsa881x->state = WSA881X_DEV_DOWN;


	return ret;
	return ret;
}
}