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:
parent
b37cc22027
commit
fcbb3c356e
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue