Commit fcbb3c35 authored by Geert Uytterhoeven's avatar Geert Uytterhoeven Committed by Miguel Ojeda
Browse files

auxdisplay: ht16k33: Extract frame buffer probing



Extract all frame buffer (including backlight) probing into
ht16k33_fbdev_probe().

Call ht16k33_fbdev_probe() after ht16k33_keypad_probe(), as the latter
does not need any manual cleanup in the probe error path.

Signed-off-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
Reviewed-by: default avatarRobin van der Gracht <robin@protonic.nl>
Signed-off-by: default avatarMiguel Ojeda <ojeda@kernel.org>
parent b37cc220
Loading
Loading
Loading
Loading
+53 −48
Original line number Diff line number Diff line
@@ -404,33 +404,13 @@ static int ht16k33_keypad_probe(struct i2c_client *client,
	return input_register_device(keypad->dev);
}

static int ht16k33_probe(struct i2c_client *client)
static int ht16k33_fbdev_probe(struct device *dev, struct ht16k33_priv *priv,
			       uint32_t brightness)
{
	int err;
	uint32_t dft_brightness;
	struct backlight_device *bl;
	struct ht16k33_fbdev *fbdev = &priv->fbdev;
	struct backlight_properties bl_props;
	struct ht16k33_priv *priv;
	struct ht16k33_fbdev *fbdev;
	struct device *dev = &client->dev;
	struct device_node *node = dev->of_node;

	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
		dev_err(dev, "i2c_check_functionality error\n");
		return -EIO;
	}

	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
	if (!priv)
		return -ENOMEM;

	priv->client = client;
	i2c_set_clientdata(client, priv);
	fbdev = &priv->fbdev;

	err = ht16k33_initialize(priv);
	if (err)
		return err;
	struct backlight_device *bl;
	int err;

	/* Backlight */
	memset(&bl_props, 0, sizeof(struct backlight_properties));
@@ -444,18 +424,7 @@ static int ht16k33_probe(struct i2c_client *client)
		return PTR_ERR(bl);
	}

	err = of_property_read_u32(node, "default-brightness-level",
				   &dft_brightness);
	if (err) {
		dft_brightness = MAX_BRIGHTNESS;
	} else if (dft_brightness > MAX_BRIGHTNESS) {
		dev_warn(dev,
			 "invalid default brightness level: %u, using %u\n",
			 dft_brightness, MAX_BRIGHTNESS);
		dft_brightness = MAX_BRIGHTNESS;
	}

	bl->props.brightness = dft_brightness;
	bl->props.brightness = brightness;
	ht16k33_bl_update_status(bl);

	/* Framebuffer (2 bytes per column) */
@@ -476,7 +445,7 @@ static int ht16k33_probe(struct i2c_client *client)
		goto err_fbdev_buffer;
	}

	err = of_property_read_u32(node, "refresh-rate-hz",
	err = of_property_read_u32(dev->of_node, "refresh-rate-hz",
				   &fbdev->refresh_rate);
	if (err) {
		dev_err(dev, "refresh rate not specified\n");
@@ -499,18 +468,9 @@ static int ht16k33_probe(struct i2c_client *client)
	if (err)
		goto err_fbdev_info;

	/* Keypad */
	if (client->irq > 0) {
		err = ht16k33_keypad_probe(client, &priv->keypad);
		if (err)
			goto err_fbdev_unregister;
	}

	ht16k33_fb_queue(priv);
	return 0;

err_fbdev_unregister:
	unregister_framebuffer(fbdev->info);
err_fbdev_info:
	framebuffer_release(fbdev->info);
err_fbdev_buffer:
@@ -519,6 +479,51 @@ static int ht16k33_probe(struct i2c_client *client)
	return err;
}

static int ht16k33_probe(struct i2c_client *client)
{
	struct device *dev = &client->dev;
	struct ht16k33_priv *priv;
	uint32_t dft_brightness;
	int err;

	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
		dev_err(dev, "i2c_check_functionality error\n");
		return -EIO;
	}

	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
	if (!priv)
		return -ENOMEM;

	priv->client = client;
	i2c_set_clientdata(client, priv);

	err = ht16k33_initialize(priv);
	if (err)
		return err;

	err = of_property_read_u32(dev->of_node, "default-brightness-level",
				   &dft_brightness);
	if (err) {
		dft_brightness = MAX_BRIGHTNESS;
	} else if (dft_brightness > MAX_BRIGHTNESS) {
		dev_warn(dev,
			 "invalid default brightness level: %u, using %u\n",
			 dft_brightness, MAX_BRIGHTNESS);
		dft_brightness = MAX_BRIGHTNESS;
	}

	/* Keypad */
	if (client->irq > 0) {
		err = ht16k33_keypad_probe(client, &priv->keypad);
		if (err)
			return err;
	}

	/* Frame Buffer Display */
	return ht16k33_fbdev_probe(dev, priv, dft_brightness);
}

static int ht16k33_remove(struct i2c_client *client)
{
	struct ht16k33_priv *priv = i2c_get_clientdata(client);