drivers/mfd/tps6594-core.c

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

File Facts

System
Linux kernel
Corpus path
drivers/mfd/tps6594-core.c
Extension
.c
Size
34956 bytes
Lines
802
Domain
Driver Families
Bucket
drivers/mfd
Inferred role
Driver Families: exported/initcall integration point
Status
integration 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 (tps->chip_id == TPS65224 || tps->chip_id == TPS652G1) {
			regmap_reg = TPS6594_REG_INT_FSM_ERR;
			mask_val = TPS6594_BIT_COMM_ERR_INT;
		} else {
			regmap_reg = TPS6594_REG_INT_COMM_ERR;
			mask_val = TPS6594_BIT_COMM_ADR_ERR_INT;
		}

		ret = regmap_write_bits(tps->regmap, regmap_reg, mask_val, mask_val);
	}

	return ret;
};

static struct regmap_irq_chip tps6594_irq_chip = {
	.ack_base = TPS6594_REG_INT_BUCK1_2,
	.ack_invert = 1,
	.clear_ack = 1,
	.init_ack_masked = 1,
	.num_regs = ARRAY_SIZE(tps6594_irq_reg),
	.irqs = tps6594_irqs,
	.num_irqs = ARRAY_SIZE(tps6594_irqs),
	.get_irq_reg = tps6594_get_irq_reg,
	.handle_post_irq = tps6594_handle_post_irq,
};

static struct regmap_irq_chip tps65224_irq_chip = {
	.ack_base = TPS6594_REG_INT_BUCK,
	.ack_invert = 1,
	.clear_ack = 1,
	.init_ack_masked = 1,
	.num_regs = ARRAY_SIZE(tps65224_irq_reg),
	.irqs = tps65224_irqs,
	.num_irqs = ARRAY_SIZE(tps65224_irqs),
	.get_irq_reg = tps65224_get_irq_reg,
	.handle_post_irq = tps6594_handle_post_irq,
};

static struct regmap_irq_chip tps652g1_irq_chip = {
	.ack_base = TPS6594_REG_INT_BUCK,
	.ack_invert = 1,
	.clear_ack = 1,
	.init_ack_masked = 1,
	.num_regs = ARRAY_SIZE(tps65224_irq_reg),
	.irqs = tps652g1_irqs,
	.num_irqs = ARRAY_SIZE(tps652g1_irqs),
	.get_irq_reg = tps65224_get_irq_reg,
	.handle_post_irq = tps6594_handle_post_irq,
};

static const struct regmap_range tps6594_volatile_ranges[] = {
	regmap_reg_range(TPS6594_REG_INT_TOP, TPS6594_REG_STAT_READBACK_ERR),
	regmap_reg_range(TPS6594_REG_RTC_STATUS, TPS6594_REG_RTC_STATUS),
};

const struct regmap_access_table tps6594_volatile_table = {
	.yes_ranges = tps6594_volatile_ranges,
	.n_yes_ranges = ARRAY_SIZE(tps6594_volatile_ranges),
};
EXPORT_SYMBOL_GPL(tps6594_volatile_table);

static const struct regmap_range tps65224_volatile_ranges[] = {
	regmap_reg_range(TPS6594_REG_INT_TOP, TPS6594_REG_STAT_SEVERE_ERR),
};

const struct regmap_access_table tps65224_volatile_table = {
	.yes_ranges = tps65224_volatile_ranges,
	.n_yes_ranges = ARRAY_SIZE(tps65224_volatile_ranges),
};
EXPORT_SYMBOL_GPL(tps65224_volatile_table);

static int tps6594_check_crc_mode(struct tps6594 *tps, bool primary_pmic)
{
	int ret;
	unsigned int regmap_reg, mask_val;

	if (tps->chip_id == TPS65224 || tps->chip_id == TPS652G1) {
		regmap_reg = TPS6594_REG_CONFIG_2;
		mask_val = TPS65224_BIT_I2C1_SPI_CRC_EN;
	} else {
		regmap_reg = TPS6594_REG_SERIAL_IF_CONFIG;
		mask_val = TPS6594_BIT_I2C1_SPI_CRC_EN;
	}

	/*
	 * Check if CRC is enabled.
	 * Once CRC is enabled, it can't be disabled until next power cycle.
	 */
	tps->use_crc = true;
	ret = regmap_test_bits(tps->regmap, regmap_reg, mask_val);

Annotation

Implementation Notes