2023-08-04 11:45:59 +01:00
// SPDX-License-Identifier: GPL-2.0
/*
* CS42L43 I2C driver
*
* Copyright ( C ) 2022 - 2023 Cirrus Logic , Inc . and
* Cirrus Logic International Semiconductor Ltd .
*/
2024-01-29 15:25:53 +00:00
# include <linux/array_size.h>
2023-08-04 11:45:59 +01:00
# include <linux/err.h>
# include <linux/i2c.h>
2024-01-29 15:25:53 +00:00
# include <linux/mfd/cs42l43.h>
2023-08-04 11:45:59 +01:00
# include <linux/mfd/cs42l43-regs.h>
2024-01-29 15:25:53 +00:00
# include <linux/mod_devicetable.h>
2023-08-04 11:45:59 +01:00
# include <linux/module.h>
2024-01-29 15:25:53 +00:00
# include <linux/pm.h>
# include <linux/regmap.h>
2023-08-04 11:45:59 +01:00
# include "cs42l43.h"
static const struct regmap_config cs42l43_i2c_regmap = {
. reg_bits = 32 ,
. reg_stride = 4 ,
. val_bits = 32 ,
. reg_format_endian = REGMAP_ENDIAN_BIG ,
. val_format_endian = REGMAP_ENDIAN_BIG ,
. max_register = CS42L43_MCU_RAM_MAX ,
. readable_reg = cs42l43_readable_register ,
. volatile_reg = cs42l43_volatile_register ,
. precious_reg = cs42l43_precious_register ,
. cache_type = REGCACHE_MAPLE ,
. reg_defaults = cs42l43_reg_default ,
. num_reg_defaults = ARRAY_SIZE ( cs42l43_reg_default ) ,
} ;
static int cs42l43_i2c_probe ( struct i2c_client * i2c )
{
struct cs42l43 * cs42l43 ;
cs42l43 = devm_kzalloc ( & i2c - > dev , sizeof ( * cs42l43 ) , GFP_KERNEL ) ;
if ( ! cs42l43 )
return - ENOMEM ;
cs42l43 - > dev = & i2c - > dev ;
cs42l43 - > irq = i2c - > irq ;
/* A device on an I2C is always attached by definition. */
cs42l43 - > attached = true ;
cs42l43 - > regmap = devm_regmap_init_i2c ( i2c , & cs42l43_i2c_regmap ) ;
2024-01-29 15:25:56 +00:00
if ( IS_ERR ( cs42l43 - > regmap ) )
return dev_err_probe ( cs42l43 - > dev , PTR_ERR ( cs42l43 - > regmap ) ,
" Failed to allocate regmap \n " ) ;
2023-08-04 11:45:59 +01:00
return cs42l43_dev_probe ( cs42l43 ) ;
}
static void cs42l43_i2c_remove ( struct i2c_client * i2c )
{
struct cs42l43 * cs42l43 = dev_get_drvdata ( & i2c - > dev ) ;
cs42l43_dev_remove ( cs42l43 ) ;
}
# if IS_ENABLED(CONFIG_OF)
static const struct of_device_id cs42l43_of_match [ ] = {
{ . compatible = " cirrus,cs42l43 " , } ,
{ }
} ;
MODULE_DEVICE_TABLE ( of , cs42l43_of_match ) ;
# endif
# if IS_ENABLED(CONFIG_ACPI)
static const struct acpi_device_id cs42l43_acpi_match [ ] = {
{ " CSC4243 " , 0 } ,
{ }
} ;
MODULE_DEVICE_TABLE ( acpi , cs42l43_acpi_match ) ;
# endif
static struct i2c_driver cs42l43_i2c_driver = {
. driver = {
. name = " cs42l43 " ,
. pm = pm_ptr ( & cs42l43_pm_ops ) ,
. of_match_table = of_match_ptr ( cs42l43_of_match ) ,
. acpi_match_table = ACPI_PTR ( cs42l43_acpi_match ) ,
} ,
. probe = cs42l43_i2c_probe ,
. remove = cs42l43_i2c_remove ,
} ;
module_i2c_driver ( cs42l43_i2c_driver ) ;
MODULE_IMPORT_NS ( MFD_CS42L43 ) ;
MODULE_DESCRIPTION ( " CS42L43 I2C Driver " ) ;
MODULE_AUTHOR ( " Charles Keepax <ckeepax@opensource.cirrus.com> " ) ;
MODULE_LICENSE ( " GPL " ) ;