2019-04-03 21:17:16 -07:00
/* SPDX-License-Identifier: GPL-2.0
2016-04-18 17:24:05 -07:00
*
2019-04-03 21:17:16 -07:00
* Copyright 2011 - 2019 NW Digital Radio
2016-04-18 17:24:05 -07:00
*
2019-04-03 21:17:15 -07:00
* Author : Annaliese McDermond < nh6z @ nh6z . net >
2016-04-18 17:24:05 -07:00
*
* Based on sound / soc / codecs / wm8974 and TI driver for kernel 2.6 .27 .
*
*/
# include <linux/i2c.h>
# include <linux/module.h>
# include <linux/of.h>
# include <linux/regmap.h>
# include <sound/soc.h>
# include "tlv320aic32x4.h"
2021-06-17 10:52:28 +02:00
static const struct of_device_id aic32x4_of_id [ ] ;
2016-04-18 17:24:05 -07:00
static int aic32x4_i2c_probe ( struct i2c_client * i2c ,
const struct i2c_device_id * id )
{
struct regmap * regmap ;
struct regmap_config config ;
config = aic32x4_regmap_config ;
config . reg_bits = 8 ;
config . val_bits = 8 ;
regmap = devm_regmap_init_i2c ( i2c , & config ) ;
2021-06-17 10:52:28 +02:00
if ( i2c - > dev . of_node ) {
const struct of_device_id * oid ;
oid = of_match_node ( aic32x4_of_id , i2c - > dev . of_node ) ;
dev_set_drvdata ( & i2c - > dev , ( void * ) oid - > data ) ;
} else if ( id ) {
dev_set_drvdata ( & i2c - > dev , ( void * ) id - > driver_data ) ;
}
2016-04-18 17:24:05 -07:00
return aic32x4_probe ( & i2c - > dev , regmap ) ;
}
static int aic32x4_i2c_remove ( struct i2c_client * i2c )
{
2021-10-15 09:11:13 +02:00
aic32x4_remove ( & i2c - > dev ) ;
return 0 ;
2016-04-18 17:24:05 -07:00
}
static const struct i2c_device_id aic32x4_i2c_id [ ] = {
2021-06-17 10:52:28 +02:00
{ " tlv320aic32x4 " , ( kernel_ulong_t ) AIC32X4_TYPE_AIC32X4 } ,
{ " tlv320aic32x6 " , ( kernel_ulong_t ) AIC32X4_TYPE_AIC32X6 } ,
2021-06-17 10:52:29 +02:00
{ " tas2505 " , ( kernel_ulong_t ) AIC32X4_TYPE_TAS2505 } ,
2016-04-18 17:24:05 -07:00
{ /* sentinel */ }
} ;
MODULE_DEVICE_TABLE ( i2c , aic32x4_i2c_id ) ;
static const struct of_device_id aic32x4_of_id [ ] = {
2021-06-17 10:52:28 +02:00
{ . compatible = " ti,tlv320aic32x4 " , . data = ( void * ) AIC32X4_TYPE_AIC32X4 } ,
{ . compatible = " ti,tlv320aic32x6 " , . data = ( void * ) AIC32X4_TYPE_AIC32X6 } ,
2021-06-17 10:52:29 +02:00
{ . compatible = " ti,tas2505 " , . data = ( void * ) AIC32X4_TYPE_TAS2505 } ,
2016-04-18 17:24:05 -07:00
{ /* senitel */ }
} ;
MODULE_DEVICE_TABLE ( of , aic32x4_of_id ) ;
static struct i2c_driver aic32x4_i2c_driver = {
. driver = {
. name = " tlv320aic32x4 " ,
. of_match_table = aic32x4_of_id ,
} ,
. probe = aic32x4_i2c_probe ,
. remove = aic32x4_i2c_remove ,
. id_table = aic32x4_i2c_id ,
} ;
module_i2c_driver ( aic32x4_i2c_driver ) ;
MODULE_DESCRIPTION ( " ASoC TLV320AIC32x4 codec driver I2C " ) ;
2019-04-03 21:17:15 -07:00
MODULE_AUTHOR ( " Annaliese McDermond <nh6z@nh6z.net> " ) ;
2016-04-18 17:24:05 -07:00
MODULE_LICENSE ( " GPL " ) ;