// SPDX-License-Identifier: GPL-2.0+ // // max77693.c - mfd core driver for the MAX 77693 // // Copyright (C) 2012 Samsung Electronics // SangYoung Son <hello.son@samsung.com> // // This program is not provided / owned by Maxim Integrated Products. // // This driver is based on max8997.c
max77693->regmap = devm_regmap_init_i2c(i2c, &max77693_regmap_config); if (IS_ERR(max77693->regmap)) {
ret = PTR_ERR(max77693->regmap);
dev_err(max77693->dev, "failed to allocate register map: %d\n",
ret); return ret;
}
ret = regmap_read(max77693->regmap, MAX77693_PMIC_REG_PMIC_ID2,
®_data); if (ret < 0) {
dev_err(max77693->dev, "device not found on this channel\n"); return ret;
} else
dev_info(max77693->dev, "device ID: 0x%x\n", reg_data);
max77693->i2c_muic = i2c_new_dummy_device(i2c->adapter, I2C_ADDR_MUIC); if (IS_ERR(max77693->i2c_muic)) {
dev_err(max77693->dev, "Failed to allocate I2C device for MUIC\n"); return PTR_ERR(max77693->i2c_muic);
}
i2c_set_clientdata(max77693->i2c_muic, max77693);
max77693->i2c_haptic = i2c_new_dummy_device(i2c->adapter, I2C_ADDR_HAPTIC); if (IS_ERR(max77693->i2c_haptic)) {
dev_err(max77693->dev, "Failed to allocate I2C device for Haptic\n");
ret = PTR_ERR(max77693->i2c_haptic); goto err_i2c_haptic;
}
i2c_set_clientdata(max77693->i2c_haptic, max77693);
max77693->regmap_haptic = devm_regmap_init_i2c(max77693->i2c_haptic,
&max77693_regmap_haptic_config); if (IS_ERR(max77693->regmap_haptic)) {
ret = PTR_ERR(max77693->regmap_haptic);
dev_err(max77693->dev, "failed to initialize haptic register map: %d\n", ret); goto err_regmap;
}
/* * Initialize register map for MUIC device because use regmap-muic * instance of MUIC device when irq of max77693 is initialized * before call max77693-muic probe() function.
*/
max77693->regmap_muic = devm_regmap_init_i2c(max77693->i2c_muic,
&max77693_regmap_muic_config); if (IS_ERR(max77693->regmap_muic)) {
ret = PTR_ERR(max77693->regmap_muic);
dev_err(max77693->dev, "failed to allocate register map: %d\n", ret); goto err_regmap;
}
ret = regmap_add_irq_chip(max77693->regmap, max77693->irq,
IRQF_ONESHOT | IRQF_SHARED, 0,
&max77693_led_irq_chip,
&max77693->irq_data_led); if (ret) {
dev_err(max77693->dev, "failed to add irq chip: %d\n", ret); goto err_regmap;
}
ret = regmap_add_irq_chip(max77693->regmap, max77693->irq,
IRQF_ONESHOT | IRQF_SHARED, 0,
&max77693_topsys_irq_chip,
&max77693->irq_data_topsys); if (ret) {
dev_err(max77693->dev, "failed to add irq chip: %d\n", ret); goto err_irq_topsys;
}
ret = regmap_add_irq_chip(max77693->regmap, max77693->irq,
IRQF_ONESHOT | IRQF_SHARED, 0,
&max77693_charger_irq_chip,
&max77693->irq_data_chg); if (ret) {
dev_err(max77693->dev, "failed to add irq chip: %d\n", ret); goto err_irq_charger;
}
ret = regmap_add_irq_chip(max77693->regmap_muic, max77693->irq,
IRQF_ONESHOT | IRQF_SHARED, 0,
&max77693_muic_irq_chip,
&max77693->irq_data_muic); if (ret) {
dev_err(max77693->dev, "failed to add irq chip: %d\n", ret); goto err_irq_muic;
}
/* Unmask interrupts from all blocks in interrupt source register */
ret = regmap_update_bits(max77693->regmap,
MAX77693_PMIC_REG_INTSRC_MASK,
SRC_IRQ_ALL, (unsignedint)~SRC_IRQ_ALL); if (ret < 0) {
dev_err(max77693->dev, "Could not unmask interrupts in INTSRC: %d\n",
ret); goto err_intsrc;
}
pm_runtime_set_active(max77693->dev);
ret = mfd_add_devices(max77693->dev, -1, max77693_devs,
ARRAY_SIZE(max77693_devs), NULL, 0, NULL); if (ret < 0) goto err_mfd;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.