dm: sound: max98095: Split out interface setup code

With driver model we want to do a minimal probe when the device is probed
and then set up the codec interface later when a sound is actully played.

Split this setup code out into its own function to help with this.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2018-12-03 04:37:28 -07:00
parent cfbe7623d6
commit 82a27d2c8c

View file

@ -384,12 +384,14 @@ static int max98095_reset(struct max98095_priv *priv)
* *
* @returns -1 for error and 0 Success. * @returns -1 for error and 0 Success.
*/ */
static int max98095_device_init(struct max98095_priv *priv, static int max98095_device_init(struct max98095_priv *priv)
enum en_max_audio_interface aif_id)
{ {
unsigned char id; unsigned char id;
int error = 0; int error = 0;
/* Enable codec clock */
set_xclkout();
/* reset the codec, the DSP core, and disable all interrupts */ /* reset the codec, the DSP core, and disable all interrupts */
error = max98095_reset(priv); error = max98095_reset(priv);
if (error != 0) { if (error != 0) {
@ -406,11 +408,19 @@ static int max98095_device_init(struct max98095_priv *priv,
if (error < 0) { if (error < 0) {
debug("%s: Failure reading hardware revision: %d\n", debug("%s: Failure reading hardware revision: %d\n",
__func__, id); __func__, id);
goto err_access; return error;
} }
debug("%s: Hardware revision: %c\n", __func__, (id - 0x40) + 'A'); debug("%s: Hardware revision: %c\n", __func__, (id - 0x40) + 'A');
error |= max98095_i2c_write(priv, M98095_097_PWR_SYS, M98095_PWRSV); return 0;
}
static int max98095_setup_interface(struct max98095_priv *priv,
enum en_max_audio_interface aif_id)
{
int error;
error = max98095_i2c_write(priv, M98095_097_PWR_SYS, M98095_PWRSV);
/* /*
* initialize registers to hardware default configuring audio * initialize registers to hardware default configuring audio
@ -463,7 +473,6 @@ static int max98095_device_init(struct max98095_priv *priv,
else else
error |= max98095_i2c_write(priv, M98095_096_PWR_DAC_CK, 0x07); error |= max98095_i2c_write(priv, M98095_096_PWR_DAC_CK, 0x07);
err_access:
if (error < 0) if (error < 0)
return -1; return -1;
@ -477,13 +486,7 @@ static int max98095_do_init(struct sound_codec_info *pcodec_info,
{ {
int ret = 0; int ret = 0;
/* Enable codec clock */ ret = max98095_setup_interface(&g_max98095_info, aif_id);
set_xclkout();
/* shift the device address by 1 for 7 bit addressing */
g_max98095_i2c_dev_addr = pcodec_info->i2c_dev_addr >> 1;
ret = max98095_device_init(&g_max98095_info, aif_id);
if (ret < 0) { if (ret < 0) {
debug("%s: max98095 codec chip init failed\n", __func__); debug("%s: max98095 codec chip init failed\n", __func__);
return ret; return ret;
@ -569,6 +572,15 @@ int max98095_init(const void *blob, enum en_max_audio_interface aif_id,
} }
i2c_set_bus_num(pcodec_info->i2c_bus); i2c_set_bus_num(pcodec_info->i2c_bus);
/* shift the device address by 1 for 7 bit addressing */
g_max98095_i2c_dev_addr = pcodec_info->i2c_dev_addr >> 1;
ret = max98095_device_init(&g_max98095_info);
if (ret < 0) {
debug("%s: max98095 codec chip init failed\n", __func__);
return ret;
}
ret = max98095_do_init(pcodec_info, aif_id, sampling_rate, mclk_freq, ret = max98095_do_init(pcodec_info, aif_id, sampling_rate, mclk_freq,
bits_per_sample); bits_per_sample);
i2c_set_bus_num(old_bus); i2c_set_bus_num(old_bus);