^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) //
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) // max8998.c - mfd core driver for the Maxim 8998
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) //
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) // Copyright (C) 2009-2010 Samsung Electronics
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) // Kyungmin Park <kyungmin.park@samsung.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) // Marek Szyprowski <m.szyprowski@samsung.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/err.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/of.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/of_irq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/pm_runtime.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/mutex.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/mfd/core.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/mfd/max8998.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/mfd/max8998-private.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define RTC_I2C_ADDR (0x0c >> 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) static const struct mfd_cell max8998_devs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) .name = "max8998-pmic",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) .name = "max8998-rtc",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) .name = "max8998-battery",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) static const struct mfd_cell lp3974_devs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) .name = "lp3974-pmic",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) .name = "lp3974-rtc",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) int max8998_read_reg(struct i2c_client *i2c, u8 reg, u8 *dest)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) struct max8998_dev *max8998 = i2c_get_clientdata(i2c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) mutex_lock(&max8998->iolock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) ret = i2c_smbus_read_byte_data(i2c, reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) mutex_unlock(&max8998->iolock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) ret &= 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) *dest = ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) EXPORT_SYMBOL(max8998_read_reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) int max8998_bulk_read(struct i2c_client *i2c, u8 reg, int count, u8 *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) struct max8998_dev *max8998 = i2c_get_clientdata(i2c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) mutex_lock(&max8998->iolock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) ret = i2c_smbus_read_i2c_block_data(i2c, reg, count, buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) mutex_unlock(&max8998->iolock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) EXPORT_SYMBOL(max8998_bulk_read);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) int max8998_write_reg(struct i2c_client *i2c, u8 reg, u8 value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) struct max8998_dev *max8998 = i2c_get_clientdata(i2c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) mutex_lock(&max8998->iolock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) ret = i2c_smbus_write_byte_data(i2c, reg, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) mutex_unlock(&max8998->iolock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) EXPORT_SYMBOL(max8998_write_reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) int max8998_bulk_write(struct i2c_client *i2c, u8 reg, int count, u8 *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) struct max8998_dev *max8998 = i2c_get_clientdata(i2c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) mutex_lock(&max8998->iolock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) ret = i2c_smbus_write_i2c_block_data(i2c, reg, count, buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) mutex_unlock(&max8998->iolock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) EXPORT_SYMBOL(max8998_bulk_write);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) int max8998_update_reg(struct i2c_client *i2c, u8 reg, u8 val, u8 mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) struct max8998_dev *max8998 = i2c_get_clientdata(i2c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) mutex_lock(&max8998->iolock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) ret = i2c_smbus_read_byte_data(i2c, reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) if (ret >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) u8 old_val = ret & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) u8 new_val = (val & mask) | (old_val & (~mask));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) ret = i2c_smbus_write_byte_data(i2c, reg, new_val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) mutex_unlock(&max8998->iolock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) EXPORT_SYMBOL(max8998_update_reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #ifdef CONFIG_OF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) static const struct of_device_id max8998_dt_match[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) { .compatible = "maxim,max8998", .data = (void *)TYPE_MAX8998 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) { .compatible = "national,lp3974", .data = (void *)TYPE_LP3974 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) { .compatible = "ti,lp3974", .data = (void *)TYPE_LP3974 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) {},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) * Only the common platform data elements for max8998 are parsed here from the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) * device tree. Other sub-modules of max8998 such as pmic, rtc and others have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) * to parse their own platform data elements from device tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) * The max8998 platform data structure is instantiated here and the drivers for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) * the sub-modules need not instantiate another instance while parsing their
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) * platform data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) static struct max8998_platform_data *max8998_i2c_parse_dt_pdata(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) struct max8998_platform_data *pd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) if (!pd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) pd->ono = irq_of_parse_and_map(dev->of_node, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) * ToDo: the 'wakeup' member in the platform data is more of a linux
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) * specfic information. Hence, there is no binding for that yet and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) * not parsed here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) return pd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) static inline unsigned long max8998_i2c_get_driver_data(struct i2c_client *i2c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) const struct i2c_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) if (IS_ENABLED(CONFIG_OF) && i2c->dev.of_node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) const struct of_device_id *match;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) match = of_match_node(max8998_dt_match, i2c->dev.of_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) return (unsigned long)match->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) return id->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) static int max8998_i2c_probe(struct i2c_client *i2c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) const struct i2c_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) struct max8998_platform_data *pdata = dev_get_platdata(&i2c->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) struct max8998_dev *max8998;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) max8998 = devm_kzalloc(&i2c->dev, sizeof(struct max8998_dev),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) if (max8998 == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) if (IS_ENABLED(CONFIG_OF) && i2c->dev.of_node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) pdata = max8998_i2c_parse_dt_pdata(&i2c->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) if (IS_ERR(pdata))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) return PTR_ERR(pdata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) i2c_set_clientdata(i2c, max8998);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) max8998->dev = &i2c->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) max8998->i2c = i2c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) max8998->irq = i2c->irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) max8998->type = max8998_i2c_get_driver_data(i2c, id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) max8998->pdata = pdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) if (pdata) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) max8998->ono = pdata->ono;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) max8998->irq_base = pdata->irq_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) max8998->wakeup = pdata->wakeup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) mutex_init(&max8998->iolock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) max8998->rtc = i2c_new_dummy_device(i2c->adapter, RTC_I2C_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) if (IS_ERR(max8998->rtc)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) dev_err(&i2c->dev, "Failed to allocate I2C device for RTC\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) return PTR_ERR(max8998->rtc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) i2c_set_clientdata(max8998->rtc, max8998);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) max8998_irq_init(max8998);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) pm_runtime_set_active(max8998->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) switch (max8998->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) case TYPE_LP3974:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) ret = mfd_add_devices(max8998->dev, -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) lp3974_devs, ARRAY_SIZE(lp3974_devs),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) NULL, 0, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) case TYPE_MAX8998:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) ret = mfd_add_devices(max8998->dev, -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) max8998_devs, ARRAY_SIZE(max8998_devs),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) NULL, 0, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) device_init_wakeup(max8998->dev, max8998->wakeup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) mfd_remove_devices(max8998->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) max8998_irq_exit(max8998);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) i2c_unregister_device(max8998->rtc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) static const struct i2c_device_id max8998_i2c_id[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) { "max8998", TYPE_MAX8998 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) { "lp3974", TYPE_LP3974},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) static int max8998_suspend(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) struct i2c_client *i2c = to_i2c_client(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) struct max8998_dev *max8998 = i2c_get_clientdata(i2c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) if (device_may_wakeup(dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) irq_set_irq_wake(max8998->irq, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) static int max8998_resume(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) struct i2c_client *i2c = to_i2c_client(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) struct max8998_dev *max8998 = i2c_get_clientdata(i2c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) if (device_may_wakeup(dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) irq_set_irq_wake(max8998->irq, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) * In LP3974, if IRQ registers are not "read & clear"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) * when it's set during sleep, the interrupt becomes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) * disabled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) return max8998_irq_resume(i2c_get_clientdata(i2c));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) struct max8998_reg_dump {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) u8 addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) #define SAVE_ITEM(x) { .addr = (x), .val = 0x0, }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) static struct max8998_reg_dump max8998_dump[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) SAVE_ITEM(MAX8998_REG_IRQM1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) SAVE_ITEM(MAX8998_REG_IRQM2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) SAVE_ITEM(MAX8998_REG_IRQM3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) SAVE_ITEM(MAX8998_REG_IRQM4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) SAVE_ITEM(MAX8998_REG_STATUSM1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) SAVE_ITEM(MAX8998_REG_STATUSM2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) SAVE_ITEM(MAX8998_REG_CHGR1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) SAVE_ITEM(MAX8998_REG_CHGR2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) SAVE_ITEM(MAX8998_REG_LDO_ACTIVE_DISCHARGE1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) SAVE_ITEM(MAX8998_REG_LDO_ACTIVE_DISCHARGE1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) SAVE_ITEM(MAX8998_REG_BUCK_ACTIVE_DISCHARGE3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) SAVE_ITEM(MAX8998_REG_ONOFF1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) SAVE_ITEM(MAX8998_REG_ONOFF2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) SAVE_ITEM(MAX8998_REG_ONOFF3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) SAVE_ITEM(MAX8998_REG_ONOFF4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) SAVE_ITEM(MAX8998_REG_BUCK1_VOLTAGE1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) SAVE_ITEM(MAX8998_REG_BUCK1_VOLTAGE2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) SAVE_ITEM(MAX8998_REG_BUCK1_VOLTAGE3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) SAVE_ITEM(MAX8998_REG_BUCK1_VOLTAGE4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) SAVE_ITEM(MAX8998_REG_BUCK2_VOLTAGE1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) SAVE_ITEM(MAX8998_REG_BUCK2_VOLTAGE2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) SAVE_ITEM(MAX8998_REG_LDO2_LDO3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) SAVE_ITEM(MAX8998_REG_LDO4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) SAVE_ITEM(MAX8998_REG_LDO5),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) SAVE_ITEM(MAX8998_REG_LDO6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) SAVE_ITEM(MAX8998_REG_LDO7),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) SAVE_ITEM(MAX8998_REG_LDO8_LDO9),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) SAVE_ITEM(MAX8998_REG_LDO10_LDO11),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) SAVE_ITEM(MAX8998_REG_LDO12),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) SAVE_ITEM(MAX8998_REG_LDO13),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) SAVE_ITEM(MAX8998_REG_LDO14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) SAVE_ITEM(MAX8998_REG_LDO15),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) SAVE_ITEM(MAX8998_REG_LDO16),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) SAVE_ITEM(MAX8998_REG_LDO17),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) SAVE_ITEM(MAX8998_REG_BKCHR),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) SAVE_ITEM(MAX8998_REG_LBCNFG1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) SAVE_ITEM(MAX8998_REG_LBCNFG2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) /* Save registers before hibernation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) static int max8998_freeze(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) struct i2c_client *i2c = to_i2c_client(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) for (i = 0; i < ARRAY_SIZE(max8998_dump); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) max8998_read_reg(i2c, max8998_dump[i].addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) &max8998_dump[i].val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) /* Restore registers after hibernation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) static int max8998_restore(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) struct i2c_client *i2c = to_i2c_client(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) for (i = 0; i < ARRAY_SIZE(max8998_dump); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) max8998_write_reg(i2c, max8998_dump[i].addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) max8998_dump[i].val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) static const struct dev_pm_ops max8998_pm = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) .suspend = max8998_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) .resume = max8998_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) .freeze = max8998_freeze,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) .restore = max8998_restore,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) static struct i2c_driver max8998_i2c_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) .name = "max8998",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) .pm = &max8998_pm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) .suppress_bind_attrs = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) .of_match_table = of_match_ptr(max8998_dt_match),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) .probe = max8998_i2c_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) .id_table = max8998_i2c_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) static int __init max8998_i2c_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) return i2c_add_driver(&max8998_i2c_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) /* init early so consumer devices can complete system boot */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) subsys_initcall(max8998_i2c_init);