]> Git Repo - J-linux.git/commitdiff
Merge branch 'for-5.13' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie...
authorMark Brown <[email protected]>
Tue, 25 May 2021 15:44:26 +0000 (16:44 +0100)
committerMark Brown <[email protected]>
Tue, 25 May 2021 15:44:26 +0000 (16:44 +0100)
1  2 
sound/soc/codecs/cs35l32.c
sound/soc/codecs/cs35l33.c
sound/soc/codecs/cs35l34.c
sound/soc/codecs/cs42l42.c
sound/soc/codecs/cs42l73.c
sound/soc/codecs/cs53l30.c
sound/soc/codecs/lpass-rx-macro.c
sound/soc/codecs/lpass-tx-macro.c
sound/soc/fsl/Kconfig
sound/soc/intel/boards/bytcr_rt5640.c
sound/soc/soc-core.c

index 7e1047362a90137baa7082a1730a88a09414efaf,88e79b9f52edca0893eb98e8375f87f47fd90d43..933e3d627e5f8260b1661ebadb05a9c90dc8a441
@@@ -30,7 -30,6 +30,7 @@@
  #include <dt-bindings/sound/cs35l32.h>
  
  #include "cs35l32.h"
 +#include "cirrus_legacy.h"
  
  #define CS35L32_NUM_SUPPLIES 2
  static const char *const cs35l32_supply_names[CS35L32_NUM_SUPPLIES] = {
@@@ -262,6 -261,9 +262,9 @@@ static const struct regmap_config cs35l
        .readable_reg = cs35l32_readable_register,
        .precious_reg = cs35l32_precious_register,
        .cache_type = REGCACHE_RBTREE,
+       .use_single_read = true,
+       .use_single_write = true,
  };
  
  static int cs35l32_handle_of_data(struct i2c_client *i2c_client,
@@@ -349,7 -351,8 +352,7 @@@ static int cs35l32_i2c_probe(struct i2c
        struct cs35l32_private *cs35l32;
        struct cs35l32_platform_data *pdata =
                dev_get_platdata(&i2c_client->dev);
 -      int ret, i;
 -      unsigned int devid = 0;
 +      int ret, i, devid;
        unsigned int reg;
  
        cs35l32 = devm_kzalloc(&i2c_client->dev, sizeof(*cs35l32), GFP_KERNEL);
        /* Reset the Device */
        cs35l32->reset_gpio = devm_gpiod_get_optional(&i2c_client->dev,
                "reset", GPIOD_OUT_LOW);
 -      if (IS_ERR(cs35l32->reset_gpio))
 -              return PTR_ERR(cs35l32->reset_gpio);
 +      if (IS_ERR(cs35l32->reset_gpio)) {
 +              ret = PTR_ERR(cs35l32->reset_gpio);
 +              goto err_supplies;
 +      }
  
        gpiod_set_value_cansleep(cs35l32->reset_gpio, 1);
  
        /* initialize codec */
 -      ret = regmap_read(cs35l32->regmap, CS35L32_DEVID_AB, &reg);
 -      devid = (reg & 0xFF) << 12;
 -
 -      ret = regmap_read(cs35l32->regmap, CS35L32_DEVID_CD, &reg);
 -      devid |= (reg & 0xFF) << 4;
 -
 -      ret = regmap_read(cs35l32->regmap, CS35L32_DEVID_E, &reg);
 -      devid |= (reg & 0xF0) >> 4;
 +      devid = cirrus_read_device_id(cs35l32->regmap, CS35L32_DEVID_AB);
 +      if (devid < 0) {
 +              ret = devid;
 +              dev_err(&i2c_client->dev, "Failed to read device ID: %d\n", ret);
 +              goto err_disable;
 +      }
  
        if (devid != CS35L32_CHIP_ID) {
                ret = -ENODEV;
                dev_err(&i2c_client->dev,
                        "CS35L32 Device ID (%X). Expected %X\n",
                        devid, CS35L32_CHIP_ID);
 -              return ret;
 +              goto err_disable;
        }
  
        ret = regmap_read(cs35l32->regmap, CS35L32_REV_ID, &reg);
        if (ret < 0) {
                dev_err(&i2c_client->dev, "Get Revision ID failed\n");
 -              return ret;
 +              goto err_disable;
        }
  
        ret = regmap_register_patch(cs35l32->regmap, cs35l32_monitor_patch,
                                    ARRAY_SIZE(cs35l32_monitor_patch));
        if (ret < 0) {
                dev_err(&i2c_client->dev, "Failed to apply errata patch\n");
 -              return ret;
 +              goto err_disable;
        }
  
        dev_info(&i2c_client->dev,
                            CS35L32_PDN_AMP);
  
        /* Clear MCLK Error Bit since we don't have the clock yet */
 -      ret = regmap_read(cs35l32->regmap, CS35L32_INT_STATUS_1, &reg);
 +      regmap_read(cs35l32->regmap, CS35L32_INT_STATUS_1, &reg);
  
        ret = devm_snd_soc_register_component(&i2c_client->dev,
                        &soc_component_dev_cs35l32, cs35l32_dai,
        return 0;
  
  err_disable:
 +      gpiod_set_value_cansleep(cs35l32->reset_gpio, 0);
 +err_supplies:
        regulator_bulk_disable(ARRAY_SIZE(cs35l32->supplies),
                               cs35l32->supplies);
        return ret;
index 6f6b3c0c88b780d2cf159e945a84d8f85ccaba3d,e8f3dcfd144dadb61b3ebcdbc69adc677ce7f47e..2a6f5e46d031290e75d3e41597c691ef86b929aa
@@@ -34,7 -34,6 +34,7 @@@
  #include <linux/of_irq.h>
  
  #include "cs35l33.h"
 +#include "cirrus_legacy.h"
  
  #define CS35L33_BOOT_DELAY    50
  
@@@ -1191,17 -1190,18 +1191,18 @@@ static int cs35l33_i2c_probe(struct i2c
        regcache_cache_only(cs35l33->regmap, false);
  
        /* initialize codec */
 -      ret = regmap_read(cs35l33->regmap, CS35L33_DEVID_AB, &reg);
 -      devid = (reg & 0xFF) << 12;
 -      ret = regmap_read(cs35l33->regmap, CS35L33_DEVID_CD, &reg);
 -      devid |= (reg & 0xFF) << 4;
 -      ret = regmap_read(cs35l33->regmap, CS35L33_DEVID_E, &reg);
 -      devid |= (reg & 0xF0) >> 4;
 +      devid = cirrus_read_device_id(cs35l33->regmap, CS35L33_DEVID_AB);
 +      if (devid < 0) {
 +              ret = devid;
 +              dev_err(&i2c_client->dev, "Failed to read device ID: %d\n", ret);
 +              goto err_enable;
 +      }
  
        if (devid != CS35L33_CHIP_ID) {
                dev_err(&i2c_client->dev,
                        "CS35L33 Device ID (%X). Expected ID %X\n",
                        devid, CS35L33_CHIP_ID);
+               ret = -EINVAL;
                goto err_enable;
        }
  
        return 0;
  
  err_enable:
 +      gpiod_set_value_cansleep(cs35l33->reset_gpio, 0);
 +
        regulator_bulk_disable(cs35l33->num_core_supplies,
                               cs35l33->core_supplies);
  
index 6657cc5db3e8719760a1f39266c24574d13155dc,3d3c3c34dfe273ee3cc79c89996a2a469fe8bdbb..ed678241c22bcc1eacf4394322c696c80fd2cab6
@@@ -34,7 -34,6 +34,7 @@@
  #include <sound/cs35l34.h>
  
  #include "cs35l34.h"
 +#include "cirrus_legacy.h"
  
  #define PDN_DONE_ATTEMPTS 10
  #define CS35L34_START_DELAY 50
@@@ -801,6 -800,9 +801,9 @@@ static struct regmap_config cs35l34_reg
        .readable_reg = cs35l34_readable_register,
        .precious_reg = cs35l34_precious_register,
        .cache_type = REGCACHE_RBTREE,
+       .use_single_read = true,
+       .use_single_write = true,
  };
  
  static int cs35l34_handle_of_data(struct i2c_client *i2c_client,
@@@ -997,8 -999,9 +1000,8 @@@ static int cs35l34_i2c_probe(struct i2c
        struct cs35l34_private *cs35l34;
        struct cs35l34_platform_data *pdata =
                dev_get_platdata(&i2c_client->dev);
 -      int i;
 +      int i, devid;
        int ret;
 -      unsigned int devid = 0;
        unsigned int reg;
  
        cs35l34 = devm_kzalloc(&i2c_client->dev, sizeof(*cs35l34), GFP_KERNEL);
        } else {
                pdata = devm_kzalloc(&i2c_client->dev, sizeof(*pdata),
                                     GFP_KERNEL);
 -              if (!pdata)
 -                      return -ENOMEM;
 +              if (!pdata) {
 +                      ret = -ENOMEM;
 +                      goto err_regulator;
 +              }
  
                if (i2c_client->dev.of_node) {
                        ret = cs35l34_handle_of_data(i2c_client, pdata);
                        if (ret != 0)
 -                              return ret;
 +                              goto err_regulator;
  
                }
                cs35l34->pdata = *pdata;
  
        cs35l34->reset_gpio = devm_gpiod_get_optional(&i2c_client->dev,
                                "reset-gpios", GPIOD_OUT_LOW);
 -      if (IS_ERR(cs35l34->reset_gpio))
 -              return PTR_ERR(cs35l34->reset_gpio);
 +      if (IS_ERR(cs35l34->reset_gpio)) {
 +              ret = PTR_ERR(cs35l34->reset_gpio);
 +              goto err_regulator;
 +      }
  
        gpiod_set_value_cansleep(cs35l34->reset_gpio, 1);
  
        msleep(CS35L34_START_DELAY);
  
 -      ret = regmap_read(cs35l34->regmap, CS35L34_DEVID_AB, &reg);
 -
 -      devid = (reg & 0xFF) << 12;
 -      ret = regmap_read(cs35l34->regmap, CS35L34_DEVID_CD, &reg);
 -      devid |= (reg & 0xFF) << 4;
 -      ret = regmap_read(cs35l34->regmap, CS35L34_DEVID_E, &reg);
 -      devid |= (reg & 0xF0) >> 4;
 +      devid = cirrus_read_device_id(cs35l34->regmap, CS35L34_DEVID_AB);
 +      if (devid < 0) {
 +              ret = devid;
 +              dev_err(&i2c_client->dev, "Failed to read device ID: %d\n", ret);
 +              goto err_reset;
 +      }
  
        if (devid != CS35L34_CHIP_ID) {
                dev_err(&i2c_client->dev,
                        "CS35l34 Device ID (%X). Expected ID %X\n",
                        devid, CS35L34_CHIP_ID);
                ret = -ENODEV;
 -              goto err_regulator;
 +              goto err_reset;
        }
  
        ret = regmap_read(cs35l34->regmap, CS35L34_REV_ID, &reg);
        if (ret < 0) {
                dev_err(&i2c_client->dev, "Get Revision ID failed\n");
 -              goto err_regulator;
 +              goto err_reset;
        }
  
        dev_info(&i2c_client->dev,
        if (ret < 0) {
                dev_err(&i2c_client->dev,
                        "%s: Register component failed\n", __func__);
 -              goto err_regulator;
 +              goto err_reset;
        }
  
        return 0;
  
 +err_reset:
 +      gpiod_set_value_cansleep(cs35l34->reset_gpio, 0);
  err_regulator:
        regulator_bulk_disable(cs35l34->num_core_supplies,
                cs35l34->core_supplies);
index 5087c5b781f8c5ba9d4081cce84928335c8557cf,77473c226f9ec022e8b73b1edeb7ece1fb1ef8e2..b084acd1e86b6f28c5ce4cda33c4d5a7a5d4d226
  #include <linux/gpio.h>
  #include <linux/regmap.h>
  #include <linux/slab.h>
 +#include <linux/acpi.h>
  #include <linux/platform_device.h>
 +#include <linux/property.h>
  #include <linux/regulator/consumer.h>
  #include <linux/gpio/consumer.h>
 -#include <linux/of.h>
 -#include <linux/of_gpio.h>
  #include <linux/of_device.h>
  #include <linux/pm_runtime.h>
  #include <sound/core.h>
@@@ -36,7 -36,6 +36,7 @@@
  #include <dt-bindings/sound/cs42l42.h>
  
  #include "cs42l42.h"
 +#include "cirrus_legacy.h"
  
  static const struct reg_default cs42l42_reg_defaults[] = {
        { CS42L42_FRZ_CTL,                      0x00 },
@@@ -400,6 -399,9 +400,9 @@@ static const struct regmap_config cs42l
        .reg_defaults = cs42l42_reg_defaults,
        .num_reg_defaults = ARRAY_SIZE(cs42l42_reg_defaults),
        .cache_type = REGCACHE_RBTREE,
+       .use_single_read = true,
+       .use_single_write = true,
  };
  
  static DECLARE_TLV_DB_SCALE(adc_tlv, -9600, 100, false);
@@@ -519,33 -521,26 +522,33 @@@ static const struct snd_soc_dapm_route 
        { "SDOUT2", NULL, "ASP TX EN" },
  };
  
 +static int cs42l42_set_jack(struct snd_soc_component *component, struct snd_soc_jack *jk, void *d)
 +{
 +      struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component);
 +
 +      cs42l42->jack = jk;
 +
 +      regmap_update_bits(cs42l42->regmap, CS42L42_TSRS_PLUG_INT_MASK,
 +                         CS42L42_RS_PLUG_MASK | CS42L42_RS_UNPLUG_MASK |
 +                         CS42L42_TS_PLUG_MASK | CS42L42_TS_UNPLUG_MASK,
 +                         (1 << CS42L42_RS_PLUG_SHIFT) | (1 << CS42L42_RS_UNPLUG_SHIFT) |
 +                         (0 << CS42L42_TS_PLUG_SHIFT) | (0 << CS42L42_TS_UNPLUG_SHIFT));
 +
 +      return 0;
 +}
 +
  static int cs42l42_component_probe(struct snd_soc_component *component)
  {
 -      struct cs42l42_private *cs42l42 =
 -              (struct cs42l42_private *)snd_soc_component_get_drvdata(component);
 -      struct snd_soc_card *crd = component->card;
 -      int ret = 0;
 +      struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component);
  
        cs42l42->component = component;
  
 -      ret = snd_soc_card_jack_new(crd, "CS42L42 Headset", SND_JACK_HEADSET | SND_JACK_BTN_0 |
 -                                  SND_JACK_BTN_1 | SND_JACK_BTN_2 | SND_JACK_BTN_3,
 -                                  &cs42l42->jack, NULL, 0);
 -      if (ret < 0)
 -              dev_err(component->dev, "Cannot create CS42L42 Headset: %d\n", ret);
 -
 -      return ret;
 +      return 0;
  }
  
  static const struct snd_soc_component_driver soc_component_dev_cs42l42 = {
        .probe                  = cs42l42_component_probe,
 +      .set_jack               = cs42l42_set_jack,
        .dapm_widgets           = cs42l42_dapm_widgets,
        .num_dapm_widgets       = ARRAY_SIZE(cs42l42_dapm_widgets),
        .dapm_routes            = cs42l42_audio_map,
@@@ -1033,7 -1028,7 +1036,7 @@@ static void cs42l42_process_hs_type_det
                        CS42L42_AUTO_HSBIAS_HIZ_MASK |
                        CS42L42_TIP_SENSE_EN_MASK |
                        CS42L42_HSBIAS_SENSE_TRIP_MASK,
 -                      (1 << CS42L42_HSBIAS_SENSE_EN_SHIFT) |
 +                      (cs42l42->hs_bias_sense_en << CS42L42_HSBIAS_SENSE_EN_SHIFT) |
                        (1 << CS42L42_AUTO_HSBIAS_HIZ_SHIFT) |
                        (0 << CS42L42_TIP_SENSE_EN_SHIFT) |
                        (3 << CS42L42_HSBIAS_SENSE_TRIP_SHIFT));
@@@ -1418,11 -1413,11 +1421,11 @@@ static irqreturn_t cs42l42_irq_thread(i
                        switch(cs42l42->hs_type){
                        case CS42L42_PLUG_CTIA:
                        case CS42L42_PLUG_OMTP:
 -                              snd_soc_jack_report(&cs42l42->jack, SND_JACK_HEADSET,
 +                              snd_soc_jack_report(cs42l42->jack, SND_JACK_HEADSET,
                                                    SND_JACK_HEADSET);
                                break;
                        case CS42L42_PLUG_HEADPHONE:
 -                              snd_soc_jack_report(&cs42l42->jack, SND_JACK_HEADPHONE,
 +                              snd_soc_jack_report(cs42l42->jack, SND_JACK_HEADPHONE,
                                                    SND_JACK_HEADPHONE);
                                break;
                        default:
                                switch(cs42l42->hs_type){
                                case CS42L42_PLUG_CTIA:
                                case CS42L42_PLUG_OMTP:
 -                                      snd_soc_jack_report(&cs42l42->jack, 0, SND_JACK_HEADSET);
 +                                      snd_soc_jack_report(cs42l42->jack, 0, SND_JACK_HEADSET);
                                        break;
                                case CS42L42_PLUG_HEADPHONE:
 -                                      snd_soc_jack_report(&cs42l42->jack, 0, SND_JACK_HEADPHONE);
 +                                      snd_soc_jack_report(cs42l42->jack, 0, SND_JACK_HEADPHONE);
                                        break;
                                default:
                                        break;
                                report = cs42l42_handle_button_press(cs42l42);
  
                        }
 -                      snd_soc_jack_report(&cs42l42->jack, report, SND_JACK_BTN_0 | SND_JACK_BTN_1 |
 +                      snd_soc_jack_report(cs42l42->jack, report, SND_JACK_BTN_0 | SND_JACK_BTN_1 |
                                                                   SND_JACK_BTN_2 | SND_JACK_BTN_3);
                }
        }
@@@ -1587,8 -1582,8 +1590,8 @@@ static void cs42l42_set_interrupt_masks
                        CS42L42_TS_UNPLUG_MASK,
                        (1 << CS42L42_RS_PLUG_SHIFT) |
                        (1 << CS42L42_RS_UNPLUG_SHIFT) |
 -                      (0 << CS42L42_TS_PLUG_SHIFT) |
 -                      (0 << CS42L42_TS_UNPLUG_SHIFT));
 +                      (1 << CS42L42_TS_PLUG_SHIFT) |
 +                      (1 << CS42L42_TS_UNPLUG_SHIFT));
  }
  
  static void cs42l42_setup_hs_type_detect(struct cs42l42_private *cs42l42)
@@@ -1638,15 -1633,17 +1641,15 @@@ static const unsigned int threshold_def
        CS42L42_HS_DET_LEVEL_1
  };
  
 -static int cs42l42_handle_device_data(struct i2c_client *i2c_client,
 +static int cs42l42_handle_device_data(struct device *dev,
                                        struct cs42l42_private *cs42l42)
  {
 -      struct device_node *np = i2c_client->dev.of_node;
        unsigned int val;
 -      unsigned int thresholds[CS42L42_NUM_BIASES];
 +      u32 thresholds[CS42L42_NUM_BIASES];
        int ret;
        int i;
  
 -      ret = of_property_read_u32(np, "cirrus,ts-inv", &val);
 -
 +      ret = device_property_read_u32(dev, "cirrus,ts-inv", &val);
        if (!ret) {
                switch (val) {
                case CS42L42_TS_INV_EN:
                        cs42l42->ts_inv = val;
                        break;
                default:
 -                      dev_err(&i2c_client->dev,
 +                      dev_err(dev,
                                "Wrong cirrus,ts-inv DT value %d\n",
                                val);
                        cs42l42->ts_inv = CS42L42_TS_INV_DIS;
                        CS42L42_TS_INV_MASK,
                        (cs42l42->ts_inv << CS42L42_TS_INV_SHIFT));
  
 -      ret = of_property_read_u32(np, "cirrus,ts-dbnc-rise", &val);
 -
 +      ret = device_property_read_u32(dev, "cirrus,ts-dbnc-rise", &val);
        if (!ret) {
                switch (val) {
                case CS42L42_TS_DBNCE_0:
                        cs42l42->ts_dbnc_rise = val;
                        break;
                default:
 -                      dev_err(&i2c_client->dev,
 +                      dev_err(dev,
                                "Wrong cirrus,ts-dbnc-rise DT value %d\n",
                                val);
                        cs42l42->ts_dbnc_rise = CS42L42_TS_DBNCE_1000;
                        (cs42l42->ts_dbnc_rise <<
                        CS42L42_TS_RISE_DBNCE_TIME_SHIFT));
  
 -      ret = of_property_read_u32(np, "cirrus,ts-dbnc-fall", &val);
 -
 +      ret = device_property_read_u32(dev, "cirrus,ts-dbnc-fall", &val);
        if (!ret) {
                switch (val) {
                case CS42L42_TS_DBNCE_0:
                        cs42l42->ts_dbnc_fall = val;
                        break;
                default:
 -                      dev_err(&i2c_client->dev,
 +                      dev_err(dev,
                                "Wrong cirrus,ts-dbnc-fall DT value %d\n",
                                val);
                        cs42l42->ts_dbnc_fall = CS42L42_TS_DBNCE_0;
                        (cs42l42->ts_dbnc_fall <<
                        CS42L42_TS_FALL_DBNCE_TIME_SHIFT));
  
 -      ret = of_property_read_u32(np, "cirrus,btn-det-init-dbnce", &val);
 -
 +      ret = device_property_read_u32(dev, "cirrus,btn-det-init-dbnce", &val);
        if (!ret) {
                if (val <= CS42L42_BTN_DET_INIT_DBNCE_MAX)
                        cs42l42->btn_det_init_dbnce = val;
                else {
 -                      dev_err(&i2c_client->dev,
 +                      dev_err(dev,
                                "Wrong cirrus,btn-det-init-dbnce DT value %d\n",
                                val);
                        cs42l42->btn_det_init_dbnce =
                        CS42L42_BTN_DET_INIT_DBNCE_DEFAULT;
        }
  
 -      ret = of_property_read_u32(np, "cirrus,btn-det-event-dbnce", &val);
 -
 +      ret = device_property_read_u32(dev, "cirrus,btn-det-event-dbnce", &val);
        if (!ret) {
                if (val <= CS42L42_BTN_DET_EVENT_DBNCE_MAX)
                        cs42l42->btn_det_event_dbnce = val;
                else {
 -                      dev_err(&i2c_client->dev,
 -                      "Wrong cirrus,btn-det-event-dbnce DT value %d\n", val);
 +                      dev_err(dev,
 +                              "Wrong cirrus,btn-det-event-dbnce DT value %d\n", val);
                        cs42l42->btn_det_event_dbnce =
                                CS42L42_BTN_DET_EVENT_DBNCE_DEFAULT;
                }
                        CS42L42_BTN_DET_EVENT_DBNCE_DEFAULT;
        }
  
 -      ret = of_property_read_u32_array(np, "cirrus,bias-lvls",
 -                                 (u32 *)thresholds, CS42L42_NUM_BIASES);
 -
 +      ret = device_property_read_u32_array(dev, "cirrus,bias-lvls",
 +                                           thresholds, ARRAY_SIZE(thresholds));
        if (!ret) {
                for (i = 0; i < CS42L42_NUM_BIASES; i++) {
                        if (thresholds[i] <= CS42L42_HS_DET_LEVEL_MAX)
                                cs42l42->bias_thresholds[i] = thresholds[i];
                        else {
 -                              dev_err(&i2c_client->dev,
 -                              "Wrong cirrus,bias-lvls[%d] DT value %d\n", i,
 +                              dev_err(dev,
 +                                      "Wrong cirrus,bias-lvls[%d] DT value %d\n", i,
                                        thresholds[i]);
 -                              cs42l42->bias_thresholds[i] =
 -                                      threshold_defaults[i];
 +                              cs42l42->bias_thresholds[i] = threshold_defaults[i];
                        }
                }
        } else {
                        cs42l42->bias_thresholds[i] = threshold_defaults[i];
        }
  
 -      ret = of_property_read_u32(np, "cirrus,hs-bias-ramp-rate", &val);
 -
 +      ret = device_property_read_u32(dev, "cirrus,hs-bias-ramp-rate", &val);
        if (!ret) {
                switch (val) {
                case CS42L42_HSBIAS_RAMP_FAST_RISE_SLOW_FALL:
                        cs42l42->hs_bias_ramp_time = CS42L42_HSBIAS_RAMP_TIME3;
                        break;
                default:
 -                      dev_err(&i2c_client->dev,
 +                      dev_err(dev,
                                "Wrong cirrus,hs-bias-ramp-rate DT value %d\n",
                                val);
                        cs42l42->hs_bias_ramp_rate = CS42L42_HSBIAS_RAMP_SLOW;
                        (cs42l42->hs_bias_ramp_rate <<
                        CS42L42_HSBIAS_RAMP_SHIFT));
  
 +      if (device_property_read_bool(dev, "cirrus,hs-bias-sense-disable"))
 +              cs42l42->hs_bias_sense_en = 0;
 +      else
 +              cs42l42->hs_bias_sense_en = 1;
 +
        return 0;
  }
  
@@@ -1820,7 -1819,8 +1823,7 @@@ static int cs42l42_i2c_probe(struct i2c
                                       const struct i2c_device_id *id)
  {
        struct cs42l42_private *cs42l42;
 -      int ret, i;
 -      unsigned int devid = 0;
 +      int ret, i, devid;
        unsigned int reg;
  
        cs42l42 = devm_kzalloc(&i2c_client->dev, sizeof(struct cs42l42_private),
                        "Failed to request IRQ: %d\n", ret);
  
        /* initialize codec */
 -      ret = regmap_read(cs42l42->regmap, CS42L42_DEVID_AB, &reg);
 -      devid = (reg & 0xFF) << 12;
 -
 -      ret = regmap_read(cs42l42->regmap, CS42L42_DEVID_CD, &reg);
 -      devid |= (reg & 0xFF) << 4;
 -
 -      ret = regmap_read(cs42l42->regmap, CS42L42_DEVID_E, &reg);
 -      devid |= (reg & 0xF0) >> 4;
 +      devid = cirrus_read_device_id(cs42l42->regmap, CS42L42_DEVID_AB);
 +      if (devid < 0) {
 +              ret = devid;
 +              dev_err(&i2c_client->dev, "Failed to read device ID: %d\n", ret);
 +              goto err_disable;
 +      }
  
        if (devid != CS42L42_CHIP_ID) {
                ret = -ENODEV;
                        (1 << CS42L42_ADC_PDN_SHIFT) |
                        (0 << CS42L42_PDN_ALL_SHIFT));
  
 -      if (i2c_client->dev.of_node) {
 -              ret = cs42l42_handle_device_data(i2c_client, cs42l42);
 -              if (ret != 0)
 -                      goto err_disable;
 -      }
 +      ret = cs42l42_handle_device_data(&i2c_client->dev, cs42l42);
 +      if (ret != 0)
 +              goto err_disable;
  
        /* Setup headset detection */
        cs42l42_setup_hs_type_detect(cs42l42);
@@@ -2005,21 -2009,12 +2008,21 @@@ static const struct dev_pm_ops cs42l42_
                           NULL)
  };
  
 +#ifdef CONFIG_OF
  static const struct of_device_id cs42l42_of_match[] = {
        { .compatible = "cirrus,cs42l42", },
 -      {},
 +      {}
  };
  MODULE_DEVICE_TABLE(of, cs42l42_of_match);
 +#endif
  
 +#ifdef CONFIG_ACPI
 +static const struct acpi_device_id cs42l42_acpi_match[] = {
 +      {"10134242", 0,},
 +      {}
 +};
 +MODULE_DEVICE_TABLE(acpi, cs42l42_acpi_match);
 +#endif
  
  static const struct i2c_device_id cs42l42_id[] = {
        {"cs42l42", 0},
@@@ -2032,8 -2027,7 +2035,8 @@@ static struct i2c_driver cs42l42_i2c_dr
        .driver = {
                .name = "cs42l42",
                .pm = &cs42l42_runtime_pm,
 -              .of_match_table = cs42l42_of_match,
 +              .of_match_table = of_match_ptr(cs42l42_of_match),
 +              .acpi_match_table = ACPI_PTR(cs42l42_acpi_match),
                },
        .id_table = cs42l42_id,
        .probe = cs42l42_i2c_probe,
index da5d77a5f55bba4629780dd8bd394772275d1faa,e92bacaab53fccdc81e6e332852f9658236d6691..018463f34e127085032ea839fade53841e43c2c5
@@@ -27,7 -27,6 +27,7 @@@
  #include <sound/tlv.h>
  #include <sound/cs42l73.h>
  #include "cs42l73.h"
 +#include "cirrus_legacy.h"
  
  struct sp_config {
        u8 spc, mmcc, spfs;
@@@ -1269,6 -1268,9 +1269,9 @@@ static const struct regmap_config cs42l
        .volatile_reg = cs42l73_volatile_register,
        .readable_reg = cs42l73_readable_register,
        .cache_type = REGCACHE_RBTREE,
+       .use_single_read = true,
+       .use_single_write = true,
  };
  
  static int cs42l73_i2c_probe(struct i2c_client *i2c_client,
  {
        struct cs42l73_private *cs42l73;
        struct cs42l73_platform_data *pdata = dev_get_platdata(&i2c_client->dev);
 -      int ret;
 -      unsigned int devid = 0;
 +      int ret, devid;
        unsigned int reg;
        u32 val32;
  
        }
  
        /* initialize codec */
 -      ret = regmap_read(cs42l73->regmap, CS42L73_DEVID_AB, &reg);
 -      devid = (reg & 0xFF) << 12;
 -
 -      ret = regmap_read(cs42l73->regmap, CS42L73_DEVID_CD, &reg);
 -      devid |= (reg & 0xFF) << 4;
 -
 -      ret = regmap_read(cs42l73->regmap, CS42L73_DEVID_E, &reg);
 -      devid |= (reg & 0xF0) >> 4;
 +      devid = cirrus_read_device_id(cs42l73->regmap, CS42L73_DEVID_AB);
 +      if (devid < 0) {
 +              ret = devid;
 +              dev_err(&i2c_client->dev, "Failed to read device ID: %d\n", ret);
 +              goto err_reset;
 +      }
  
        if (devid != CS42L73_DEVID) {
                ret = -ENODEV;
                dev_err(&i2c_client->dev,
                        "CS42L73 Device ID (%X). Expected %X\n",
                        devid, CS42L73_DEVID);
 -              return ret;
 +              goto err_reset;
        }
  
        ret = regmap_read(cs42l73->regmap, CS42L73_REVID, &reg);
        if (ret < 0) {
                dev_err(&i2c_client->dev, "Get Revision ID failed\n");
 -              return ret;
 +              goto err_reset;
        }
  
        dev_info(&i2c_client->dev,
                        &soc_component_dev_cs42l73, cs42l73_dai,
                        ARRAY_SIZE(cs42l73_dai));
        if (ret < 0)
 -              return ret;
 +              goto err_reset;
 +
        return 0;
 +
 +err_reset:
 +      gpio_set_value_cansleep(cs42l73->pdata.reset_gpio, 0);
 +
 +      return ret;
  }
  
  static const struct of_device_id cs42l73_of_match[] = {
index bd33dd048c7cef5d4a8e95d76f45e45400a66554,abe0cc0bc03a94bf6d4838eb56e6d0235a55e7e0..f2087bd38dbc81d484a1bb88edbbff6345203696
@@@ -20,7 -20,6 +20,7 @@@
  #include <sound/tlv.h>
  
  #include "cs53l30.h"
 +#include "cirrus_legacy.h"
  
  #define CS53L30_NUM_SUPPLIES 2
  static const char *const cs53l30_supply_names[CS53L30_NUM_SUPPLIES] = {
@@@ -913,6 -912,9 +913,9 @@@ static struct regmap_config cs53l30_reg
        .writeable_reg = cs53l30_writeable_register,
        .readable_reg = cs53l30_readable_register,
        .cache_type = REGCACHE_RBTREE,
+       .use_single_read = true,
+       .use_single_write = true,
  };
  
  static int cs53l30_i2c_probe(struct i2c_client *client,
        const struct device_node *np = client->dev.of_node;
        struct device *dev = &client->dev;
        struct cs53l30_private *cs53l30;
 -      unsigned int devid = 0;
        unsigned int reg;
 -      int ret = 0, i;
 +      int ret = 0, i, devid;
        u8 val;
  
        cs53l30 = devm_kzalloc(dev, sizeof(*cs53l30), GFP_KERNEL);
                                                      GPIOD_OUT_LOW);
        if (IS_ERR(cs53l30->reset_gpio)) {
                ret = PTR_ERR(cs53l30->reset_gpio);
 -              goto error;
 +              goto error_supplies;
        }
  
        gpiod_set_value_cansleep(cs53l30->reset_gpio, 1);
        }
  
        /* Initialize codec */
 -      ret = regmap_read(cs53l30->regmap, CS53L30_DEVID_AB, &reg);
 -      devid = reg << 12;
 -
 -      ret = regmap_read(cs53l30->regmap, CS53L30_DEVID_CD, &reg);
 -      devid |= reg << 4;
 -
 -      ret = regmap_read(cs53l30->regmap, CS53L30_DEVID_E, &reg);
 -      devid |= (reg & 0xF0) >> 4;
 +      devid = cirrus_read_device_id(cs53l30->regmap, CS53L30_DEVID_AB);
 +      if (devid < 0) {
 +              ret = devid;
 +              dev_err(dev, "Failed to read device ID: %d\n", ret);
 +              goto error;
 +      }
  
        if (devid != CS53L30_DEVID) {
                ret = -ENODEV;
        return 0;
  
  error:
 +      gpiod_set_value_cansleep(cs53l30->reset_gpio, 0);
 +error_supplies:
        regulator_bulk_disable(ARRAY_SIZE(cs53l30->supplies),
                               cs53l30->supplies);
        return ret;
index 8dff72fc7babf7cab2d45ce713b6d59428990ed2,e074c7908c232ffb7476e50ad7e1cc6e2a4ce5c2..3622961f7c2c2b513dfc2e27b8b7ee731845b6b8
@@@ -2628,7 -2628,7 +2628,7 @@@ static int rx_macro_enable_rx_path_clk(
                break;
        default:
                break;
 -      };
 +      }
        return 0;
  }
  
@@@ -3549,7 -3549,7 +3549,7 @@@ static int rx_macro_probe(struct platfo
  
        /* set MCLK and NPL rates */
        clk_set_rate(rx->clks[2].clk, MCLK_FREQ);
 -      clk_set_rate(rx->clks[3].clk, MCLK_FREQ);
 +      clk_set_rate(rx->clks[3].clk, 2 * MCLK_FREQ);
  
        ret = clk_bulk_prepare_enable(RX_NUM_CLKS_MAX, rx->clks);
        if (ret)
@@@ -3579,6 -3579,7 +3579,7 @@@ static const struct of_device_id rx_mac
        { .compatible = "qcom,sm8250-lpass-rx-macro" },
        { }
  };
+ MODULE_DEVICE_TABLE(of, rx_macro_dt_match);
  
  static struct platform_driver rx_macro_driver = {
        .driver = {
index acd2fbc0ca7c69b9d19cf69c59e21045a2da4a26,3d3a6e31551b7bde0b4e99998db8af20188bc98a..27a0d5defd273da7dd4f5e8316ab2617b118d1e7
@@@ -1811,7 -1811,7 +1811,7 @@@ static int tx_macro_probe(struct platfo
  
        /* set MCLK and NPL rates */
        clk_set_rate(tx->clks[2].clk, MCLK_FREQ);
 -      clk_set_rate(tx->clks[3].clk, MCLK_FREQ);
 +      clk_set_rate(tx->clks[3].clk, 2 * MCLK_FREQ);
  
        ret = clk_bulk_prepare_enable(TX_NUM_CLKS_MAX, tx->clks);
        if (ret)
@@@ -1846,6 -1846,7 +1846,7 @@@ static const struct of_device_id tx_mac
        { .compatible = "qcom,sm8250-lpass-tx-macro" },
        { }
  };
+ MODULE_DEVICE_TABLE(of, tx_macro_dt_match);
  static struct platform_driver tx_macro_driver = {
        .driver = {
                .name = "tx_macro",
diff --combined sound/soc/fsl/Kconfig
index 88542b2700918cf903a8e8b70a13bbe60a9f49ba,556c284f49dd3531789b3eb109189b54f2574dc2..8e05d092790e4d9cda8b7f54dadaa29f93f17558
@@@ -119,6 -119,7 +119,7 @@@ config SND_SOC_FSL_RPMS
        tristate "NXP Audio Base On RPMSG support"
        depends on COMMON_CLK
        depends on RPMSG
+       depends on SND_IMX_SOC || SND_IMX_SOC = n
        select SND_SOC_IMX_RPMSG if SND_IMX_SOC != n
        help
          Say Y if you want to add rpmsg audio support for the Freescale CPUs.
@@@ -350,19 -351,6 +351,19 @@@ config SND_SOC_IMX_RPMS
          Say Y if you want to add support for SoC audio on an i.MX board with
          a rpmsg devices.
  
 +config SND_SOC_IMX_CARD
 +      tristate "SoC Audio Graph Sound Card support for i.MX boards"
 +      depends on OF && I2C
 +      select SND_SOC_AK4458
 +      select SND_SOC_AK5558
 +      select SND_SOC_IMX_PCM_DMA
 +      select SND_SOC_FSL_SAI
 +      select SND_SIMPLE_CARD_UTILS
 +      help
 +        This option enables audio sound card support for i.MX boards
 +        with OF-graph DT bindings.
 +        It also support DPCM of single CPU multi Codec ststem.
 +
  endif # SND_IMX_SOC
  
  endmenu
index 240cb4337dee292e39688f0e843f958ab10c2482,22dbd9d93c1ef5bece4b63fffeb57e1851e5bf39..91a6d712eb5855e61e807fb41394530faa16a86c
@@@ -574,6 -574,17 +574,17 @@@ static const struct dmi_system_id byt_r
                                        BYT_RT5640_SSP0_AIF1 |
                                        BYT_RT5640_MCLK_EN),
        },
+       {       /* Glavey TM800A550L */
+               .matches = {
+                       DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
+                       DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"),
+                       /* Above strings are too generic, also match on BIOS version */
+                       DMI_MATCH(DMI_BIOS_VERSION, "ZY-8-BI-PX4S70VTR400-X423B-005-D"),
+               },
+               .driver_data = (void *)(BYTCR_INPUT_DEFAULTS |
+                                       BYT_RT5640_SSP0_AIF1 |
+                                       BYT_RT5640_MCLK_EN),
+       },
        {
                .matches = {
                        DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
                                        BYT_RT5640_MONO_SPEAKER |
                                        BYT_RT5640_MCLK_EN),
        },
+       {       /* Lenovo Miix 3-830 */
+               .matches = {
+                       DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+                       DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "Lenovo MIIX 3-830"),
+               },
+               .driver_data = (void *)(BYT_RT5640_IN1_MAP |
+                                       BYT_RT5640_JD_SRC_JD2_IN4N |
+                                       BYT_RT5640_OVCD_TH_2000UA |
+                                       BYT_RT5640_OVCD_SF_0P75 |
+                                       BYT_RT5640_MONO_SPEAKER |
+                                       BYT_RT5640_DIFF_MIC |
+                                       BYT_RT5640_SSP0_AIF1 |
+                                       BYT_RT5640_MCLK_EN),
+       },
        {       /* Linx Linx7 tablet */
                .matches = {
                        DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LINX"),
@@@ -1180,6 -1205,7 +1205,6 @@@ static struct snd_soc_dai_link byt_rt56
                .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
                                                | SND_SOC_DAIFMT_CBS_CFS,
                .be_hw_params_fixup = byt_rt5640_codec_fixup,
 -              .nonatomic = true,
                .dpcm_playback = 1,
                .dpcm_capture = 1,
                .init = byt_rt5640_init,
diff --combined sound/soc/soc-core.c
index 2d969e31f37dc72b17e9602a7c15e07026fb4095,a76974ccfce10663194a2ee9b9a3676f35c7a430..962c527a1d1e5247b978e2f14c878ab92e28dd7c
@@@ -75,9 -75,9 +75,9 @@@ static ssize_t pmdown_time_show(struct 
        return sprintf(buf, "%ld\n", rtd->pmdown_time);
  }
  
 -static ssize_t pmdown_time_set(struct device *dev,
 -                             struct device_attribute *attr,
 -                             const char *buf, size_t count)
 +static ssize_t pmdown_time_store(struct device *dev,
 +                               struct device_attribute *attr,
 +                               const char *buf, size_t count)
  {
        struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
        int ret;
@@@ -89,7 -89,7 +89,7 @@@
        return count;
  }
  
 -static DEVICE_ATTR(pmdown_time, 0644, pmdown_time_show, pmdown_time_set);
 +static DEVICE_ATTR_RW(pmdown_time);
  
  static struct attribute *soc_dev_attrs[] = {
        &dev_attr_pmdown_time.attr,
@@@ -2225,6 -2225,8 +2225,8 @@@ static char *fmt_single_name(struct dev
                return NULL;
  
        name = devm_kstrdup(dev, devname, GFP_KERNEL);
+       if (!name)
+               return NULL;
  
        /* are we a "%s.%d" name (platform and SPI components) */
        found = strstr(name, dev->driver->name);
This page took 0.14739 seconds and 4 git commands to generate.