2018-08-07 19:11:23 +03:00
// SPDX-License-Identifier: GPL-2.0+
//
// max8997.c - mfd core driver for the Maxim 8966 and 8997
//
// Copyright (C) 2011 Samsung Electronics
// MyungJoo Ham <myungjoo.ham@samsung.com>
//
// This driver is based on max8998.c
2011-03-04 09:50:26 +03:00
2012-11-27 12:34:32 +04:00
# include <linux/err.h>
2011-03-04 09:50:26 +03:00
# include <linux/slab.h>
# include <linux/i2c.h>
2013-10-16 12:56:51 +04:00
# include <linux/of.h>
2021-05-26 15:46:59 +03:00
# include <linux/of_device.h>
2012-11-27 12:34:32 +04:00
# include <linux/of_irq.h>
2011-08-19 09:39:40 +04:00
# include <linux/interrupt.h>
2011-03-04 09:50:26 +03:00
# include <linux/pm_runtime.h>
2016-06-03 03:39:47 +03:00
# include <linux/init.h>
2011-03-04 09:50:26 +03:00
# include <linux/mutex.h>
# include <linux/mfd/core.h>
# include <linux/mfd/max8997.h>
# include <linux/mfd/max8997-private.h>
# define I2C_ADDR_PMIC (0xCC >> 1)
# define I2C_ADDR_MUIC (0x4A >> 1)
# define I2C_ADDR_BATTERY (0x6C >> 1)
# define I2C_ADDR_RTC (0x0C >> 1)
# define I2C_ADDR_HAPTIC (0x90 >> 1)
2013-11-18 17:33:00 +04:00
static const struct mfd_cell max8997_devs [ ] = {
2011-03-04 09:50:26 +03:00
{ . name = " max8997-pmic " , } ,
{ . name = " max8997-rtc " , } ,
2021-04-05 10:14:35 +03:00
{ . name = " max8997-battery " , } ,
2011-03-04 09:50:26 +03:00
{ . name = " max8997-haptic " , } ,
2021-04-05 10:14:35 +03:00
{ . name = " max8997-muic " , } ,
2011-12-14 13:23:55 +04:00
{ . name = " max8997-led " , . id = 1 } ,
{ . name = " max8997-led " , . id = 2 } ,
2011-03-04 09:50:26 +03:00
} ;
2012-11-27 12:34:32 +04:00
# ifdef CONFIG_OF
2014-05-13 14:58:49 +04:00
static const struct of_device_id max8997_pmic_dt_match [ ] = {
2013-08-01 06:01:27 +04:00
{ . compatible = " maxim,max8997-pmic " , . data = ( void * ) TYPE_MAX8997 } ,
2012-11-27 12:34:32 +04:00
{ } ,
} ;
# endif
2011-03-04 09:50:26 +03:00
int max8997_read_reg ( struct i2c_client * i2c , u8 reg , u8 * dest )
{
struct max8997_dev * max8997 = i2c_get_clientdata ( i2c ) ;
int ret ;
mutex_lock ( & max8997 - > iolock ) ;
ret = i2c_smbus_read_byte_data ( i2c , reg ) ;
mutex_unlock ( & max8997 - > iolock ) ;
if ( ret < 0 )
return ret ;
ret & = 0xff ;
* dest = ret ;
return 0 ;
}
EXPORT_SYMBOL_GPL ( max8997_read_reg ) ;
int max8997_bulk_read ( struct i2c_client * i2c , u8 reg , int count , u8 * buf )
{
struct max8997_dev * max8997 = i2c_get_clientdata ( i2c ) ;
int ret ;
mutex_lock ( & max8997 - > iolock ) ;
ret = i2c_smbus_read_i2c_block_data ( i2c , reg , count , buf ) ;
mutex_unlock ( & max8997 - > iolock ) ;
if ( ret < 0 )
return ret ;
return 0 ;
}
EXPORT_SYMBOL_GPL ( max8997_bulk_read ) ;
int max8997_write_reg ( struct i2c_client * i2c , u8 reg , u8 value )
{
struct max8997_dev * max8997 = i2c_get_clientdata ( i2c ) ;
int ret ;
mutex_lock ( & max8997 - > iolock ) ;
ret = i2c_smbus_write_byte_data ( i2c , reg , value ) ;
mutex_unlock ( & max8997 - > iolock ) ;
return ret ;
}
EXPORT_SYMBOL_GPL ( max8997_write_reg ) ;
int max8997_bulk_write ( struct i2c_client * i2c , u8 reg , int count , u8 * buf )
{
struct max8997_dev * max8997 = i2c_get_clientdata ( i2c ) ;
int ret ;
mutex_lock ( & max8997 - > iolock ) ;
ret = i2c_smbus_write_i2c_block_data ( i2c , reg , count , buf ) ;
mutex_unlock ( & max8997 - > iolock ) ;
if ( ret < 0 )
return ret ;
return 0 ;
}
EXPORT_SYMBOL_GPL ( max8997_bulk_write ) ;
int max8997_update_reg ( struct i2c_client * i2c , u8 reg , u8 val , u8 mask )
{
struct max8997_dev * max8997 = i2c_get_clientdata ( i2c ) ;
int ret ;
mutex_lock ( & max8997 - > iolock ) ;
ret = i2c_smbus_read_byte_data ( i2c , reg ) ;
if ( ret > = 0 ) {
u8 old_val = ret & 0xff ;
u8 new_val = ( val & mask ) | ( old_val & ( ~ mask ) ) ;
ret = i2c_smbus_write_byte_data ( i2c , reg , new_val ) ;
}
mutex_unlock ( & max8997 - > iolock ) ;
return ret ;
}
EXPORT_SYMBOL_GPL ( max8997_update_reg ) ;
2012-11-27 12:34:32 +04:00
/*
* Only the common platform data elements for max8997 are parsed here from the
* device tree . Other sub - modules of max8997 such as pmic , rtc and others have
* to parse their own platform data elements from device tree .
*
* The max8997 platform data structure is instantiated here and the drivers for
* the sub - modules need not instantiate another instance while parsing their
* platform data .
*/
static struct max8997_platform_data * max8997_i2c_parse_dt_pdata (
struct device * dev )
{
struct max8997_platform_data * pd ;
pd = devm_kzalloc ( dev , sizeof ( * pd ) , GFP_KERNEL ) ;
2018-01-15 11:35:17 +03:00
if ( ! pd )
2012-11-27 12:34:32 +04:00
return ERR_PTR ( - ENOMEM ) ;
pd - > ono = irq_of_parse_and_map ( dev - > of_node , 1 ) ;
return pd ;
}
2014-01-23 18:35:28 +04:00
static inline unsigned long max8997_i2c_get_driver_data ( struct i2c_client * i2c ,
2012-11-27 12:34:32 +04:00
const struct i2c_device_id * id )
{
2021-05-26 15:46:59 +03:00
if ( i2c - > dev . of_node )
return ( unsigned long ) of_device_get_match_data ( & i2c - > dev ) ;
2014-01-23 18:35:28 +04:00
return id - > driver_data ;
2012-11-27 12:34:32 +04:00
}
2022-11-19 01:42:58 +03:00
static int max8997_i2c_probe ( struct i2c_client * i2c )
2011-03-04 09:50:26 +03:00
{
2022-11-19 01:42:58 +03:00
const struct i2c_device_id * id = i2c_client_get_device_id ( i2c ) ;
2011-03-04 09:50:26 +03:00
struct max8997_dev * max8997 ;
2013-07-30 12:10:05 +04:00
struct max8997_platform_data * pdata = dev_get_platdata ( & i2c - > dev ) ;
2011-03-04 09:50:26 +03:00
int ret = 0 ;
2013-08-20 11:03:20 +04:00
max8997 = devm_kzalloc ( & i2c - > dev , sizeof ( struct max8997_dev ) ,
GFP_KERNEL ) ;
2011-03-04 09:50:26 +03:00
if ( max8997 = = NULL )
return - ENOMEM ;
i2c_set_clientdata ( i2c , max8997 ) ;
max8997 - > dev = & i2c - > dev ;
max8997 - > i2c = i2c ;
2012-11-27 12:34:32 +04:00
max8997 - > type = max8997_i2c_get_driver_data ( i2c , id ) ;
2011-08-18 11:37:35 +04:00
max8997 - > irq = i2c - > irq ;
2011-03-04 09:50:26 +03:00
2013-12-22 21:48:49 +04:00
if ( IS_ENABLED ( CONFIG_OF ) & & max8997 - > dev - > of_node ) {
2012-11-27 12:34:32 +04:00
pdata = max8997_i2c_parse_dt_pdata ( max8997 - > dev ) ;
2013-08-20 11:03:20 +04:00
if ( IS_ERR ( pdata ) )
return PTR_ERR ( pdata ) ;
2012-11-27 12:34:32 +04:00
}
2011-03-04 09:50:26 +03:00
if ( ! pdata )
2013-08-20 11:03:20 +04:00
return ret ;
2011-03-04 09:50:26 +03:00
2012-11-27 12:34:32 +04:00
max8997 - > pdata = pdata ;
2011-08-18 11:37:35 +04:00
max8997 - > ono = pdata - > ono ;
2011-03-04 09:50:26 +03:00
mutex_init ( & max8997 - > iolock ) ;
2019-07-22 20:26:18 +03:00
max8997 - > rtc = i2c_new_dummy_device ( i2c - > adapter , I2C_ADDR_RTC ) ;
if ( IS_ERR ( max8997 - > rtc ) ) {
2014-02-11 14:03:34 +04:00
dev_err ( max8997 - > dev , " Failed to allocate I2C device for RTC \n " ) ;
2019-07-22 20:26:18 +03:00
return PTR_ERR ( max8997 - > rtc ) ;
2014-02-11 14:03:34 +04:00
}
2011-03-04 09:50:26 +03:00
i2c_set_clientdata ( max8997 - > rtc , max8997 ) ;
2014-02-11 14:03:34 +04:00
2019-07-22 20:26:18 +03:00
max8997 - > haptic = i2c_new_dummy_device ( i2c - > adapter , I2C_ADDR_HAPTIC ) ;
if ( IS_ERR ( max8997 - > haptic ) ) {
2014-02-11 14:03:34 +04:00
dev_err ( max8997 - > dev , " Failed to allocate I2C device for Haptic \n " ) ;
2019-07-22 20:26:18 +03:00
ret = PTR_ERR ( max8997 - > haptic ) ;
2014-02-11 14:03:34 +04:00
goto err_i2c_haptic ;
}
2011-03-04 09:50:26 +03:00
i2c_set_clientdata ( max8997 - > haptic , max8997 ) ;
2014-02-11 14:03:34 +04:00
2019-07-22 20:26:18 +03:00
max8997 - > muic = i2c_new_dummy_device ( i2c - > adapter , I2C_ADDR_MUIC ) ;
if ( IS_ERR ( max8997 - > muic ) ) {
2014-02-11 14:03:34 +04:00
dev_err ( max8997 - > dev , " Failed to allocate I2C device for MUIC \n " ) ;
2019-07-22 20:26:18 +03:00
ret = PTR_ERR ( max8997 - > muic ) ;
2014-02-11 14:03:34 +04:00
goto err_i2c_muic ;
}
2011-03-04 09:50:26 +03:00
i2c_set_clientdata ( max8997 - > muic , max8997 ) ;
pm_runtime_set_active ( max8997 - > dev ) ;
2011-08-18 11:37:35 +04:00
max8997_irq_init ( max8997 ) ;
2013-12-17 16:49:51 +04:00
ret = mfd_add_devices ( max8997 - > dev , - 1 , max8997_devs ,
2011-03-04 09:50:26 +03:00
ARRAY_SIZE ( max8997_devs ) ,
2012-09-11 11:16:36 +04:00
NULL , 0 , NULL ) ;
2013-12-17 16:49:51 +04:00
if ( ret < 0 ) {
dev_err ( max8997 - > dev , " failed to add MFD devices %d \n " , ret ) ;
goto err_mfd ;
}
2011-03-04 09:50:26 +03:00
/*
* TODO : enable others ( flash , muic , rtc , battery , . . . ) and
* check the return value
*/
2011-08-19 09:39:40 +04:00
/* MAX8997 has a power button input. */
2018-09-05 14:54:07 +03:00
device_init_wakeup ( max8997 - > dev , true ) ;
2011-08-19 09:39:40 +04:00
2011-03-04 09:50:26 +03:00
return ret ;
err_mfd :
mfd_remove_devices ( max8997 - > dev ) ;
i2c_unregister_device ( max8997 - > muic ) ;
2014-02-11 14:03:34 +04:00
err_i2c_muic :
2011-03-04 09:50:26 +03:00
i2c_unregister_device ( max8997 - > haptic ) ;
2014-02-11 14:03:34 +04:00
err_i2c_haptic :
2011-03-04 09:50:26 +03:00
i2c_unregister_device ( max8997 - > rtc ) ;
return ret ;
}
static const struct i2c_device_id max8997_i2c_id [ ] = {
{ " max8997 " , TYPE_MAX8997 } ,
{ " max8966 " , TYPE_MAX8966 } ,
{ }
} ;
2012-06-04 15:09:07 +04:00
static u8 max8997_dumpaddr_pmic [ ] = {
2011-03-04 09:50:26 +03:00
MAX8997_REG_INT1MSK ,
MAX8997_REG_INT2MSK ,
MAX8997_REG_INT3MSK ,
MAX8997_REG_INT4MSK ,
MAX8997_REG_MAINCON1 ,
MAX8997_REG_MAINCON2 ,
MAX8997_REG_BUCKRAMP ,
MAX8997_REG_BUCK1CTRL ,
MAX8997_REG_BUCK1DVS1 ,
MAX8997_REG_BUCK1DVS2 ,
MAX8997_REG_BUCK1DVS3 ,
MAX8997_REG_BUCK1DVS4 ,
MAX8997_REG_BUCK1DVS5 ,
MAX8997_REG_BUCK1DVS6 ,
MAX8997_REG_BUCK1DVS7 ,
MAX8997_REG_BUCK1DVS8 ,
MAX8997_REG_BUCK2CTRL ,
MAX8997_REG_BUCK2DVS1 ,
MAX8997_REG_BUCK2DVS2 ,
MAX8997_REG_BUCK2DVS3 ,
MAX8997_REG_BUCK2DVS4 ,
MAX8997_REG_BUCK2DVS5 ,
MAX8997_REG_BUCK2DVS6 ,
MAX8997_REG_BUCK2DVS7 ,
MAX8997_REG_BUCK2DVS8 ,
MAX8997_REG_BUCK3CTRL ,
MAX8997_REG_BUCK3DVS ,
MAX8997_REG_BUCK4CTRL ,
MAX8997_REG_BUCK4DVS ,
MAX8997_REG_BUCK5CTRL ,
MAX8997_REG_BUCK5DVS1 ,
MAX8997_REG_BUCK5DVS2 ,
MAX8997_REG_BUCK5DVS3 ,
MAX8997_REG_BUCK5DVS4 ,
MAX8997_REG_BUCK5DVS5 ,
MAX8997_REG_BUCK5DVS6 ,
MAX8997_REG_BUCK5DVS7 ,
MAX8997_REG_BUCK5DVS8 ,
MAX8997_REG_BUCK6CTRL ,
MAX8997_REG_BUCK6BPSKIPCTRL ,
MAX8997_REG_BUCK7CTRL ,
MAX8997_REG_BUCK7DVS ,
MAX8997_REG_LDO1CTRL ,
MAX8997_REG_LDO2CTRL ,
MAX8997_REG_LDO3CTRL ,
MAX8997_REG_LDO4CTRL ,
MAX8997_REG_LDO5CTRL ,
MAX8997_REG_LDO6CTRL ,
MAX8997_REG_LDO7CTRL ,
MAX8997_REG_LDO8CTRL ,
MAX8997_REG_LDO9CTRL ,
MAX8997_REG_LDO10CTRL ,
MAX8997_REG_LDO11CTRL ,
MAX8997_REG_LDO12CTRL ,
MAX8997_REG_LDO13CTRL ,
MAX8997_REG_LDO14CTRL ,
MAX8997_REG_LDO15CTRL ,
MAX8997_REG_LDO16CTRL ,
MAX8997_REG_LDO17CTRL ,
MAX8997_REG_LDO18CTRL ,
MAX8997_REG_LDO21CTRL ,
MAX8997_REG_MBCCTRL1 ,
MAX8997_REG_MBCCTRL2 ,
MAX8997_REG_MBCCTRL3 ,
MAX8997_REG_MBCCTRL4 ,
MAX8997_REG_MBCCTRL5 ,
MAX8997_REG_MBCCTRL6 ,
MAX8997_REG_OTPCGHCVS ,
MAX8997_REG_SAFEOUTCTRL ,
MAX8997_REG_LBCNFG1 ,
MAX8997_REG_LBCNFG2 ,
MAX8997_REG_BBCCTRL ,
MAX8997_REG_FLASH1_CUR ,
MAX8997_REG_FLASH2_CUR ,
MAX8997_REG_MOVIE_CUR ,
MAX8997_REG_GSMB_CUR ,
MAX8997_REG_BOOST_CNTL ,
MAX8997_REG_LEN_CNTL ,
MAX8997_REG_FLASH_CNTL ,
MAX8997_REG_WDT_CNTL ,
MAX8997_REG_MAXFLASH1 ,
MAX8997_REG_MAXFLASH2 ,
MAX8997_REG_FLASHSTATUSMASK ,
MAX8997_REG_GPIOCNTL1 ,
MAX8997_REG_GPIOCNTL2 ,
MAX8997_REG_GPIOCNTL3 ,
MAX8997_REG_GPIOCNTL4 ,
MAX8997_REG_GPIOCNTL5 ,
MAX8997_REG_GPIOCNTL6 ,
MAX8997_REG_GPIOCNTL7 ,
MAX8997_REG_GPIOCNTL8 ,
MAX8997_REG_GPIOCNTL9 ,
MAX8997_REG_GPIOCNTL10 ,
MAX8997_REG_GPIOCNTL11 ,
MAX8997_REG_GPIOCNTL12 ,
MAX8997_REG_LDO1CONFIG ,
MAX8997_REG_LDO2CONFIG ,
MAX8997_REG_LDO3CONFIG ,
MAX8997_REG_LDO4CONFIG ,
MAX8997_REG_LDO5CONFIG ,
MAX8997_REG_LDO6CONFIG ,
MAX8997_REG_LDO7CONFIG ,
MAX8997_REG_LDO8CONFIG ,
MAX8997_REG_LDO9CONFIG ,
MAX8997_REG_LDO10CONFIG ,
MAX8997_REG_LDO11CONFIG ,
MAX8997_REG_LDO12CONFIG ,
MAX8997_REG_LDO13CONFIG ,
MAX8997_REG_LDO14CONFIG ,
MAX8997_REG_LDO15CONFIG ,
MAX8997_REG_LDO16CONFIG ,
MAX8997_REG_LDO17CONFIG ,
MAX8997_REG_LDO18CONFIG ,
MAX8997_REG_LDO21CONFIG ,
MAX8997_REG_DVSOKTIMER1 ,
MAX8997_REG_DVSOKTIMER2 ,
MAX8997_REG_DVSOKTIMER4 ,
MAX8997_REG_DVSOKTIMER5 ,
} ;
2012-06-04 15:09:07 +04:00
static u8 max8997_dumpaddr_muic [ ] = {
2011-03-04 09:50:26 +03:00
MAX8997_MUIC_REG_INTMASK1 ,
MAX8997_MUIC_REG_INTMASK2 ,
MAX8997_MUIC_REG_INTMASK3 ,
MAX8997_MUIC_REG_CDETCTRL ,
MAX8997_MUIC_REG_CONTROL1 ,
MAX8997_MUIC_REG_CONTROL2 ,
MAX8997_MUIC_REG_CONTROL3 ,
} ;
2012-06-04 15:09:07 +04:00
static u8 max8997_dumpaddr_haptic [ ] = {
2011-03-04 09:50:26 +03:00
MAX8997_HAPTIC_REG_CONF1 ,
MAX8997_HAPTIC_REG_CONF2 ,
MAX8997_HAPTIC_REG_DRVCONF ,
MAX8997_HAPTIC_REG_CYCLECONF1 ,
MAX8997_HAPTIC_REG_CYCLECONF2 ,
MAX8997_HAPTIC_REG_SIGCONF1 ,
MAX8997_HAPTIC_REG_SIGCONF2 ,
MAX8997_HAPTIC_REG_SIGCONF3 ,
MAX8997_HAPTIC_REG_SIGCONF4 ,
MAX8997_HAPTIC_REG_SIGDC1 ,
MAX8997_HAPTIC_REG_SIGDC2 ,
MAX8997_HAPTIC_REG_SIGPWMDC1 ,
MAX8997_HAPTIC_REG_SIGPWMDC2 ,
MAX8997_HAPTIC_REG_SIGPWMDC3 ,
MAX8997_HAPTIC_REG_SIGPWMDC4 ,
} ;
static int max8997_freeze ( struct device * dev )
{
2015-12-28 18:00:14 +03:00
struct i2c_client * i2c = to_i2c_client ( dev ) ;
2011-03-04 09:50:26 +03:00
struct max8997_dev * max8997 = i2c_get_clientdata ( i2c ) ;
int i ;
for ( i = 0 ; i < ARRAY_SIZE ( max8997_dumpaddr_pmic ) ; i + + )
max8997_read_reg ( i2c , max8997_dumpaddr_pmic [ i ] ,
& max8997 - > reg_dump [ i ] ) ;
for ( i = 0 ; i < ARRAY_SIZE ( max8997_dumpaddr_muic ) ; i + + )
max8997_read_reg ( i2c , max8997_dumpaddr_muic [ i ] ,
& max8997 - > reg_dump [ i + MAX8997_REG_PMIC_END ] ) ;
for ( i = 0 ; i < ARRAY_SIZE ( max8997_dumpaddr_haptic ) ; i + + )
max8997_read_reg ( i2c , max8997_dumpaddr_haptic [ i ] ,
& max8997 - > reg_dump [ i + MAX8997_REG_PMIC_END +
MAX8997_MUIC_REG_END ] ) ;
return 0 ;
}
static int max8997_restore ( struct device * dev )
{
2015-12-28 18:00:14 +03:00
struct i2c_client * i2c = to_i2c_client ( dev ) ;
2011-03-04 09:50:26 +03:00
struct max8997_dev * max8997 = i2c_get_clientdata ( i2c ) ;
int i ;
for ( i = 0 ; i < ARRAY_SIZE ( max8997_dumpaddr_pmic ) ; i + + )
max8997_write_reg ( i2c , max8997_dumpaddr_pmic [ i ] ,
max8997 - > reg_dump [ i ] ) ;
for ( i = 0 ; i < ARRAY_SIZE ( max8997_dumpaddr_muic ) ; i + + )
max8997_write_reg ( i2c , max8997_dumpaddr_muic [ i ] ,
max8997 - > reg_dump [ i + MAX8997_REG_PMIC_END ] ) ;
for ( i = 0 ; i < ARRAY_SIZE ( max8997_dumpaddr_haptic ) ; i + + )
max8997_write_reg ( i2c , max8997_dumpaddr_haptic [ i ] ,
max8997 - > reg_dump [ i + MAX8997_REG_PMIC_END +
MAX8997_MUIC_REG_END ] ) ;
return 0 ;
}
2011-08-19 09:39:40 +04:00
static int max8997_suspend ( struct device * dev )
{
2015-12-28 18:00:14 +03:00
struct i2c_client * i2c = to_i2c_client ( dev ) ;
2011-08-19 09:39:40 +04:00
struct max8997_dev * max8997 = i2c_get_clientdata ( i2c ) ;
2018-09-05 17:36:06 +03:00
disable_irq ( max8997 - > irq ) ;
2011-08-19 09:39:40 +04:00
if ( device_may_wakeup ( dev ) )
irq_set_irq_wake ( max8997 - > irq , 1 ) ;
return 0 ;
}
static int max8997_resume ( struct device * dev )
{
2015-12-28 18:00:14 +03:00
struct i2c_client * i2c = to_i2c_client ( dev ) ;
2011-08-19 09:39:40 +04:00
struct max8997_dev * max8997 = i2c_get_clientdata ( i2c ) ;
if ( device_may_wakeup ( dev ) )
irq_set_irq_wake ( max8997 - > irq , 0 ) ;
2018-09-05 17:36:06 +03:00
enable_irq ( max8997 - > irq ) ;
2011-08-19 09:39:40 +04:00
return max8997_irq_resume ( max8997 ) ;
}
2012-06-04 15:09:07 +04:00
static const struct dev_pm_ops max8997_pm = {
2011-08-19 09:39:40 +04:00
. suspend = max8997_suspend ,
. resume = max8997_resume ,
2011-03-04 09:50:26 +03:00
. freeze = max8997_freeze ,
. restore = max8997_restore ,
} ;
static struct i2c_driver max8997_i2c_driver = {
. driver = {
. name = " max8997 " ,
. pm = & max8997_pm ,
2016-06-03 03:39:47 +03:00
. suppress_bind_attrs = true ,
2012-11-27 12:34:32 +04:00
. of_match_table = of_match_ptr ( max8997_pmic_dt_match ) ,
2011-03-04 09:50:26 +03:00
} ,
2022-11-19 01:42:58 +03:00
. probe_new = max8997_i2c_probe ,
2011-03-04 09:50:26 +03:00
. id_table = max8997_i2c_id ,
} ;
static int __init max8997_i2c_init ( void )
{
return i2c_add_driver ( & max8997_i2c_driver ) ;
}
/* init early so consumer devices can complete system boot */
subsys_initcall ( max8997_i2c_init ) ;