static int max98505_probe(struct snd_soc_codec *codec) { struct max98505_priv *max98505 = snd_soc_codec_get_drvdata(codec); struct max98505_cdata *cdata; int ret = 0; int reg = 0; dev_info(codec->dev, "MONO - built on %s at %s\n", __DATE__, __TIME__); 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 = 12288000; max98505->volume = 0x07; cdata = &max98505->dai[0]; cdata->rate = (unsigned)-1; cdata->fmt = (unsigned)-1; reg = 0; ret = regmap_read(max98505->regmap, MAX98505_R0FF_VERSION, ®); if ((ret < 0) || ((reg != MAX98505_VERSION) && (reg != MAX98505_VERSION1) && (reg != MAX98505_VERSION2))) { dev_err(codec->dev, "device initialization error (%d 0x%02X)\n", ret, reg); goto err_access; } dev_info(codec->dev, "device version 0x%02X\n", reg); #if 0 /* FOR DEBUGGING ONLY */ regcache_cache_bypass(max98505->regmap, true); dev_info(codec->dev, "regmap cache bypass ENABLED!\n"); /**********************/ #endif 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, M98505_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, 0xD8); // regmap_write(max98505->regmap, MAX98505_R034_ALC_CONFIGURATION, 0xF8); regmap_write(max98505->regmap, MAX98505_R034_ALC_CONFIGURATION, 0x12); /*****************************************************************/ /* Set boost output to minimum until DSM is implemented */ regmap_write(max98505->regmap, MAX98505_R037_CONFIGURATION, 0xF0); /*****************************************************************/ // Disable ALC muting regmap_write(max98505->regmap, MAX98505_R03A_BOOST_LIMITER, 0xF8); regmap_update_bits(max98505->regmap, MAX98505_R02D_GAIN, M98505_DAC_IN_SEL_MASK, M98505_DAC_IN_SEL_DIV2_SUMMED_DAI); max98505_handle_pdata(codec); max98505_add_widgets(codec); ret = sysfs_create_group(&codec->dev->kobj, &maxim_attribute_group); if(ret) { pr_err("failed to create sysfs group [%d]", ret); } err_access: pr_info("%s: exit %d\n", __func__, ret); ret = 0; // temp return ret; }
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, ®); 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; }