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: Geert Uytterhoeven <geert@linux-m68k.org>
Reviewed-by: Robin van der Gracht <robin@protonic.nl>
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
This commit is contained in:
Geert Uytterhoeven 2021-10-19 16:45:16 +02:00 committed by Miguel Ojeda
parent b37cc22027
commit fcbb3c356e
1 changed files with 53 additions and 48 deletions

View File

@ -404,33 +404,13 @@ static int ht16k33_keypad_probe(struct i2c_client *client,
return input_register_device(keypad->dev); 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; struct ht16k33_fbdev *fbdev = &priv->fbdev;
uint32_t dft_brightness;
struct backlight_device *bl;
struct backlight_properties bl_props; struct backlight_properties bl_props;
struct ht16k33_priv *priv; struct backlight_device *bl;
struct ht16k33_fbdev *fbdev; int err;
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;
/* Backlight */ /* Backlight */
memset(&bl_props, 0, sizeof(struct backlight_properties)); memset(&bl_props, 0, sizeof(struct backlight_properties));
@ -444,18 +424,7 @@ static int ht16k33_probe(struct i2c_client *client)
return PTR_ERR(bl); return PTR_ERR(bl);
} }
err = of_property_read_u32(node, "default-brightness-level", bl->props.brightness = brightness;
&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;
ht16k33_bl_update_status(bl); ht16k33_bl_update_status(bl);
/* Framebuffer (2 bytes per column) */ /* Framebuffer (2 bytes per column) */
@ -476,8 +445,8 @@ static int ht16k33_probe(struct i2c_client *client)
goto err_fbdev_buffer; 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); &fbdev->refresh_rate);
if (err) { if (err) {
dev_err(dev, "refresh rate not specified\n"); dev_err(dev, "refresh rate not specified\n");
goto err_fbdev_info; goto err_fbdev_info;
@ -499,18 +468,9 @@ static int ht16k33_probe(struct i2c_client *client)
if (err) if (err)
goto err_fbdev_info; 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); ht16k33_fb_queue(priv);
return 0; return 0;
err_fbdev_unregister:
unregister_framebuffer(fbdev->info);
err_fbdev_info: err_fbdev_info:
framebuffer_release(fbdev->info); framebuffer_release(fbdev->info);
err_fbdev_buffer: err_fbdev_buffer:
@ -519,6 +479,51 @@ err_fbdev_buffer:
return err; 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) static int ht16k33_remove(struct i2c_client *client)
{ {
struct ht16k33_priv *priv = i2c_get_clientdata(client); struct ht16k33_priv *priv = i2c_get_clientdata(client);