drivers/mfd/da9062-core.c

Source file repositories/reference/linux-study-clean/drivers/mfd/da9062-core.c

File Facts

System
Linux kernel
Corpus path
drivers/mfd/da9062-core.c
Extension
.c
Size
24272 bytes
Lines
735
Domain
Driver Families
Bucket
drivers/mfd
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (ret < 0) {
			dev_err(chip->dev, "Failed to set Two-Wire Bus Mode.\n");
			return ret;
		}
	}

	ret = da9062_clear_fault_log(chip);
	if (ret < 0)
		dev_warn(chip->dev, "Cannot clear fault log\n");

	ret = da9062_get_device_type(chip);
	if (ret)
		return ret;

	/* If IRQ is available, reconfigure it accordingly */
	if (i2c->irq) {
		if (chip->chip_type == COMPAT_TYPE_DA9061) {
			cell = da9061_devs_irq;
			cell_num = ARRAY_SIZE(da9061_devs_irq);
			irq_chip = &da9061_irq_chip;
		} else {
			cell = da9062_devs_irq;
			cell_num = ARRAY_SIZE(da9062_devs_irq);
			irq_chip = &da9062_irq_chip;
		}

		ret = da9062_configure_irq_type(chip, i2c->irq, &trigger_type);
		if (ret < 0) {
			dev_err(chip->dev, "Failed to configure IRQ type\n");
			return ret;
		}

		ret = regmap_add_irq_chip(chip->regmap, i2c->irq,
					  trigger_type | IRQF_SHARED | IRQF_ONESHOT,
					  -1, irq_chip, &chip->regmap_irq);
		if (ret) {
			dev_err(chip->dev, "Failed to request IRQ %d: %d\n",
				i2c->irq, ret);
			return ret;
		}

		irq_base = regmap_irq_chip_get_base(chip->regmap_irq);
	}

	ret = mfd_add_devices(chip->dev, PLATFORM_DEVID_NONE, cell,
			      cell_num, NULL, irq_base,
			      NULL);
	if (ret) {
		dev_err(chip->dev, "Cannot register child devices\n");
		if (i2c->irq)
			regmap_del_irq_chip(i2c->irq, chip->regmap_irq);
		return ret;
	}

	return ret;
}

static void da9062_i2c_remove(struct i2c_client *i2c)
{
	struct da9062 *chip = i2c_get_clientdata(i2c);

	mfd_remove_devices(chip->dev);
	regmap_del_irq_chip(i2c->irq, chip->regmap_irq);
}

static const struct of_device_id da9062_dt_ids[] = {
	{ .compatible = "dlg,da9061", .data = (void *)COMPAT_TYPE_DA9061 },
	{ .compatible = "dlg,da9062", .data = (void *)COMPAT_TYPE_DA9062 },
	{ }
};
MODULE_DEVICE_TABLE(of, da9062_dt_ids);

static const struct i2c_device_id da9062_i2c_id[] = {
	{ "da9061", COMPAT_TYPE_DA9061 },
	{ "da9062", COMPAT_TYPE_DA9062 },
	{ }
};
MODULE_DEVICE_TABLE(i2c, da9062_i2c_id);

static struct i2c_driver da9062_i2c_driver = {
	.driver = {
		.name = "da9062",
		.of_match_table = da9062_dt_ids,
	},
	.probe = da9062_i2c_probe,
	.remove   = da9062_i2c_remove,
	.id_table = da9062_i2c_id,
};

module_i2c_driver(da9062_i2c_driver);

Annotation

Implementation Notes