diff options
Diffstat (limited to 'sound/soc/codecs/cs42l43-jack.c')
| -rw-r--r-- | sound/soc/codecs/cs42l43-jack.c | 27 | 
1 files changed, 19 insertions, 8 deletions
diff --git a/sound/soc/codecs/cs42l43-jack.c b/sound/soc/codecs/cs42l43-jack.c index 24a598f2ed9a..901b9dbcf585 100644 --- a/sound/soc/codecs/cs42l43-jack.c +++ b/sound/soc/codecs/cs42l43-jack.c @@ -6,29 +6,35 @@  //                         Cirrus Logic International Semiconductor Ltd.  #include <linux/build_bug.h> +#include <linux/completion.h>  #include <linux/delay.h>  #include <linux/errno.h>  #include <linux/irq.h>  #include <linux/jiffies.h>  #include <linux/mfd/cs42l43.h>  #include <linux/mfd/cs42l43-regs.h> +#include <linux/mutex.h>  #include <linux/pm_runtime.h>  #include <linux/property.h> +#include <linux/regmap.h> +#include <linux/time.h> +#include <linux/workqueue.h>  #include <sound/control.h>  #include <sound/jack.h>  #include <sound/pcm.h>  #include <sound/pcm_params.h>  #include <sound/soc-component.h> +#include <sound/soc-jack.h>  #include <sound/soc.h>  #include "cs42l43.h"  static const unsigned int cs42l43_accdet_us[] = { -	20, 100, 1000, 10000, 50000, 75000, 100000, 200000 +	20, 100, 1000, 10000, 50000, 75000, 100000, 200000,  };  static const unsigned int cs42l43_accdet_db_ms[] = { -	0, 125, 250, 500, 750, 1000, 1250, 1500 +	0, 125, 250, 500, 750, 1000, 1250, 1500,  };  static const unsigned int cs42l43_accdet_ramp_ms[] = { 10, 40, 90, 170 }; @@ -101,8 +107,13 @@ int cs42l43_set_jack(struct snd_soc_component *component,  			goto error;  		} -		device_property_read_u32_array(cs42l43->dev, "cirrus,buttons-ohms", -					       priv->buttons, ret); +		ret = device_property_read_u32_array(cs42l43->dev, "cirrus,buttons-ohms", +						     priv->buttons, ret); +		if (ret < 0) { +			dev_err(priv->dev, "Property cirrus,button-ohms malformed: %d\n", +				ret); +			goto error; +		}  	} else {  		priv->buttons[0] = 70;  		priv->buttons[1] = 185; @@ -637,7 +648,7 @@ static int cs42l43_run_load_detect(struct cs42l43_codec *priv, bool mic)  static int cs42l43_run_type_detect(struct cs42l43_codec *priv)  {  	struct cs42l43 *cs42l43 = priv->core; -	int timeout_ms = ((2 * priv->detect_us) / 1000) + 200; +	int timeout_ms = ((2 * priv->detect_us) / USEC_PER_MSEC) + 200;  	unsigned int type = 0xff;  	unsigned long time_left; @@ -846,6 +857,9 @@ static const char * const cs42l43_jack_text[] = {  	"Line-In", "Microphone", "Optical",  }; +static_assert(ARRAY_SIZE(cs42l43_jack_override_modes) == +	      ARRAY_SIZE(cs42l43_jack_text) - 1); +  SOC_ENUM_SINGLE_VIRT_DECL(cs42l43_jack_enum, cs42l43_jack_text);  int cs42l43_jack_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) @@ -868,9 +882,6 @@ int cs42l43_jack_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *u  	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;  	unsigned int override = ucontrol->value.integer.value[0]; -	BUILD_BUG_ON(ARRAY_SIZE(cs42l43_jack_override_modes) != -		     ARRAY_SIZE(cs42l43_jack_text) - 1); -  	if (override >= e->items)  		return -EINVAL;  |