2019-06-04 11:11:33 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2016-02-12 05:02:42 +03:00
/*
* I2C driver for the X - Powers ' Power Management ICs
*
* AXP20x typically comprises an adaptive USB - Compatible PWM charger , BUCK DC - DC
* converters , LDOs , multiple 12 - bit ADCs of voltage , current and temperature
* as well as configurable GPIOs .
*
* This driver supports the I2C variants .
*
* Copyright ( C ) 2014 Carlo Caione
*
* Author : Carlo Caione < carlo @ caione . org >
*/
# include <linux/acpi.h>
# include <linux/err.h>
# include <linux/i2c.h>
# include <linux/module.h>
# include <linux/mfd/axp20x.h>
# include <linux/of.h>
# include <linux/regmap.h>
# include <linux/slab.h>
2022-11-19 01:42:36 +03:00
static int axp20x_i2c_probe ( struct i2c_client * i2c )
2016-02-12 05:02:42 +03:00
{
struct axp20x_dev * axp20x ;
int ret ;
axp20x = devm_kzalloc ( & i2c - > dev , sizeof ( * axp20x ) , GFP_KERNEL ) ;
if ( ! axp20x )
return - ENOMEM ;
axp20x - > dev = & i2c - > dev ;
axp20x - > irq = i2c - > irq ;
dev_set_drvdata ( axp20x - > dev , axp20x ) ;
ret = axp20x_match_device ( axp20x ) ;
if ( ret )
return ret ;
axp20x - > regmap = devm_regmap_init_i2c ( i2c , axp20x - > regmap_cfg ) ;
if ( IS_ERR ( axp20x - > regmap ) ) {
ret = PTR_ERR ( axp20x - > regmap ) ;
dev_err ( & i2c - > dev , " regmap init failed: %d \n " , ret ) ;
return ret ;
}
return axp20x_device_probe ( axp20x ) ;
}
2022-08-15 11:02:30 +03:00
static void axp20x_i2c_remove ( struct i2c_client * i2c )
2016-02-12 05:02:42 +03:00
{
struct axp20x_dev * axp20x = i2c_get_clientdata ( i2c ) ;
2020-11-26 13:41:42 +03:00
axp20x_device_remove ( axp20x ) ;
2016-02-12 05:02:42 +03:00
}
2020-11-20 19:21:32 +03:00
# ifdef CONFIG_OF
2016-02-12 05:02:42 +03:00
static const struct of_device_id axp20x_i2c_of_match [ ] = {
{ . compatible = " x-powers,axp152 " , . data = ( void * ) AXP152_ID } ,
2023-05-11 12:26:08 +03:00
{ . compatible = " x-powers,axp192 " , . data = ( void * ) AXP192_ID } ,
2016-02-12 05:02:42 +03:00
{ . compatible = " x-powers,axp202 " , . data = ( void * ) AXP202_ID } ,
{ . compatible = " x-powers,axp209 " , . data = ( void * ) AXP209_ID } ,
{ . compatible = " x-powers,axp221 " , . data = ( void * ) AXP221_ID } ,
2019-03-18 15:55:48 +03:00
{ . compatible = " x-powers,axp223 " , . data = ( void * ) AXP223_ID } ,
2023-05-24 03:00:10 +03:00
{ . compatible = " x-powers,axp313a " , . data = ( void * ) AXP313A_ID } ,
2024-03-10 04:02:10 +03:00
{ . compatible = " x-powers,axp717 " , . data = ( void * ) AXP717_ID } ,
2020-07-08 10:19:36 +03:00
{ . compatible = " x-powers,axp803 " , . data = ( void * ) AXP803_ID } ,
2018-07-12 19:04:50 +03:00
{ . compatible = " x-powers,axp806 " , . data = ( void * ) AXP806_ID } ,
2023-04-21 18:08:15 +03:00
{ . compatible = " x-powers,axp15060 " , . data = ( void * ) AXP15060_ID } ,
2016-02-12 05:02:42 +03:00
{ } ,
} ;
MODULE_DEVICE_TABLE ( of , axp20x_i2c_of_match ) ;
2020-11-20 19:21:32 +03:00
# endif
2016-02-12 05:02:42 +03:00
static const struct i2c_device_id axp20x_i2c_id [ ] = {
2016-10-05 18:51:12 +03:00
{ " axp152 " , 0 } ,
2023-05-11 12:26:08 +03:00
{ " axp192 " , 0 } ,
2016-10-05 18:51:12 +03:00
{ " axp202 " , 0 } ,
{ " axp209 " , 0 } ,
{ " axp221 " , 0 } ,
2019-03-18 15:55:48 +03:00
{ " axp223 " , 0 } ,
2023-05-24 03:00:10 +03:00
{ " axp313a " , 0 } ,
2024-03-10 04:02:10 +03:00
{ " axp717 " , 0 } ,
2020-07-08 10:19:36 +03:00
{ " axp803 " , 0 } ,
2018-07-12 19:04:50 +03:00
{ " axp806 " , 0 } ,
2023-04-21 18:08:15 +03:00
{ " axp15060 " , 0 } ,
2016-02-12 05:02:42 +03:00
{ } ,
} ;
MODULE_DEVICE_TABLE ( i2c , axp20x_i2c_id ) ;
2020-06-25 12:03:55 +03:00
# ifdef CONFIG_ACPI
2016-02-12 05:02:42 +03:00
static const struct acpi_device_id axp20x_i2c_acpi_match [ ] = {
{
. id = " INT33F4 " ,
. driver_data = AXP288_ID ,
} ,
{ } ,
} ;
MODULE_DEVICE_TABLE ( acpi , axp20x_i2c_acpi_match ) ;
2020-06-25 12:03:55 +03:00
# endif
2016-02-12 05:02:42 +03:00
static struct i2c_driver axp20x_i2c_driver = {
. driver = {
. name = " axp20x-i2c " ,
. of_match_table = of_match_ptr ( axp20x_i2c_of_match ) ,
. acpi_match_table = ACPI_PTR ( axp20x_i2c_acpi_match ) ,
} ,
2023-05-15 21:27:52 +03:00
. probe = axp20x_i2c_probe ,
2016-02-12 05:02:42 +03:00
. remove = axp20x_i2c_remove ,
. id_table = axp20x_i2c_id ,
} ;
module_i2c_driver ( axp20x_i2c_driver ) ;
MODULE_DESCRIPTION ( " PMIC MFD I2C driver for AXP20X " ) ;
MODULE_AUTHOR ( " Carlo Caione <carlo@caione.org> " ) ;
MODULE_LICENSE ( " GPL " ) ;