lkml.org 
[lkml]   [2022]   [Feb]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 4/7] drm/solomon: Add SSD130X OLED displays I2C support
    Date
    The ssd130x driver only provides the core support for these devices but it
    does not have any bus transport logic. Add a driver to interface over I2C.

    Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
    ---

    Changes in v3:
    - Add a separate driver for SSD130X chips I2C support (Andy Shevchenko)

    drivers/gpu/drm/solomon/Kconfig | 9 ++
    drivers/gpu/drm/solomon/Makefile | 1 +
    drivers/gpu/drm/solomon/ssd130x-i2c.c | 117 ++++++++++++++++++++++++++
    3 files changed, 127 insertions(+)
    create mode 100644 drivers/gpu/drm/solomon/ssd130x-i2c.c

    diff --git a/drivers/gpu/drm/solomon/Kconfig b/drivers/gpu/drm/solomon/Kconfig
    index c969c358a4a7..47e16bc20e0d 100644
    --- a/drivers/gpu/drm/solomon/Kconfig
    +++ b/drivers/gpu/drm/solomon/Kconfig
    @@ -10,3 +10,12 @@ config DRM_SSD130X
    the appropriate bus transport in your chip also must be selected.

    If M is selected the module will be called ssd130x.
    +
    +config DRM_SSD130X_I2C
    + tristate "DRM support for Solomon SSD130X OLED displays (I2C bus)"
    + depends on DRM_SSD130X && I2C
    + select REGMAP_I2C
    + help
    + Say Y here if the SSD130X OLED display is connected via I2C bus.
    +
    + If M is selected the module will be called ssd130x-i2c.
    diff --git a/drivers/gpu/drm/solomon/Makefile b/drivers/gpu/drm/solomon/Makefile
    index f685addb19fe..4bfc5acb0447 100644
    --- a/drivers/gpu/drm/solomon/Makefile
    +++ b/drivers/gpu/drm/solomon/Makefile
    @@ -1 +1,2 @@
    obj-$(CONFIG_DRM_SSD130X) += ssd130x.o
    +obj-$(CONFIG_DRM_SSD130X_I2C) += ssd130x-i2c.o
    diff --git a/drivers/gpu/drm/solomon/ssd130x-i2c.c b/drivers/gpu/drm/solomon/ssd130x-i2c.c
    new file mode 100644
    index 000000000000..ff5f8992b2ff
    --- /dev/null
    +++ b/drivers/gpu/drm/solomon/ssd130x-i2c.c
    @@ -0,0 +1,117 @@
    +// SPDX-License-Identifier: GPL-2.0-only
    +/*
    + * DRM driver for Solomon SSD130X OLED displays (I2C bus)
    + *
    + * Copyright 2022 Red Hat Inc.
    + * Authors: Javier Martinez Canillas <javierm@redhat.com>
    + *
    + * Based on drivers/video/fbdev/ssd1307fb.c
    + * Copyright 2012 Free Electrons
    + */
    +#include <linux/i2c.h>
    +#include <linux/module.h>
    +
    +#include "ssd130x.h"
    +
    +#define DRIVER_NAME "ssd130x-i2c"
    +#define DRIVER_DESC "DRM driver for Solomon SSD130X OLED displays (I2C)"
    +
    +static const struct regmap_config ssd130x_i2c_regmap_config = {
    + .reg_bits = 8,
    + .val_bits = 8,
    +};
    +
    +static int ssd130x_i2c_probe(struct i2c_client *client)
    +{
    + struct ssd130x_device *ssd130x;
    + struct regmap *regmap;
    +
    + regmap = devm_regmap_init_i2c(client, &ssd130x_i2c_regmap_config);
    + if (IS_ERR(regmap))
    + return PTR_ERR(regmap);
    +
    + ssd130x = ssd130x_probe(&client->dev, regmap);
    +
    + if (IS_ERR(ssd130x))
    + return PTR_ERR(ssd130x);
    +
    + i2c_set_clientdata(client, ssd130x);
    +
    + return 0;
    +}
    +
    +static int ssd130x_i2c_remove(struct i2c_client *client)
    +{
    + struct ssd130x_device *ssd130x = i2c_get_clientdata(client);
    +
    + return ssd130x_remove(ssd130x);
    +}
    +
    +static void ssd130x_i2c_shutdown(struct i2c_client *client)
    +{
    + struct ssd130x_device *ssd130x = i2c_get_clientdata(client);
    +
    + ssd130x_shutdown(ssd130x);
    +}
    +
    +static struct ssd130x_deviceinfo ssd130x_ssd1305_deviceinfo = {
    + .default_vcomh = 0x34,
    + .default_dclk_div = 1,
    + .default_dclk_frq = 7,
    +};
    +
    +static struct ssd130x_deviceinfo ssd130x_ssd1306_deviceinfo = {
    + .default_vcomh = 0x20,
    + .default_dclk_div = 1,
    + .default_dclk_frq = 8,
    + .need_chargepump = 1,
    +};
    +
    +static struct ssd130x_deviceinfo ssd130x_ssd1307_deviceinfo = {
    + .default_vcomh = 0x20,
    + .default_dclk_div = 2,
    + .default_dclk_frq = 12,
    + .need_pwm = 1,
    +};
    +
    +static struct ssd130x_deviceinfo ssd130x_ssd1309_deviceinfo = {
    + .default_vcomh = 0x34,
    + .default_dclk_div = 1,
    + .default_dclk_frq = 10,
    +};
    +
    +static const struct of_device_id ssd130x_of_match[] = {
    + {
    + .compatible = "solomon,ssd1305fb-i2c",
    + .data = (void *)&ssd130x_ssd1305_deviceinfo,
    + },
    + {
    + .compatible = "solomon,ssd1306fb-i2c",
    + .data = (void *)&ssd130x_ssd1306_deviceinfo,
    + },
    + {
    + .compatible = "solomon,ssd1307fb-i2c",
    + .data = (void *)&ssd130x_ssd1307_deviceinfo,
    + },
    + {
    + .compatible = "solomon,ssd1309fb-i2c",
    + .data = (void *)&ssd130x_ssd1309_deviceinfo,
    + },
    + { /* sentinel */ },
    +};
    +MODULE_DEVICE_TABLE(of, ssd130x_of_match);
    +
    +static struct i2c_driver ssd130x_i2c_driver = {
    + .driver = {
    + .name = DRIVER_NAME,
    + .of_match_table = ssd130x_of_match,
    + },
    + .probe_new = ssd130x_i2c_probe,
    + .remove = ssd130x_i2c_remove,
    + .shutdown = ssd130x_i2c_shutdown,
    +};
    +module_i2c_driver(ssd130x_i2c_driver);
    +
    +MODULE_DESCRIPTION(DRIVER_DESC);
    +MODULE_AUTHOR("Javier Martinez Canillas <javierm@redhat.com>");
    +MODULE_LICENSE("GPL v2");
    --
    2.34.1
    \
     
     \ /
      Last update: 2022-02-09 10:40    [W:4.790 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site