drivers/mfd/adp5585.c

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

File Facts

System
Linux kernel
Corpus path
drivers/mfd/adp5585.c
Extension
.c
Size
24650 bytes
Lines
844
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

switch (prop_val) {
		case 0:
			adp5585->reset_cfg |= FIELD_PREP(ADP5585_RESET_TRIG_TIME, 0);
			break;
		case 1000:
			adp5585->reset_cfg |= FIELD_PREP(ADP5585_RESET_TRIG_TIME, 1);
			break;
		case 1500:
			adp5585->reset_cfg |= FIELD_PREP(ADP5585_RESET_TRIG_TIME, 2);
			break;
		case 2000:
			adp5585->reset_cfg |= FIELD_PREP(ADP5585_RESET_TRIG_TIME, 3);
			break;
		case 2500:
			adp5585->reset_cfg |= FIELD_PREP(ADP5585_RESET_TRIG_TIME, 4);
			break;
		case 3000:
			adp5585->reset_cfg |= FIELD_PREP(ADP5585_RESET_TRIG_TIME, 5);
			break;
		case 3500:
			adp5585->reset_cfg |= FIELD_PREP(ADP5585_RESET_TRIG_TIME, 6);
			break;
		case 4000:
			adp5585->reset_cfg |= FIELD_PREP(ADP5585_RESET_TRIG_TIME, 7);
			break;
		default:
			return dev_err_probe(dev, -EINVAL,
					     "Invalid value(%u) for adi,reset-trigger-ms\n",
					     prop_val);
		}
	}

	ret = device_property_read_u32(dev, "adi,reset-pulse-width-us", &prop_val);
	if (!ret) {
		switch (prop_val) {
		case 500:
			adp5585->reset_cfg |= FIELD_PREP(ADP5585_PULSE_WIDTH, 0);
			break;
		case 1000:
			adp5585->reset_cfg |= FIELD_PREP(ADP5585_PULSE_WIDTH, 1);
			break;
		case 2000:
			adp5585->reset_cfg |= FIELD_PREP(ADP5585_PULSE_WIDTH, 2);
			break;
		case 10000:
			adp5585->reset_cfg |= FIELD_PREP(ADP5585_PULSE_WIDTH, 3);
			break;
		default:
			return dev_err_probe(dev, -EINVAL,
					     "Invalid value(%u) for adi,reset-pulse-width-us\n",
					     prop_val);
		}
	}

	return 0;
}

static int adp5585_add_devices(const struct adp5585_dev *adp5585)
{
	struct device *dev = adp5585->dev;
	const struct mfd_cell *cells;
	int ret;

	if (adp5585->id == ADP5585_MAN_ID_VALUE)
		cells = adp5585_devs;
	else
		cells = adp5589_devs;

	if (device_property_present(dev, "#pwm-cells")) {
		/* Make sure the PWM output pin is not used by the GPIO or INPUT devices */
		__set_bit(ADP5585_PWM_OUT, adp5585->pin_usage);
		ret = devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO,
					   &cells[ADP5585_DEV_PWM], 1, NULL, 0, NULL);
		if (ret)
			return dev_err_probe(dev, ret, "Failed to add PWM device\n");
	}

	if (device_property_present(dev, "#gpio-cells")) {
		ret = devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO,
					   &cells[ADP5585_DEV_GPIO], 1, NULL, 0, NULL);
		if (ret)
			return dev_err_probe(dev, ret, "Failed to add GPIO device\n");
	}

	if (device_property_present(adp5585->dev, "adi,keypad-pins")) {
		ret = devm_mfd_add_devices(adp5585->dev, PLATFORM_DEVID_AUTO,
					   &cells[ADP5585_DEV_INPUT], 1, NULL, 0, NULL);
		if (ret)
			return dev_err_probe(dev, ret, "Failed to add input device\n");
	}

Annotation

Implementation Notes