Commit deb3b88b authored by Matt Ranostay's avatar Matt Ranostay Committed by Jiri Kosina
Browse files

HID: mcp2221: switch i2c registration to devm functions



Switch from i2c_add_adapter() to resource managed devm_i2c_add_adapter()
for matching rest of driver initialization, and more concise code.

Signed-off-by: default avatarMatt Ranostay <matt.ranostay@konsulko.com>
Reviewed-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 79d11de9
Loading
Loading
Loading
Loading
+25 −25
Original line number Diff line number Diff line
@@ -824,6 +824,20 @@ static int mcp2221_raw_event(struct hid_device *hdev,
	return 1;
}

/* Device resource managed function for HID unregistration */
static void mcp2221_hid_unregister(void *ptr)
{
	struct hid_device *hdev = ptr;

	hid_hw_close(hdev);
	hid_hw_stop(hdev);
}

/* This is needed to be sure hid_hw_stop() isn't called twice by the subsystem */
static void mcp2221_remove(struct hid_device *hdev)
{
}

static int mcp2221_probe(struct hid_device *hdev,
					const struct hid_device_id *id)
{
@@ -849,7 +863,8 @@ static int mcp2221_probe(struct hid_device *hdev,
	ret = hid_hw_open(hdev);
	if (ret) {
		hid_err(hdev, "can't open device\n");
		goto err_hstop;
		hid_hw_stop(hdev);
		return ret;
	}

	mutex_init(&mcp->lock);
@@ -857,6 +872,10 @@ static int mcp2221_probe(struct hid_device *hdev,
	hid_set_drvdata(hdev, mcp);
	mcp->hdev = hdev;

	ret = devm_add_action_or_reset(&hdev->dev, mcp2221_hid_unregister, hdev);
	if (ret)
		return ret;

	/* Set I2C bus clock diviser */
	if (i2c_clk_freq > 400)
		i2c_clk_freq = 400;
@@ -873,19 +892,17 @@ static int mcp2221_probe(struct hid_device *hdev,
			"MCP2221 usb-i2c bridge on hidraw%d",
			((struct hidraw *)hdev->hidraw)->minor);

	ret = i2c_add_adapter(&mcp->adapter);
	ret = devm_i2c_add_adapter(&hdev->dev, &mcp->adapter);
	if (ret) {
		hid_err(hdev, "can't add usb-i2c adapter: %d\n", ret);
		goto err_i2c;
		return ret;
	}
	i2c_set_adapdata(&mcp->adapter, mcp);

	/* Setup GPIO chip */
	mcp->gc = devm_kzalloc(&hdev->dev, sizeof(*mcp->gc), GFP_KERNEL);
	if (!mcp->gc) {
		ret = -ENOMEM;
		goto err_gc;
	}
	if (!mcp->gc)
		return -ENOMEM;

	mcp->gc->label = "mcp2221_gpio";
	mcp->gc->direction_input = mcp_gpio_direction_input;
@@ -900,26 +917,9 @@ static int mcp2221_probe(struct hid_device *hdev,

	ret = devm_gpiochip_add_data(&hdev->dev, mcp->gc, mcp);
	if (ret)
		goto err_gc;

	return 0;

err_gc:
	i2c_del_adapter(&mcp->adapter);
err_i2c:
	hid_hw_close(mcp->hdev);
err_hstop:
	hid_hw_stop(mcp->hdev);
		return ret;
}

static void mcp2221_remove(struct hid_device *hdev)
{
	struct mcp2221 *mcp = hid_get_drvdata(hdev);

	i2c_del_adapter(&mcp->adapter);
	hid_hw_close(mcp->hdev);
	hid_hw_stop(mcp->hdev);
	return 0;
}

static const struct hid_device_id mcp2221_devices[] = {