static int max98505_dai_set_fmt(struct snd_soc_dai *codec_dai,
				 unsigned int fmt)
{
	struct snd_soc_codec *codec = codec_dai->codec;
	struct max98505_priv *max98505 = snd_soc_codec_get_drvdata(codec);
	struct max98505_cdata *cdata;
	unsigned int invert = 0;

	pr_info("%s: fmt 0x%08X\n", __func__, fmt);

	cdata = &max98505->dai[0];

	cdata->fmt = fmt;

	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
	case SND_SOC_DAIFMT_CBS_CFS:
		max98505_set_slave(max98505);
		break;
	case SND_SOC_DAIFMT_CBM_CFM:
		max98505_set_master(max98505);
		break;
	case SND_SOC_DAIFMT_CBS_CFM:
	case SND_SOC_DAIFMT_CBM_CFS:
	default:
		dev_err(codec->dev, "DAI clock mode unsupported");
		return -EINVAL;
	}

	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
	case SND_SOC_DAIFMT_I2S:
		pr_info("%s: set SND_SOC_DAIFMT_I2S\n", __func__);
		break;
	case SND_SOC_DAIFMT_LEFT_J:
		pr_info("%s: set SND_SOC_DAIFMT_LEFT_J\n", __func__);
		break;
	case SND_SOC_DAIFMT_DSP_A:
		pr_info("%s: set SND_SOC_DAIFMT_DSP_A\n", __func__);
	default:
		dev_err(codec->dev, "DAI format unsupported, fmt:0x%x skip", fmt);
		//return -EINVAL;   //temp block
	}

	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
	case SND_SOC_DAIFMT_NB_NF:
		break;
	case SND_SOC_DAIFMT_NB_IF:
		invert = M98505_DAI_WCI_MASK;
		break;
	case SND_SOC_DAIFMT_IB_NF:
		invert = M98505_DAI_BCI_MASK;
		break;
	case SND_SOC_DAIFMT_IB_IF:
		invert = M98505_DAI_BCI_MASK | M98505_DAI_WCI_MASK;
		break;
	default:
		dev_err(codec->dev, "DAI invert mode unsupported skip");
		//return -EINVAL;
	}

	regmap_update_bits(max98505->regmap, MAX98505_R020_FORMAT,
			M98505_DAI_BCI_MASK | M98505_DAI_BCI_MASK, invert);

	return 0;
}
static int max98505_probe(struct snd_soc_codec *codec)
{
	struct max98505_priv *max98505 = snd_soc_codec_get_drvdata(codec);
	struct max98505_pdata *pdata = max98505->pdata;
	struct max98505_cdata *cdata;
	int ret = 0;
	int reg = 0;

	dev_info(codec->dev, "build number %s\n", MAX98505_REVISION);

	max98505->codec = codec;
	codec->control_data = max98505->regmap;

	ret = snd_soc_codec_set_cache_io(codec, 8, 8, SND_SOC_I2C);
	if (ret != 0) {
		dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
		return ret;
	}

	max98505->sysclk = pdata->sysclk;
	max98505->volume = pdata->spk_vol;

	cdata = &max98505->dai[0];
	cdata->rate = (unsigned)-1;
	cdata->fmt  = (unsigned)-1;

	reg = 0;
	ret = regmap_read(max98505->regmap, MAX98505_R0FF_VERSION, &reg);
	if ((ret < 0) || ((reg != MAX98505_VERSION)
		&& (reg != MAX98505_VERSION1)
		&& (reg != MAX98505_VERSION2)
		&& (reg != MAX98505_VERSION3))) {
		dev_err(codec->dev,
				"device initialization error (%d 0x%02X)\n",
				ret,
				reg);
		goto err_version;
	}
	msg_maxim("device version 0x%02x", reg);

	regmap_write(max98505->regmap, MAX98505_R038_GLOBAL_ENABLE, 0x00);

	/* It's not the default but we need to set DAI_DLY */
	regmap_write(max98505->regmap, MAX98505_R020_FORMAT,
			MAX98505_DAI_DLY_MASK);

	regmap_write(max98505->regmap, MAX98505_R021_TDM_SLOT_SELECT, 0xC8);

	regmap_write(max98505->regmap, MAX98505_R027_DOUT_HIZ_CFG1, 0xFF);
	regmap_write(max98505->regmap, MAX98505_R028_DOUT_HIZ_CFG2, 0xFF);
	regmap_write(max98505->regmap, MAX98505_R029_DOUT_HIZ_CFG3, 0xFF);
	regmap_write(max98505->regmap, MAX98505_R02A_DOUT_HIZ_CFG4, 0xF0);

	regmap_write(max98505->regmap, MAX98505_R02C_FILTERS, 0xD9);
	regmap_write(max98505->regmap, MAX98505_R034_ALC_CONFIGURATION, 0x12);

	/* Set boost output to maximum */
	regmap_write(max98505->regmap, MAX98505_R037_CONFIGURATION, 0x00);

	/* Disable ALC muting */
	regmap_write(max98505->regmap, MAX98505_R03A_BOOST_LIMITER, 0xF8);

	regmap_update_bits(max98505->regmap,
			MAX98505_R02D_GAIN, MAX98505_DAC_IN_SEL_MASK,
			MAX98505_DAC_IN_SEL_DIV2_SUMMED_DAI);

	/* Enable ADC */
	regmap_update_bits(max98505->regmap,
			MAX98505_R036_BLOCK_ENABLE,
			MAX98505_ADC_VIMON_EN_MASK,
			MAX98505_ADC_VIMON_EN_MASK);
	pdata->vstep.adc_status = 1;

	max98505_set_slave(max98505);
	max98505_handle_pdata(codec);
	max98505_add_widgets(codec);

#if defined(USE_DSM_LOG) || defined(USE_DSM_UPDATE_CAL)
	if (!g_class)
		g_class = class_create(THIS_MODULE, class_name_log);
	max98505->dev_log_class = g_class;
	if (max98505->dev_log_class) {
		max98505->dev_log =
			device_create(max98505->dev_log_class,
					NULL, 1, NULL, "max98505");
		if (IS_ERR(max98505->dev_log)) {
			ret = sysfs_create_group(&codec->dev->kobj,
				&max98505_attribute_group);
			if (ret)
				msg_maxim(
				"failed to create sysfs group [%d]", ret);
		} else {
			ret = sysfs_create_group(&max98505->dev_log->kobj,
				&max98505_attribute_group);
			if (ret)
				msg_maxim(
				"failed to create sysfs group [%d]", ret);
		}
	}
	msg_maxim("g_class=%p %p", g_class, max98505->dev_log_class);
#endif /* USE_DSM_LOG || USE_DSM_UPDATE_CAL */

err_version:
	msg_maxim("exit %d", ret);

	return ret;
}