static int __init smsc47m1_probe()

in smsc47m1.c [707:841]


static int __init smsc47m1_probe(struct platform_device *pdev)
{
	struct device *dev = &pdev->dev;
	struct smsc47m1_sio_data *sio_data = dev_get_platdata(dev);
	struct smsc47m1_data *data;
	struct resource *res;
	int err;
	int fan1, fan2, fan3, pwm1, pwm2, pwm3;

	static const char * const names[] = {
		"smsc47m1",
		"smsc47m2",
	};

	res = platform_get_resource(pdev, IORESOURCE_IO, 0);
	err = smsc47m1_handle_resources(res->start, sio_data->type,
					REQUEST, dev);
	if (err < 0)
		return err;

	data = devm_kzalloc(dev, sizeof(struct smsc47m1_data), GFP_KERNEL);
	if (!data)
		return -ENOMEM;

	data->addr = res->start;
	data->type = sio_data->type;
	data->name = names[sio_data->type];
	mutex_init(&data->update_lock);
	platform_set_drvdata(pdev, data);

	/*
	 * If no function is properly configured, there's no point in
	 * actually registering the chip.
	 */
	pwm1 = (smsc47m1_read_value(data, SMSC47M1_REG_PPIN(0)) & 0x05)
	       == 0x04;
	pwm2 = (smsc47m1_read_value(data, SMSC47M1_REG_PPIN(1)) & 0x05)
	       == 0x04;
	if (data->type == smsc47m2) {
		fan1 = (smsc47m1_read_value(data, SMSC47M2_REG_TPIN1)
			& 0x0d) == 0x09;
		fan2 = (smsc47m1_read_value(data, SMSC47M2_REG_TPIN2)
			& 0x0d) == 0x09;
		fan3 = (smsc47m1_read_value(data, SMSC47M2_REG_TPIN3)
			& 0x0d) == 0x0d;
		pwm3 = (smsc47m1_read_value(data, SMSC47M2_REG_PPIN3)
			& 0x0d) == 0x08;
	} else {
		fan1 = (smsc47m1_read_value(data, SMSC47M1_REG_TPIN(0))
			& 0x05) == 0x05;
		fan2 = (smsc47m1_read_value(data, SMSC47M1_REG_TPIN(1))
			& 0x05) == 0x05;
		fan3 = 0;
		pwm3 = 0;
	}
	if (!(fan1 || fan2 || fan3 || pwm1 || pwm2 || pwm3)) {
		dev_warn(dev, "Device not configured, will not use\n");
		return -ENODEV;
	}

	/*
	 * Some values (fan min, clock dividers, pwm registers) may be
	 * needed before any update is triggered, so we better read them
	 * at least once here. We don't usually do it that way, but in
	 * this particular case, manually reading 5 registers out of 8
	 * doesn't make much sense and we're better using the existing
	 * function.
	 */
	smsc47m1_update_device(dev, 1);

	/* Register sysfs hooks */
	if (fan1) {
		err = sysfs_create_group(&dev->kobj,
					 &smsc47m1_group_fan1);
		if (err)
			goto error_remove_files;
	} else
		dev_dbg(dev, "Fan 1 not enabled by hardware, skipping\n");

	if (fan2) {
		err = sysfs_create_group(&dev->kobj,
					 &smsc47m1_group_fan2);
		if (err)
			goto error_remove_files;
	} else
		dev_dbg(dev, "Fan 2 not enabled by hardware, skipping\n");

	if (fan3) {
		err = sysfs_create_group(&dev->kobj,
					 &smsc47m1_group_fan3);
		if (err)
			goto error_remove_files;
	} else if (data->type == smsc47m2)
		dev_dbg(dev, "Fan 3 not enabled by hardware, skipping\n");

	if (pwm1) {
		err = sysfs_create_group(&dev->kobj,
					 &smsc47m1_group_pwm1);
		if (err)
			goto error_remove_files;
	} else
		dev_dbg(dev, "PWM 1 not enabled by hardware, skipping\n");

	if (pwm2) {
		err = sysfs_create_group(&dev->kobj,
					 &smsc47m1_group_pwm2);
		if (err)
			goto error_remove_files;
	} else
		dev_dbg(dev, "PWM 2 not enabled by hardware, skipping\n");

	if (pwm3) {
		err = sysfs_create_group(&dev->kobj,
					 &smsc47m1_group_pwm3);
		if (err)
			goto error_remove_files;
	} else if (data->type == smsc47m2)
		dev_dbg(dev, "PWM 3 not enabled by hardware, skipping\n");

	err = sysfs_create_group(&dev->kobj, &smsc47m1_group);
	if (err)
		goto error_remove_files;

	data->hwmon_dev = hwmon_device_register(dev);
	if (IS_ERR(data->hwmon_dev)) {
		err = PTR_ERR(data->hwmon_dev);
		goto error_remove_files;
	}

	return 0;

error_remove_files:
	smsc47m1_remove_files(dev);
	return err;
}