summaryrefslogtreecommitdiffstats
path: root/drivers/auxdisplay/ht16k33.c
diff options
context:
space:
mode:
authorGeert Uytterhoeven <geert@linux-m68k.org>2021-10-19 16:45:16 +0200
committerMiguel Ojeda <ojeda@kernel.org>2021-10-21 23:36:30 +0200
commitfcbb3c356eae05812fcefc8eda8f49034dbbb8ed (patch)
treedc720e9e5ee30e2bc597e9994cfbf70eddf11548 /drivers/auxdisplay/ht16k33.c
parentauxdisplay: ht16k33: Extract ht16k33_brightness_set() (diff)
downloadlinux-fcbb3c356eae05812fcefc8eda8f49034dbbb8ed.tar.xz
linux-fcbb3c356eae05812fcefc8eda8f49034dbbb8ed.zip
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>
Diffstat (limited to 'drivers/auxdisplay/ht16k33.c')
-rw-r--r--drivers/auxdisplay/ht16k33.c101
1 files changed, 53 insertions, 48 deletions
diff --git a/drivers/auxdisplay/ht16k33.c b/drivers/auxdisplay/ht16k33.c
index 60e616c0e932..8993d2790910 100644
--- a/drivers/auxdisplay/ht16k33.c
+++ b/drivers/auxdisplay/ht16k33.c
@@ -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,8 +445,8 @@ static int ht16k33_probe(struct i2c_client *client)
goto err_fbdev_buffer;
}
- err = of_property_read_u32(node, "refresh-rate-hz",
- &fbdev->refresh_rate);
+ err = of_property_read_u32(dev->of_node, "refresh-rate-hz",
+ &fbdev->refresh_rate);
if (err) {
dev_err(dev, "refresh rate not specified\n");
goto err_fbdev_info;
@@ -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 @@ err_fbdev_buffer:
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);