// 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 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 <javierm@redhat.com>");
MODULE_LICENSE("GPL v2");
MODULE_IMPORT_NS(DRM_SSD130X);
