Loading Documentation/devicetree/bindings/sound/ak5386.txt +4 −0 Original line number Diff line number Diff line Loading @@ -10,10 +10,14 @@ Optional properties: - reset-gpio : a GPIO spec for the reset/power down pin. If specified, it will be deasserted at probe time. - va-supply : a regulator spec, providing 5.0V - vd-supply : a regulator spec, providing 3.3V Example: spdif: ak5386@0 { compatible = "asahi-kasei,ak5386"; reset-gpio = <&gpio0 23>; va-supply = <&vdd_5v0_reg>; vd-supply = <&vdd_3v3_reg>; }; include/linux/mfd/arizona/core.h +6 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,12 @@ struct arizona { int clk32k_ref; struct snd_soc_dapm_context *dapm; int tdm_width[ARIZONA_MAX_AIF]; int tdm_slots[ARIZONA_MAX_AIF]; uint16_t dac_comp_coeff; uint8_t dac_comp_enabled; }; int arizona_clk32k_enable(struct arizona *arizona); Loading sound/soc/codecs/adau1977.c +1 −1 Original line number Diff line number Diff line Loading @@ -968,7 +968,7 @@ int adau1977_probe(struct device *dev, struct regmap *regmap, if (adau1977->dvdd_reg) power_off_mask = ~0; else power_off_mask = ~ADAU1977_BLOCK_POWER_SAI_LDO_EN; power_off_mask = (unsigned int)~ADAU1977_BLOCK_POWER_SAI_LDO_EN; ret = regmap_update_bits(adau1977->regmap, ADAU1977_REG_BLOCK_POWER_SAI, power_off_mask, 0x00); Loading sound/soc/codecs/ak4642.c +2 −2 Original line number Diff line number Diff line Loading @@ -547,7 +547,7 @@ static const struct ak4642_drvdata ak4648_drvdata = { .extended_frequencies = 1, }; static struct of_device_id ak4642_of_match[]; static const struct of_device_id ak4642_of_match[]; static int ak4642_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { Loading Loading @@ -593,7 +593,7 @@ static int ak4642_i2c_remove(struct i2c_client *client) return 0; } static struct of_device_id ak4642_of_match[] = { static const struct of_device_id ak4642_of_match[] = { { .compatible = "asahi-kasei,ak4642", .data = &ak4642_drvdata}, { .compatible = "asahi-kasei,ak4643", .data = &ak4643_drvdata}, { .compatible = "asahi-kasei,ak4648", .data = &ak4648_drvdata}, Loading sound/soc/codecs/ak5386.c +50 −0 Original line number Diff line number Diff line Loading @@ -14,12 +14,18 @@ #include <linux/of.h> #include <linux/of_gpio.h> #include <linux/of_device.h> #include <linux/regulator/consumer.h> #include <sound/soc.h> #include <sound/pcm.h> #include <sound/initval.h> static const char * const supply_names[] = { "va", "vd" }; struct ak5386_priv { int reset_gpio; struct regulator_bulk_data supplies[ARRAY_SIZE(supply_names)]; }; static const struct snd_soc_dapm_widget ak5386_dapm_widgets[] = { Loading @@ -32,7 +38,42 @@ static const struct snd_soc_dapm_route ak5386_dapm_routes[] = { { "Capture", NULL, "AINR" }, }; static int ak5386_soc_probe(struct snd_soc_codec *codec) { struct ak5386_priv *priv = snd_soc_codec_get_drvdata(codec); return regulator_bulk_enable(ARRAY_SIZE(priv->supplies), priv->supplies); } static int ak5386_soc_remove(struct snd_soc_codec *codec) { struct ak5386_priv *priv = snd_soc_codec_get_drvdata(codec); regulator_bulk_disable(ARRAY_SIZE(priv->supplies), priv->supplies); return 0; } #ifdef CONFIG_PM static int ak5386_soc_suspend(struct snd_soc_codec *codec) { struct ak5386_priv *priv = snd_soc_codec_get_drvdata(codec); regulator_bulk_disable(ARRAY_SIZE(priv->supplies), priv->supplies); return 0; } static int ak5386_soc_resume(struct snd_soc_codec *codec) { struct ak5386_priv *priv = snd_soc_codec_get_drvdata(codec); return regulator_bulk_enable(ARRAY_SIZE(priv->supplies), priv->supplies); } #else #define ak5386_soc_suspend NULL #define ak5386_soc_resume NULL #endif /* CONFIG_PM */ static struct snd_soc_codec_driver soc_codec_ak5386 = { .probe = ak5386_soc_probe, .remove = ak5386_soc_remove, .suspend = ak5386_soc_suspend, .resume = ak5386_soc_resume, .dapm_widgets = ak5386_dapm_widgets, .num_dapm_widgets = ARRAY_SIZE(ak5386_dapm_widgets), .dapm_routes = ak5386_dapm_routes, Loading Loading @@ -122,6 +163,7 @@ static int ak5386_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct ak5386_priv *priv; int ret, i; priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); if (!priv) Loading @@ -130,6 +172,14 @@ static int ak5386_probe(struct platform_device *pdev) priv->reset_gpio = -EINVAL; dev_set_drvdata(dev, priv); for (i = 0; i < ARRAY_SIZE(supply_names); i++) priv->supplies[i].supply = supply_names[i]; ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(priv->supplies), priv->supplies); if (ret < 0) return ret; if (of_match_device(of_match_ptr(ak5386_dt_ids), dev)) priv->reset_gpio = of_get_named_gpio(dev->of_node, "reset-gpio", 0); Loading Loading
Documentation/devicetree/bindings/sound/ak5386.txt +4 −0 Original line number Diff line number Diff line Loading @@ -10,10 +10,14 @@ Optional properties: - reset-gpio : a GPIO spec for the reset/power down pin. If specified, it will be deasserted at probe time. - va-supply : a regulator spec, providing 5.0V - vd-supply : a regulator spec, providing 3.3V Example: spdif: ak5386@0 { compatible = "asahi-kasei,ak5386"; reset-gpio = <&gpio0 23>; va-supply = <&vdd_5v0_reg>; vd-supply = <&vdd_3v3_reg>; };
include/linux/mfd/arizona/core.h +6 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,12 @@ struct arizona { int clk32k_ref; struct snd_soc_dapm_context *dapm; int tdm_width[ARIZONA_MAX_AIF]; int tdm_slots[ARIZONA_MAX_AIF]; uint16_t dac_comp_coeff; uint8_t dac_comp_enabled; }; int arizona_clk32k_enable(struct arizona *arizona); Loading
sound/soc/codecs/adau1977.c +1 −1 Original line number Diff line number Diff line Loading @@ -968,7 +968,7 @@ int adau1977_probe(struct device *dev, struct regmap *regmap, if (adau1977->dvdd_reg) power_off_mask = ~0; else power_off_mask = ~ADAU1977_BLOCK_POWER_SAI_LDO_EN; power_off_mask = (unsigned int)~ADAU1977_BLOCK_POWER_SAI_LDO_EN; ret = regmap_update_bits(adau1977->regmap, ADAU1977_REG_BLOCK_POWER_SAI, power_off_mask, 0x00); Loading
sound/soc/codecs/ak4642.c +2 −2 Original line number Diff line number Diff line Loading @@ -547,7 +547,7 @@ static const struct ak4642_drvdata ak4648_drvdata = { .extended_frequencies = 1, }; static struct of_device_id ak4642_of_match[]; static const struct of_device_id ak4642_of_match[]; static int ak4642_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { Loading Loading @@ -593,7 +593,7 @@ static int ak4642_i2c_remove(struct i2c_client *client) return 0; } static struct of_device_id ak4642_of_match[] = { static const struct of_device_id ak4642_of_match[] = { { .compatible = "asahi-kasei,ak4642", .data = &ak4642_drvdata}, { .compatible = "asahi-kasei,ak4643", .data = &ak4643_drvdata}, { .compatible = "asahi-kasei,ak4648", .data = &ak4648_drvdata}, Loading
sound/soc/codecs/ak5386.c +50 −0 Original line number Diff line number Diff line Loading @@ -14,12 +14,18 @@ #include <linux/of.h> #include <linux/of_gpio.h> #include <linux/of_device.h> #include <linux/regulator/consumer.h> #include <sound/soc.h> #include <sound/pcm.h> #include <sound/initval.h> static const char * const supply_names[] = { "va", "vd" }; struct ak5386_priv { int reset_gpio; struct regulator_bulk_data supplies[ARRAY_SIZE(supply_names)]; }; static const struct snd_soc_dapm_widget ak5386_dapm_widgets[] = { Loading @@ -32,7 +38,42 @@ static const struct snd_soc_dapm_route ak5386_dapm_routes[] = { { "Capture", NULL, "AINR" }, }; static int ak5386_soc_probe(struct snd_soc_codec *codec) { struct ak5386_priv *priv = snd_soc_codec_get_drvdata(codec); return regulator_bulk_enable(ARRAY_SIZE(priv->supplies), priv->supplies); } static int ak5386_soc_remove(struct snd_soc_codec *codec) { struct ak5386_priv *priv = snd_soc_codec_get_drvdata(codec); regulator_bulk_disable(ARRAY_SIZE(priv->supplies), priv->supplies); return 0; } #ifdef CONFIG_PM static int ak5386_soc_suspend(struct snd_soc_codec *codec) { struct ak5386_priv *priv = snd_soc_codec_get_drvdata(codec); regulator_bulk_disable(ARRAY_SIZE(priv->supplies), priv->supplies); return 0; } static int ak5386_soc_resume(struct snd_soc_codec *codec) { struct ak5386_priv *priv = snd_soc_codec_get_drvdata(codec); return regulator_bulk_enable(ARRAY_SIZE(priv->supplies), priv->supplies); } #else #define ak5386_soc_suspend NULL #define ak5386_soc_resume NULL #endif /* CONFIG_PM */ static struct snd_soc_codec_driver soc_codec_ak5386 = { .probe = ak5386_soc_probe, .remove = ak5386_soc_remove, .suspend = ak5386_soc_suspend, .resume = ak5386_soc_resume, .dapm_widgets = ak5386_dapm_widgets, .num_dapm_widgets = ARRAY_SIZE(ak5386_dapm_widgets), .dapm_routes = ak5386_dapm_routes, Loading Loading @@ -122,6 +163,7 @@ static int ak5386_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct ak5386_priv *priv; int ret, i; priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); if (!priv) Loading @@ -130,6 +172,14 @@ static int ak5386_probe(struct platform_device *pdev) priv->reset_gpio = -EINVAL; dev_set_drvdata(dev, priv); for (i = 0; i < ARRAY_SIZE(supply_names); i++) priv->supplies[i].supply = supply_names[i]; ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(priv->supplies), priv->supplies); if (ret < 0) return ret; if (of_match_device(of_match_ptr(ak5386_dt_ids), dev)) priv->reset_gpio = of_get_named_gpio(dev->of_node, "reset-gpio", 0); Loading