162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 262306a36Sopenharmony_ci// 362306a36Sopenharmony_ci// max8998.c - mfd core driver for the Maxim 8998 462306a36Sopenharmony_ci// 562306a36Sopenharmony_ci// Copyright (C) 2009-2010 Samsung Electronics 662306a36Sopenharmony_ci// Kyungmin Park <kyungmin.park@samsung.com> 762306a36Sopenharmony_ci// Marek Szyprowski <m.szyprowski@samsung.com> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/err.h> 1062306a36Sopenharmony_ci#include <linux/init.h> 1162306a36Sopenharmony_ci#include <linux/slab.h> 1262306a36Sopenharmony_ci#include <linux/i2c.h> 1362306a36Sopenharmony_ci#include <linux/interrupt.h> 1462306a36Sopenharmony_ci#include <linux/of.h> 1562306a36Sopenharmony_ci#include <linux/of_irq.h> 1662306a36Sopenharmony_ci#include <linux/pm_runtime.h> 1762306a36Sopenharmony_ci#include <linux/mutex.h> 1862306a36Sopenharmony_ci#include <linux/mfd/core.h> 1962306a36Sopenharmony_ci#include <linux/mfd/max8998.h> 2062306a36Sopenharmony_ci#include <linux/mfd/max8998-private.h> 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#define RTC_I2C_ADDR (0x0c >> 1) 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cistatic const struct mfd_cell max8998_devs[] = { 2562306a36Sopenharmony_ci { 2662306a36Sopenharmony_ci .name = "max8998-pmic", 2762306a36Sopenharmony_ci }, { 2862306a36Sopenharmony_ci .name = "max8998-rtc", 2962306a36Sopenharmony_ci }, { 3062306a36Sopenharmony_ci .name = "max8998-battery", 3162306a36Sopenharmony_ci }, 3262306a36Sopenharmony_ci}; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_cistatic const struct mfd_cell lp3974_devs[] = { 3562306a36Sopenharmony_ci { 3662306a36Sopenharmony_ci .name = "lp3974-pmic", 3762306a36Sopenharmony_ci }, { 3862306a36Sopenharmony_ci .name = "lp3974-rtc", 3962306a36Sopenharmony_ci }, 4062306a36Sopenharmony_ci}; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ciint max8998_read_reg(struct i2c_client *i2c, u8 reg, u8 *dest) 4362306a36Sopenharmony_ci{ 4462306a36Sopenharmony_ci struct max8998_dev *max8998 = i2c_get_clientdata(i2c); 4562306a36Sopenharmony_ci int ret; 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci mutex_lock(&max8998->iolock); 4862306a36Sopenharmony_ci ret = i2c_smbus_read_byte_data(i2c, reg); 4962306a36Sopenharmony_ci mutex_unlock(&max8998->iolock); 5062306a36Sopenharmony_ci if (ret < 0) 5162306a36Sopenharmony_ci return ret; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci ret &= 0xff; 5462306a36Sopenharmony_ci *dest = ret; 5562306a36Sopenharmony_ci return 0; 5662306a36Sopenharmony_ci} 5762306a36Sopenharmony_ciEXPORT_SYMBOL(max8998_read_reg); 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ciint max8998_bulk_read(struct i2c_client *i2c, u8 reg, int count, u8 *buf) 6062306a36Sopenharmony_ci{ 6162306a36Sopenharmony_ci struct max8998_dev *max8998 = i2c_get_clientdata(i2c); 6262306a36Sopenharmony_ci int ret; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci mutex_lock(&max8998->iolock); 6562306a36Sopenharmony_ci ret = i2c_smbus_read_i2c_block_data(i2c, reg, count, buf); 6662306a36Sopenharmony_ci mutex_unlock(&max8998->iolock); 6762306a36Sopenharmony_ci if (ret < 0) 6862306a36Sopenharmony_ci return ret; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci return 0; 7162306a36Sopenharmony_ci} 7262306a36Sopenharmony_ciEXPORT_SYMBOL(max8998_bulk_read); 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ciint max8998_write_reg(struct i2c_client *i2c, u8 reg, u8 value) 7562306a36Sopenharmony_ci{ 7662306a36Sopenharmony_ci struct max8998_dev *max8998 = i2c_get_clientdata(i2c); 7762306a36Sopenharmony_ci int ret; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci mutex_lock(&max8998->iolock); 8062306a36Sopenharmony_ci ret = i2c_smbus_write_byte_data(i2c, reg, value); 8162306a36Sopenharmony_ci mutex_unlock(&max8998->iolock); 8262306a36Sopenharmony_ci return ret; 8362306a36Sopenharmony_ci} 8462306a36Sopenharmony_ciEXPORT_SYMBOL(max8998_write_reg); 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ciint max8998_bulk_write(struct i2c_client *i2c, u8 reg, int count, u8 *buf) 8762306a36Sopenharmony_ci{ 8862306a36Sopenharmony_ci struct max8998_dev *max8998 = i2c_get_clientdata(i2c); 8962306a36Sopenharmony_ci int ret; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci mutex_lock(&max8998->iolock); 9262306a36Sopenharmony_ci ret = i2c_smbus_write_i2c_block_data(i2c, reg, count, buf); 9362306a36Sopenharmony_ci mutex_unlock(&max8998->iolock); 9462306a36Sopenharmony_ci if (ret < 0) 9562306a36Sopenharmony_ci return ret; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci return 0; 9862306a36Sopenharmony_ci} 9962306a36Sopenharmony_ciEXPORT_SYMBOL(max8998_bulk_write); 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ciint max8998_update_reg(struct i2c_client *i2c, u8 reg, u8 val, u8 mask) 10262306a36Sopenharmony_ci{ 10362306a36Sopenharmony_ci struct max8998_dev *max8998 = i2c_get_clientdata(i2c); 10462306a36Sopenharmony_ci int ret; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci mutex_lock(&max8998->iolock); 10762306a36Sopenharmony_ci ret = i2c_smbus_read_byte_data(i2c, reg); 10862306a36Sopenharmony_ci if (ret >= 0) { 10962306a36Sopenharmony_ci u8 old_val = ret & 0xff; 11062306a36Sopenharmony_ci u8 new_val = (val & mask) | (old_val & (~mask)); 11162306a36Sopenharmony_ci ret = i2c_smbus_write_byte_data(i2c, reg, new_val); 11262306a36Sopenharmony_ci } 11362306a36Sopenharmony_ci mutex_unlock(&max8998->iolock); 11462306a36Sopenharmony_ci return ret; 11562306a36Sopenharmony_ci} 11662306a36Sopenharmony_ciEXPORT_SYMBOL(max8998_update_reg); 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci#ifdef CONFIG_OF 11962306a36Sopenharmony_cistatic const struct of_device_id max8998_dt_match[] = { 12062306a36Sopenharmony_ci { .compatible = "maxim,max8998", .data = (void *)TYPE_MAX8998 }, 12162306a36Sopenharmony_ci { .compatible = "national,lp3974", .data = (void *)TYPE_LP3974 }, 12262306a36Sopenharmony_ci { .compatible = "ti,lp3974", .data = (void *)TYPE_LP3974 }, 12362306a36Sopenharmony_ci {}, 12462306a36Sopenharmony_ci}; 12562306a36Sopenharmony_ci#endif 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci/* 12862306a36Sopenharmony_ci * Only the common platform data elements for max8998 are parsed here from the 12962306a36Sopenharmony_ci * device tree. Other sub-modules of max8998 such as pmic, rtc and others have 13062306a36Sopenharmony_ci * to parse their own platform data elements from device tree. 13162306a36Sopenharmony_ci * 13262306a36Sopenharmony_ci * The max8998 platform data structure is instantiated here and the drivers for 13362306a36Sopenharmony_ci * the sub-modules need not instantiate another instance while parsing their 13462306a36Sopenharmony_ci * platform data. 13562306a36Sopenharmony_ci */ 13662306a36Sopenharmony_cistatic struct max8998_platform_data *max8998_i2c_parse_dt_pdata( 13762306a36Sopenharmony_ci struct device *dev) 13862306a36Sopenharmony_ci{ 13962306a36Sopenharmony_ci struct max8998_platform_data *pd; 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL); 14262306a36Sopenharmony_ci if (!pd) 14362306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci pd->ono = irq_of_parse_and_map(dev->of_node, 1); 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci /* 14862306a36Sopenharmony_ci * ToDo: the 'wakeup' member in the platform data is more of a linux 14962306a36Sopenharmony_ci * specfic information. Hence, there is no binding for that yet and 15062306a36Sopenharmony_ci * not parsed here. 15162306a36Sopenharmony_ci */ 15262306a36Sopenharmony_ci return pd; 15362306a36Sopenharmony_ci} 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_cistatic inline unsigned long max8998_i2c_get_driver_data(struct i2c_client *i2c, 15662306a36Sopenharmony_ci const struct i2c_device_id *id) 15762306a36Sopenharmony_ci{ 15862306a36Sopenharmony_ci if (i2c->dev.of_node) 15962306a36Sopenharmony_ci return (unsigned long)of_device_get_match_data(&i2c->dev); 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci return id->driver_data; 16262306a36Sopenharmony_ci} 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_cistatic int max8998_i2c_probe(struct i2c_client *i2c) 16562306a36Sopenharmony_ci{ 16662306a36Sopenharmony_ci const struct i2c_device_id *id = i2c_client_get_device_id(i2c); 16762306a36Sopenharmony_ci struct max8998_platform_data *pdata = dev_get_platdata(&i2c->dev); 16862306a36Sopenharmony_ci struct max8998_dev *max8998; 16962306a36Sopenharmony_ci int ret = 0; 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci max8998 = devm_kzalloc(&i2c->dev, sizeof(struct max8998_dev), 17262306a36Sopenharmony_ci GFP_KERNEL); 17362306a36Sopenharmony_ci if (max8998 == NULL) 17462306a36Sopenharmony_ci return -ENOMEM; 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci if (IS_ENABLED(CONFIG_OF) && i2c->dev.of_node) { 17762306a36Sopenharmony_ci pdata = max8998_i2c_parse_dt_pdata(&i2c->dev); 17862306a36Sopenharmony_ci if (IS_ERR(pdata)) 17962306a36Sopenharmony_ci return PTR_ERR(pdata); 18062306a36Sopenharmony_ci } 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci i2c_set_clientdata(i2c, max8998); 18362306a36Sopenharmony_ci max8998->dev = &i2c->dev; 18462306a36Sopenharmony_ci max8998->i2c = i2c; 18562306a36Sopenharmony_ci max8998->irq = i2c->irq; 18662306a36Sopenharmony_ci max8998->type = max8998_i2c_get_driver_data(i2c, id); 18762306a36Sopenharmony_ci max8998->pdata = pdata; 18862306a36Sopenharmony_ci if (pdata) { 18962306a36Sopenharmony_ci max8998->ono = pdata->ono; 19062306a36Sopenharmony_ci max8998->irq_base = pdata->irq_base; 19162306a36Sopenharmony_ci max8998->wakeup = pdata->wakeup; 19262306a36Sopenharmony_ci } 19362306a36Sopenharmony_ci mutex_init(&max8998->iolock); 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci max8998->rtc = i2c_new_dummy_device(i2c->adapter, RTC_I2C_ADDR); 19662306a36Sopenharmony_ci if (IS_ERR(max8998->rtc)) { 19762306a36Sopenharmony_ci dev_err(&i2c->dev, "Failed to allocate I2C device for RTC\n"); 19862306a36Sopenharmony_ci return PTR_ERR(max8998->rtc); 19962306a36Sopenharmony_ci } 20062306a36Sopenharmony_ci i2c_set_clientdata(max8998->rtc, max8998); 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci max8998_irq_init(max8998); 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci pm_runtime_set_active(max8998->dev); 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci switch (max8998->type) { 20762306a36Sopenharmony_ci case TYPE_LP3974: 20862306a36Sopenharmony_ci ret = mfd_add_devices(max8998->dev, -1, 20962306a36Sopenharmony_ci lp3974_devs, ARRAY_SIZE(lp3974_devs), 21062306a36Sopenharmony_ci NULL, 0, NULL); 21162306a36Sopenharmony_ci break; 21262306a36Sopenharmony_ci case TYPE_MAX8998: 21362306a36Sopenharmony_ci ret = mfd_add_devices(max8998->dev, -1, 21462306a36Sopenharmony_ci max8998_devs, ARRAY_SIZE(max8998_devs), 21562306a36Sopenharmony_ci NULL, 0, NULL); 21662306a36Sopenharmony_ci break; 21762306a36Sopenharmony_ci default: 21862306a36Sopenharmony_ci ret = -EINVAL; 21962306a36Sopenharmony_ci } 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci if (ret < 0) 22262306a36Sopenharmony_ci goto err; 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_ci device_init_wakeup(max8998->dev, max8998->wakeup); 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_ci return ret; 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_cierr: 22962306a36Sopenharmony_ci mfd_remove_devices(max8998->dev); 23062306a36Sopenharmony_ci max8998_irq_exit(max8998); 23162306a36Sopenharmony_ci i2c_unregister_device(max8998->rtc); 23262306a36Sopenharmony_ci return ret; 23362306a36Sopenharmony_ci} 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_cistatic const struct i2c_device_id max8998_i2c_id[] = { 23662306a36Sopenharmony_ci { "max8998", TYPE_MAX8998 }, 23762306a36Sopenharmony_ci { "lp3974", TYPE_LP3974}, 23862306a36Sopenharmony_ci { } 23962306a36Sopenharmony_ci}; 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_cistatic int max8998_suspend(struct device *dev) 24262306a36Sopenharmony_ci{ 24362306a36Sopenharmony_ci struct i2c_client *i2c = to_i2c_client(dev); 24462306a36Sopenharmony_ci struct max8998_dev *max8998 = i2c_get_clientdata(i2c); 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci if (device_may_wakeup(dev)) 24762306a36Sopenharmony_ci irq_set_irq_wake(max8998->irq, 1); 24862306a36Sopenharmony_ci return 0; 24962306a36Sopenharmony_ci} 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_cistatic int max8998_resume(struct device *dev) 25262306a36Sopenharmony_ci{ 25362306a36Sopenharmony_ci struct i2c_client *i2c = to_i2c_client(dev); 25462306a36Sopenharmony_ci struct max8998_dev *max8998 = i2c_get_clientdata(i2c); 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci if (device_may_wakeup(dev)) 25762306a36Sopenharmony_ci irq_set_irq_wake(max8998->irq, 0); 25862306a36Sopenharmony_ci /* 25962306a36Sopenharmony_ci * In LP3974, if IRQ registers are not "read & clear" 26062306a36Sopenharmony_ci * when it's set during sleep, the interrupt becomes 26162306a36Sopenharmony_ci * disabled. 26262306a36Sopenharmony_ci */ 26362306a36Sopenharmony_ci return max8998_irq_resume(i2c_get_clientdata(i2c)); 26462306a36Sopenharmony_ci} 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_cistruct max8998_reg_dump { 26762306a36Sopenharmony_ci u8 addr; 26862306a36Sopenharmony_ci u8 val; 26962306a36Sopenharmony_ci}; 27062306a36Sopenharmony_ci#define SAVE_ITEM(x) { .addr = (x), .val = 0x0, } 27162306a36Sopenharmony_cistatic struct max8998_reg_dump max8998_dump[] = { 27262306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_IRQM1), 27362306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_IRQM2), 27462306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_IRQM3), 27562306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_IRQM4), 27662306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_STATUSM1), 27762306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_STATUSM2), 27862306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_CHGR1), 27962306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_CHGR2), 28062306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_LDO_ACTIVE_DISCHARGE1), 28162306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_LDO_ACTIVE_DISCHARGE1), 28262306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_BUCK_ACTIVE_DISCHARGE3), 28362306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_ONOFF1), 28462306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_ONOFF2), 28562306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_ONOFF3), 28662306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_ONOFF4), 28762306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_BUCK1_VOLTAGE1), 28862306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_BUCK1_VOLTAGE2), 28962306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_BUCK1_VOLTAGE3), 29062306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_BUCK1_VOLTAGE4), 29162306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_BUCK2_VOLTAGE1), 29262306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_BUCK2_VOLTAGE2), 29362306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_LDO2_LDO3), 29462306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_LDO4), 29562306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_LDO5), 29662306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_LDO6), 29762306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_LDO7), 29862306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_LDO8_LDO9), 29962306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_LDO10_LDO11), 30062306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_LDO12), 30162306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_LDO13), 30262306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_LDO14), 30362306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_LDO15), 30462306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_LDO16), 30562306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_LDO17), 30662306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_BKCHR), 30762306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_LBCNFG1), 30862306a36Sopenharmony_ci SAVE_ITEM(MAX8998_REG_LBCNFG2), 30962306a36Sopenharmony_ci}; 31062306a36Sopenharmony_ci/* Save registers before hibernation */ 31162306a36Sopenharmony_cistatic int max8998_freeze(struct device *dev) 31262306a36Sopenharmony_ci{ 31362306a36Sopenharmony_ci struct i2c_client *i2c = to_i2c_client(dev); 31462306a36Sopenharmony_ci int i; 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(max8998_dump); i++) 31762306a36Sopenharmony_ci max8998_read_reg(i2c, max8998_dump[i].addr, 31862306a36Sopenharmony_ci &max8998_dump[i].val); 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_ci return 0; 32162306a36Sopenharmony_ci} 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_ci/* Restore registers after hibernation */ 32462306a36Sopenharmony_cistatic int max8998_restore(struct device *dev) 32562306a36Sopenharmony_ci{ 32662306a36Sopenharmony_ci struct i2c_client *i2c = to_i2c_client(dev); 32762306a36Sopenharmony_ci int i; 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(max8998_dump); i++) 33062306a36Sopenharmony_ci max8998_write_reg(i2c, max8998_dump[i].addr, 33162306a36Sopenharmony_ci max8998_dump[i].val); 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_ci return 0; 33462306a36Sopenharmony_ci} 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_cistatic const struct dev_pm_ops max8998_pm = { 33762306a36Sopenharmony_ci .suspend = max8998_suspend, 33862306a36Sopenharmony_ci .resume = max8998_resume, 33962306a36Sopenharmony_ci .freeze = max8998_freeze, 34062306a36Sopenharmony_ci .restore = max8998_restore, 34162306a36Sopenharmony_ci}; 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_cistatic struct i2c_driver max8998_i2c_driver = { 34462306a36Sopenharmony_ci .driver = { 34562306a36Sopenharmony_ci .name = "max8998", 34662306a36Sopenharmony_ci .pm = &max8998_pm, 34762306a36Sopenharmony_ci .suppress_bind_attrs = true, 34862306a36Sopenharmony_ci .of_match_table = of_match_ptr(max8998_dt_match), 34962306a36Sopenharmony_ci }, 35062306a36Sopenharmony_ci .probe = max8998_i2c_probe, 35162306a36Sopenharmony_ci .id_table = max8998_i2c_id, 35262306a36Sopenharmony_ci}; 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_cistatic int __init max8998_i2c_init(void) 35562306a36Sopenharmony_ci{ 35662306a36Sopenharmony_ci return i2c_add_driver(&max8998_i2c_driver); 35762306a36Sopenharmony_ci} 35862306a36Sopenharmony_ci/* init early so consumer devices can complete system boot */ 35962306a36Sopenharmony_cisubsys_initcall(max8998_i2c_init); 360