1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * max8907.c - mfd driver for MAX8907 4 * 5 * Copyright (C) 2010 Gyungoh Yoo <jack.yoo@maxim-ic.com> 6 * Copyright (C) 2010-2012, NVIDIA CORPORATION. All rights reserved. 7 */ 8 9 #include <linux/err.h> 10 #include <linux/i2c.h> 11 #include <linux/init.h> 12 #include <linux/interrupt.h> 13 #include <linux/irq.h> 14 #include <linux/mfd/core.h> 15 #include <linux/mfd/max8907.h> 16 #include <linux/module.h> 17 #include <linux/of.h> 18 #include <linux/of_device.h> 19 #include <linux/regmap.h> 20 #include <linux/slab.h> 21 22 static const struct mfd_cell max8907_cells[] = { 23 { .name = "max8907-regulator", }, 24 { .name = "max8907-rtc", }, 25 }; 26 27 static bool max8907_gen_is_volatile_reg(struct device *dev, unsigned int reg) 28 { 29 switch (reg) { 30 case MAX8907_REG_ON_OFF_IRQ1: 31 case MAX8907_REG_ON_OFF_STAT: 32 case MAX8907_REG_ON_OFF_IRQ2: 33 case MAX8907_REG_CHG_IRQ1: 34 case MAX8907_REG_CHG_IRQ2: 35 case MAX8907_REG_CHG_STAT: 36 return true; 37 default: 38 return false; 39 } 40 } 41 42 static bool max8907_gen_is_precious_reg(struct device *dev, unsigned int reg) 43 { 44 switch (reg) { 45 case MAX8907_REG_ON_OFF_IRQ1: 46 case MAX8907_REG_ON_OFF_IRQ2: 47 case MAX8907_REG_CHG_IRQ1: 48 case MAX8907_REG_CHG_IRQ2: 49 return true; 50 default: 51 return false; 52 } 53 } 54 55 static bool max8907_gen_is_writeable_reg(struct device *dev, unsigned int reg) 56 { 57 return !max8907_gen_is_volatile_reg(dev, reg); 58 } 59 60 static const struct regmap_config max8907_regmap_gen_config = { 61 .reg_bits = 8, 62 .val_bits = 8, 63 .volatile_reg = max8907_gen_is_volatile_reg, 64 .precious_reg = max8907_gen_is_precious_reg, 65 .writeable_reg = max8907_gen_is_writeable_reg, 66 .max_register = MAX8907_REG_LDO20VOUT, 67 .cache_type = REGCACHE_RBTREE, 68 }; 69 70 static bool max8907_rtc_is_volatile_reg(struct device *dev, unsigned int reg) 71 { 72 if (reg <= MAX8907_REG_RTC_YEAR2) 73 return true; 74 75 switch (reg) { 76 case MAX8907_REG_RTC_STATUS: 77 case MAX8907_REG_RTC_IRQ: 78 return true; 79 default: 80 return false; 81 } 82 } 83 84 static bool max8907_rtc_is_precious_reg(struct device *dev, unsigned int reg) 85 { 86 switch (reg) { 87 case MAX8907_REG_RTC_IRQ: 88 return true; 89 default: 90 return false; 91 } 92 } 93 94 static bool max8907_rtc_is_writeable_reg(struct device *dev, unsigned int reg) 95 { 96 switch (reg) { 97 case MAX8907_REG_RTC_STATUS: 98 case MAX8907_REG_RTC_IRQ: 99 return false; 100 default: 101 return true; 102 } 103 } 104 105 static const struct regmap_config max8907_regmap_rtc_config = { 106 .reg_bits = 8, 107 .val_bits = 8, 108 .volatile_reg = max8907_rtc_is_volatile_reg, 109 .precious_reg = max8907_rtc_is_precious_reg, 110 .writeable_reg = max8907_rtc_is_writeable_reg, 111 .max_register = MAX8907_REG_MPL_CNTL, 112 .cache_type = REGCACHE_RBTREE, 113 }; 114 115 static const struct regmap_irq max8907_chg_irqs[] = { 116 { .reg_offset = 0, .mask = 1 << 0, }, 117 { .reg_offset = 0, .mask = 1 << 1, }, 118 { .reg_offset = 0, .mask = 1 << 2, }, 119 { .reg_offset = 1, .mask = 1 << 0, }, 120 { .reg_offset = 1, .mask = 1 << 1, }, 121 { .reg_offset = 1, .mask = 1 << 2, }, 122 { .reg_offset = 1, .mask = 1 << 3, }, 123 { .reg_offset = 1, .mask = 1 << 4, }, 124 { .reg_offset = 1, .mask = 1 << 5, }, 125 { .reg_offset = 1, .mask = 1 << 6, }, 126 { .reg_offset = 1, .mask = 1 << 7, }, 127 }; 128 129 static const struct regmap_irq_chip max8907_chg_irq_chip = { 130 .name = "max8907 chg", 131 .status_base = MAX8907_REG_CHG_IRQ1, 132 .mask_base = MAX8907_REG_CHG_IRQ1_MASK, 133 .wake_base = MAX8907_REG_CHG_IRQ1_MASK, 134 .irq_reg_stride = MAX8907_REG_CHG_IRQ2 - MAX8907_REG_CHG_IRQ1, 135 .num_regs = 2, 136 .irqs = max8907_chg_irqs, 137 .num_irqs = ARRAY_SIZE(max8907_chg_irqs), 138 }; 139 140 static const struct regmap_irq max8907_on_off_irqs[] = { 141 { .reg_offset = 0, .mask = 1 << 0, }, 142 { .reg_offset = 0, .mask = 1 << 1, }, 143 { .reg_offset = 0, .mask = 1 << 2, }, 144 { .reg_offset = 0, .mask = 1 << 3, }, 145 { .reg_offset = 0, .mask = 1 << 4, }, 146 { .reg_offset = 0, .mask = 1 << 5, }, 147 { .reg_offset = 0, .mask = 1 << 6, }, 148 { .reg_offset = 0, .mask = 1 << 7, }, 149 { .reg_offset = 1, .mask = 1 << 0, }, 150 { .reg_offset = 1, .mask = 1 << 1, }, 151 }; 152 153 static const struct regmap_irq_chip max8907_on_off_irq_chip = { 154 .name = "max8907 on_off", 155 .status_base = MAX8907_REG_ON_OFF_IRQ1, 156 .mask_base = MAX8907_REG_ON_OFF_IRQ1_MASK, 157 .irq_reg_stride = MAX8907_REG_ON_OFF_IRQ2 - MAX8907_REG_ON_OFF_IRQ1, 158 .num_regs = 2, 159 .irqs = max8907_on_off_irqs, 160 .num_irqs = ARRAY_SIZE(max8907_on_off_irqs), 161 }; 162 163 static const struct regmap_irq max8907_rtc_irqs[] = { 164 { .reg_offset = 0, .mask = 1 << 2, }, 165 { .reg_offset = 0, .mask = 1 << 3, }, 166 }; 167 168 static const struct regmap_irq_chip max8907_rtc_irq_chip = { 169 .name = "max8907 rtc", 170 .status_base = MAX8907_REG_RTC_IRQ, 171 .mask_base = MAX8907_REG_RTC_IRQ_MASK, 172 .num_regs = 1, 173 .irqs = max8907_rtc_irqs, 174 .num_irqs = ARRAY_SIZE(max8907_rtc_irqs), 175 }; 176 177 static struct max8907 *max8907_pm_off; 178 static void max8907_power_off(void) 179 { 180 regmap_update_bits(max8907_pm_off->regmap_gen, MAX8907_REG_RESET_CNFG, 181 MAX8907_MASK_POWER_OFF, MAX8907_MASK_POWER_OFF); 182 } 183 184 static int max8907_i2c_probe(struct i2c_client *i2c, 185 const struct i2c_device_id *id) 186 { 187 struct max8907 *max8907; 188 int ret; 189 struct max8907_platform_data *pdata = dev_get_platdata(&i2c->dev); 190 bool pm_off = false; 191 192 if (pdata) 193 pm_off = pdata->pm_off; 194 else if (i2c->dev.of_node) 195 pm_off = of_property_read_bool(i2c->dev.of_node, 196 "maxim,system-power-controller"); 197 198 max8907 = devm_kzalloc(&i2c->dev, sizeof(struct max8907), GFP_KERNEL); 199 if (!max8907) { 200 ret = -ENOMEM; 201 goto err_alloc_drvdata; 202 } 203 204 max8907->dev = &i2c->dev; 205 dev_set_drvdata(max8907->dev, max8907); 206 207 max8907->i2c_gen = i2c; 208 i2c_set_clientdata(i2c, max8907); 209 max8907->regmap_gen = devm_regmap_init_i2c(i2c, 210 &max8907_regmap_gen_config); 211 if (IS_ERR(max8907->regmap_gen)) { 212 ret = PTR_ERR(max8907->regmap_gen); 213 dev_err(&i2c->dev, "gen regmap init failed: %d\n", ret); 214 goto err_regmap_gen; 215 } 216 217 max8907->i2c_rtc = i2c_new_dummy_device(i2c->adapter, MAX8907_RTC_I2C_ADDR); 218 if (IS_ERR(max8907->i2c_rtc)) { 219 ret = PTR_ERR(max8907->i2c_rtc); 220 goto err_dummy_rtc; 221 } 222 i2c_set_clientdata(max8907->i2c_rtc, max8907); 223 max8907->regmap_rtc = devm_regmap_init_i2c(max8907->i2c_rtc, 224 &max8907_regmap_rtc_config); 225 if (IS_ERR(max8907->regmap_rtc)) { 226 ret = PTR_ERR(max8907->regmap_rtc); 227 dev_err(&i2c->dev, "rtc regmap init failed: %d\n", ret); 228 goto err_regmap_rtc; 229 } 230 231 irq_set_status_flags(max8907->i2c_gen->irq, IRQ_NOAUTOEN); 232 233 ret = regmap_add_irq_chip(max8907->regmap_gen, max8907->i2c_gen->irq, 234 IRQF_ONESHOT | IRQF_SHARED, -1, 235 &max8907_chg_irq_chip, 236 &max8907->irqc_chg); 237 if (ret != 0) { 238 dev_err(&i2c->dev, "failed to add chg irq chip: %d\n", ret); 239 goto err_irqc_chg; 240 } 241 ret = regmap_add_irq_chip(max8907->regmap_gen, max8907->i2c_gen->irq, 242 IRQF_ONESHOT | IRQF_SHARED, -1, 243 &max8907_on_off_irq_chip, 244 &max8907->irqc_on_off); 245 if (ret != 0) { 246 dev_err(&i2c->dev, "failed to add on off irq chip: %d\n", ret); 247 goto err_irqc_on_off; 248 } 249 ret = regmap_add_irq_chip(max8907->regmap_rtc, max8907->i2c_gen->irq, 250 IRQF_ONESHOT | IRQF_SHARED, -1, 251 &max8907_rtc_irq_chip, 252 &max8907->irqc_rtc); 253 if (ret != 0) { 254 dev_err(&i2c->dev, "failed to add rtc irq chip: %d\n", ret); 255 goto err_irqc_rtc; 256 } 257 258 enable_irq(max8907->i2c_gen->irq); 259 260 ret = mfd_add_devices(max8907->dev, -1, max8907_cells, 261 ARRAY_SIZE(max8907_cells), NULL, 0, NULL); 262 if (ret != 0) { 263 dev_err(&i2c->dev, "failed to add MFD devices %d\n", ret); 264 goto err_add_devices; 265 } 266 267 if (pm_off && !pm_power_off) { 268 max8907_pm_off = max8907; 269 pm_power_off = max8907_power_off; 270 } 271 272 return 0; 273 274 err_add_devices: 275 regmap_del_irq_chip(max8907->i2c_gen->irq, max8907->irqc_rtc); 276 err_irqc_rtc: 277 regmap_del_irq_chip(max8907->i2c_gen->irq, max8907->irqc_on_off); 278 err_irqc_on_off: 279 regmap_del_irq_chip(max8907->i2c_gen->irq, max8907->irqc_chg); 280 err_irqc_chg: 281 err_regmap_rtc: 282 i2c_unregister_device(max8907->i2c_rtc); 283 err_dummy_rtc: 284 err_regmap_gen: 285 err_alloc_drvdata: 286 return ret; 287 } 288 289 static int max8907_i2c_remove(struct i2c_client *i2c) 290 { 291 struct max8907 *max8907 = i2c_get_clientdata(i2c); 292 293 mfd_remove_devices(max8907->dev); 294 295 regmap_del_irq_chip(max8907->i2c_gen->irq, max8907->irqc_rtc); 296 regmap_del_irq_chip(max8907->i2c_gen->irq, max8907->irqc_on_off); 297 regmap_del_irq_chip(max8907->i2c_gen->irq, max8907->irqc_chg); 298 299 i2c_unregister_device(max8907->i2c_rtc); 300 301 return 0; 302 } 303 304 #ifdef CONFIG_OF 305 static const struct of_device_id max8907_of_match[] = { 306 { .compatible = "maxim,max8907" }, 307 { }, 308 }; 309 MODULE_DEVICE_TABLE(of, max8907_of_match); 310 #endif 311 312 static const struct i2c_device_id max8907_i2c_id[] = { 313 {"max8907", 0}, 314 {} 315 }; 316 MODULE_DEVICE_TABLE(i2c, max8907_i2c_id); 317 318 static struct i2c_driver max8907_i2c_driver = { 319 .driver = { 320 .name = "max8907", 321 .of_match_table = of_match_ptr(max8907_of_match), 322 }, 323 .probe = max8907_i2c_probe, 324 .remove = max8907_i2c_remove, 325 .id_table = max8907_i2c_id, 326 }; 327 328 static int __init max8907_i2c_init(void) 329 { 330 int ret = -ENODEV; 331 332 ret = i2c_add_driver(&max8907_i2c_driver); 333 if (ret != 0) 334 pr_err("Failed to register I2C driver: %d\n", ret); 335 336 return ret; 337 } 338 subsys_initcall(max8907_i2c_init); 339 340 static void __exit max8907_i2c_exit(void) 341 { 342 i2c_del_driver(&max8907_i2c_driver); 343 } 344 module_exit(max8907_i2c_exit); 345 346 MODULE_DESCRIPTION("MAX8907 multi-function core driver"); 347 MODULE_AUTHOR("Gyungoh Yoo <jack.yoo@maxim-ic.com>"); 348 MODULE_LICENSE("GPL v2"); 349