mirror of
https://git.proxmox.com/git/mirror_ubuntu-kernels.git
synced 2025-12-26 21:02:48 +00:00
These are declared in the ssd130x-i2c transport driver but the information is not I2C specific, and could be used by other SSD130x transport drivers. Move them to the ssd130x core driver and just set the OF device entries to an ID that could be used to lookup the correct device info from an array. While being there, also move the SSD130X_DATA and SSD130X_COMMAND control bytes. Since even though they are used by the I2C interface, they could also be useful for other transport protocols such as SPI. Suggested-by: Chen-Yu Tsai <wens@kernel.org> Signed-off-by: Javier Martinez Canillas <javierm@redhat.com> Acked-by: Mark Brown <broonie@kernel.org> Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be> Link: https://patchwork.freedesktop.org/patch/msgid/20220419214824.335075-5-javierm@redhat.com
113 lines
2.6 KiB
C
113 lines
2.6 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* DRM driver for Solomon SSD130x OLED displays (I2C bus)
|
|
*
|
|
* Copyright 2022 Red Hat Inc.
|
|
* Author: 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 const struct of_device_id ssd130x_of_match[] = {
|
|
{
|
|
.compatible = "sinowealth,sh1106",
|
|
.data = &ssd130x_variants[SH1106_ID],
|
|
},
|
|
{
|
|
.compatible = "solomon,ssd1305",
|
|
.data = &ssd130x_variants[SSD1305_ID],
|
|
},
|
|
{
|
|
.compatible = "solomon,ssd1306",
|
|
.data = &ssd130x_variants[SSD1306_ID],
|
|
},
|
|
{
|
|
.compatible = "solomon,ssd1307",
|
|
.data = &ssd130x_variants[SSD1307_ID],
|
|
},
|
|
{
|
|
.compatible = "solomon,ssd1309",
|
|
.data = &ssd130x_variants[SSD1309_ID],
|
|
},
|
|
/* Deprecated but kept for backward compatibility */
|
|
{
|
|
.compatible = "solomon,ssd1305fb-i2c",
|
|
.data = &ssd130x_variants[SSD1305_ID],
|
|
},
|
|
{
|
|
.compatible = "solomon,ssd1306fb-i2c",
|
|
.data = &ssd130x_variants[SSD1306_ID],
|
|
},
|
|
{
|
|
.compatible = "solomon,ssd1307fb-i2c",
|
|
.data = &ssd130x_variants[SSD1307_ID],
|
|
},
|
|
{
|
|
.compatible = "solomon,ssd1309fb-i2c",
|
|
.data = &ssd130x_variants[SSD1309_ID],
|
|
},
|
|
{ /* 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");
|
|
MODULE_IMPORT_NS(DRM_SSD130X);
|