// 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 * * Based on drivers/video/fbdev/ssd1307fb.c * Copyright 2012 Free Electrons */ #include #include #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 void ssd130x_i2c_remove(struct i2c_client *client) { struct ssd130x_device *ssd130x = i2c_get_clientdata(client); 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 "); MODULE_LICENSE("GPL v2"); MODULE_IMPORT_NS(DRM_SSD130X);