lkml.org 
[lkml]   [2015]   [Mar]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCHv6 09/10] fbdev: ssd1307fb: add backlight controls for setting the contrast
    Date
    The backlight class is used to create userspace handles for
    setting the OLED contrast.

    Signed-off-by: Thomas Niederprüm <niederp@physik.uni-kl.de>
    Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com>
    ---
    drivers/video/fbdev/Kconfig | 1 +
    drivers/video/fbdev/ssd1307fb.c | 58 +++++++++++++++++++++++++++++++++++++++++
    2 files changed, 59 insertions(+)

    diff --git a/drivers/video/fbdev/Kconfig b/drivers/video/fbdev/Kconfig
    index b3dd417..da70bae 100644
    --- a/drivers/video/fbdev/Kconfig
    +++ b/drivers/video/fbdev/Kconfig
    @@ -2478,6 +2478,7 @@ config FB_SSD1307
    select FB_SYS_IMAGEBLIT
    select FB_DEFERRED_IO
    select PWM
    + select FB_BACKLIGHT
    help
    This driver implements support for the Solomon SSD1307
    OLED controller over I2C.
    diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
    index 5f3d5a8..77efed7 100644
    --- a/drivers/video/fbdev/ssd1307fb.c
    +++ b/drivers/video/fbdev/ssd1307fb.c
    @@ -7,6 +7,7 @@
    */

    #include <linux/module.h>
    +#include <linux/backlight.h>
    #include <linux/kernel.h>
    #include <linux/i2c.h>
    #include <linux/fb.h>
    @@ -38,6 +39,8 @@
    #define SSD1307FB_SET_COM_PINS_CONFIG 0xda
    #define SSD1307FB_SET_VCOMH 0xdb

    +#define MAX_CONTRAST 255
    +
    #define REFRESHRATE 1

    static u_int refreshrate = REFRESHRATE;
    @@ -424,6 +427,43 @@ static int ssd1307fb_init(struct ssd1307fb_par *par)
    return 0;
    }

    +static int ssd1307fb_update_bl(struct backlight_device *bdev)
    +{
    + struct ssd1307fb_par *par = bl_get_data(bdev);
    + int ret;
    + int brightness = bdev->props.brightness;
    +
    + par->contrast = brightness;
    +
    + ret = ssd1307fb_write_cmd(par->client, SSD1307FB_CONTRAST);
    + if (ret < 0)
    + return ret;
    + ret = ssd1307fb_write_cmd(par->client, par->contrast);
    + if (ret < 0)
    + return ret;
    + return 0;
    +}
    +
    +static int ssd1307fb_get_brightness(struct backlight_device *bdev)
    +{
    + struct ssd1307fb_par *par = bl_get_data(bdev);
    +
    + return par->contrast;
    +}
    +
    +static int ssd1307fb_check_fb(struct backlight_device *bdev,
    + struct fb_info *info)
    +{
    + return (info->bl_dev == bdev);
    +}
    +
    +static const struct backlight_ops ssd1307fb_bl_ops = {
    + .options = BL_CORE_SUSPENDRESUME,
    + .update_status = ssd1307fb_update_bl,
    + .get_brightness = ssd1307fb_get_brightness,
    + .check_fb = ssd1307fb_check_fb,
    +};
    +
    static struct ssd1307fb_deviceinfo ssd1307fb_ssd1305_deviceinfo = {
    .default_vcomh = 0x34,
    .default_dclk_div = 1,
    @@ -464,6 +504,8 @@ MODULE_DEVICE_TABLE(of, ssd1307fb_of_match);
    static int ssd1307fb_probe(struct i2c_client *client,
    const struct i2c_device_id *id)
    {
    + struct backlight_device *bl;
    + char bl_name[12];
    struct fb_info *info;
    struct device_node *node = client->dev.of_node;
    struct fb_deferred_io *ssd1307fb_defio;
    @@ -599,10 +641,24 @@ static int ssd1307fb_probe(struct i2c_client *client,
    goto panel_init_error;
    }

    + snprintf(bl_name, sizeof(bl_name), "ssd1307fb%d", info->node);
    + bl = backlight_device_register(bl_name, &client->dev, par,
    + &ssd1307fb_bl_ops, NULL);
    + bl->props.brightness = par->contrast;
    + bl->props.max_brightness = MAX_CONTRAST;
    + info->bl_dev = bl;
    +
    + if (IS_ERR(bl)) {
    + dev_err(&client->dev, "unable to register backlight device: %ld\n",
    + PTR_ERR(bl));
    + goto bl_init_error;
    + }
    dev_info(&client->dev, "fb%d: %s framebuffer device registered, using %d bytes of video memory\n", info->node, info->fix.id, vmem_size);

    return 0;

    +bl_init_error:
    + unregister_framebuffer(info);
    panel_init_error:
    if (par->device_info->need_pwm) {
    pwm_disable(par->pwm);
    @@ -622,6 +678,8 @@ static int ssd1307fb_remove(struct i2c_client *client)

    ssd1307fb_write_cmd(par->client, SSD1307FB_DISPLAY_OFF);

    + backlight_device_unregister(info->bl_dev);
    +
    unregister_framebuffer(info);
    if (par->device_info->need_pwm) {
    pwm_disable(par->pwm);
    --
    2.3.0


    \
     
     \ /
      Last update: 2015-03-31 21:01    [W:4.108 / U:0.168 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site