diff options
Diffstat (limited to 'sound/soc/codecs/tpa6130a2.c')
| -rw-r--r-- | sound/soc/codecs/tpa6130a2.c | 54 | 
1 files changed, 38 insertions, 16 deletions
diff --git a/sound/soc/codecs/tpa6130a2.c b/sound/soc/codecs/tpa6130a2.c index c58bee8346c..8fc5a647453 100644 --- a/sound/soc/codecs/tpa6130a2.c +++ b/sound/soc/codecs/tpa6130a2.c @@ -30,6 +30,8 @@  #include <sound/tpa6130a2-plat.h>  #include <sound/soc.h>  #include <sound/tlv.h> +#include <linux/of.h> +#include <linux/of_gpio.h>  #include "tpa6130a2.h" @@ -55,7 +57,8 @@ static int tpa6130a2_i2c_read(int reg)  	struct tpa6130a2_data *data;  	int val; -	BUG_ON(tpa6130a2_client == NULL); +	if (WARN_ON(!tpa6130a2_client)) +		return -EINVAL;  	data = i2c_get_clientdata(tpa6130a2_client);  	/* If powered off, return the cached value */ @@ -77,7 +80,8 @@ static int tpa6130a2_i2c_write(int reg, u8 value)  	struct tpa6130a2_data *data;  	int val = 0; -	BUG_ON(tpa6130a2_client == NULL); +	if (WARN_ON(!tpa6130a2_client)) +		return -EINVAL;  	data = i2c_get_clientdata(tpa6130a2_client);  	if (data->power_state) { @@ -98,7 +102,8 @@ static u8 tpa6130a2_read(int reg)  {  	struct tpa6130a2_data *data; -	BUG_ON(tpa6130a2_client == NULL); +	if (WARN_ON(!tpa6130a2_client)) +		return 0;  	data = i2c_get_clientdata(tpa6130a2_client);  	return data->regs[reg]; @@ -109,7 +114,8 @@ static int tpa6130a2_initialize(void)  	struct tpa6130a2_data *data;  	int i, ret = 0; -	BUG_ON(tpa6130a2_client == NULL); +	if (WARN_ON(!tpa6130a2_client)) +		return -EINVAL;  	data = i2c_get_clientdata(tpa6130a2_client);  	for (i = 1; i < TPA6130A2_REG_VERSION; i++) { @@ -127,7 +133,8 @@ static int tpa6130a2_power(u8 power)  	u8	val;  	int	ret = 0; -	BUG_ON(tpa6130a2_client == NULL); +	if (WARN_ON(!tpa6130a2_client)) +		return -EINVAL;  	data = i2c_get_clientdata(tpa6130a2_client);  	mutex_lock(&data->mutex); @@ -193,7 +200,8 @@ static int tpa6130a2_get_volsw(struct snd_kcontrol *kcontrol,  	unsigned int mask = (1 << fls(max)) - 1;  	unsigned int invert = mc->invert; -	BUG_ON(tpa6130a2_client == NULL); +	if (WARN_ON(!tpa6130a2_client)) +		return -EINVAL;  	data = i2c_get_clientdata(tpa6130a2_client);  	mutex_lock(&data->mutex); @@ -223,7 +231,8 @@ static int tpa6130a2_put_volsw(struct snd_kcontrol *kcontrol,  	unsigned int val = (ucontrol->value.integer.value[0] & mask);  	unsigned int val_reg; -	BUG_ON(tpa6130a2_client == NULL); +	if (WARN_ON(!tpa6130a2_client)) +		return -EINVAL;  	data = i2c_get_clientdata(tpa6130a2_client);  	if (invert) @@ -364,30 +373,33 @@ static int tpa6130a2_probe(struct i2c_client *client,  {  	struct device *dev;  	struct tpa6130a2_data *data; -	struct tpa6130a2_platform_data *pdata; +	struct tpa6130a2_platform_data *pdata = client->dev.platform_data; +	struct device_node *np = client->dev.of_node;  	const char *regulator;  	int ret;  	dev = &client->dev; -	if (client->dev.platform_data == NULL) { -		dev_err(dev, "Platform data not set\n"); -		dump_stack(); -		return -ENODEV; -	} -  	data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL);  	if (data == NULL) {  		dev_err(dev, "Can not allocate memory\n");  		return -ENOMEM;  	} +	if (pdata) { +		data->power_gpio = pdata->power_gpio; +	} else if (np) { +		data->power_gpio = of_get_named_gpio(np, "power-gpio", 0); +	} else { +		dev_err(dev, "Platform data not set\n"); +		dump_stack(); +		return -ENODEV; +	} +  	tpa6130a2_client = client;  	i2c_set_clientdata(tpa6130a2_client, data); -	pdata = client->dev.platform_data; -	data->power_gpio = pdata->power_gpio;  	data->id = id->driver_data;  	mutex_init(&data->mutex); @@ -466,10 +478,20 @@ static const struct i2c_device_id tpa6130a2_id[] = {  };  MODULE_DEVICE_TABLE(i2c, tpa6130a2_id); +#if IS_ENABLED(CONFIG_OF) +static const struct of_device_id tpa6130a2_of_match[] = { +	{ .compatible = "ti,tpa6130a2", }, +	{ .compatible = "ti,tpa6140a2" }, +	{}, +}; +MODULE_DEVICE_TABLE(of, tpa6130a2_of_match); +#endif +  static struct i2c_driver tpa6130a2_i2c_driver = {  	.driver = {  		.name = "tpa6130a2",  		.owner = THIS_MODULE, +		.of_match_table = of_match_ptr(tpa6130a2_of_match),  	},  	.probe = tpa6130a2_probe,  	.remove = tpa6130a2_remove,  | 
