1*052039e3SMarcus Folkesson // SPDX-License-Identifier: GPL-2.0-or-later 2*052039e3SMarcus Folkesson /* 3*052039e3SMarcus Folkesson * Driver for Sitronix ST7571 connected via SPI bus. 4*052039e3SMarcus Folkesson * 5*052039e3SMarcus Folkesson * Copyright (C) 2025 Marcus Folkesson <marcus.folkesson@gmail.com> 6*052039e3SMarcus Folkesson */ 7*052039e3SMarcus Folkesson 8*052039e3SMarcus Folkesson #include <linux/spi/spi.h> 9*052039e3SMarcus Folkesson #include <linux/module.h> 10*052039e3SMarcus Folkesson #include <linux/regmap.h> 11*052039e3SMarcus Folkesson 12*052039e3SMarcus Folkesson #include "st7571.h" 13*052039e3SMarcus Folkesson 14*052039e3SMarcus Folkesson static const struct regmap_config st7571_spi_regmap_config = { 15*052039e3SMarcus Folkesson .reg_bits = 8, 16*052039e3SMarcus Folkesson .val_bits = 8, 17*052039e3SMarcus Folkesson .can_multi_write = true, 18*052039e3SMarcus Folkesson }; 19*052039e3SMarcus Folkesson 20*052039e3SMarcus Folkesson static int st7571_spi_probe(struct spi_device *spi) 21*052039e3SMarcus Folkesson { 22*052039e3SMarcus Folkesson struct st7571_device *st7571; 23*052039e3SMarcus Folkesson struct regmap *regmap; 24*052039e3SMarcus Folkesson 25*052039e3SMarcus Folkesson regmap = devm_regmap_init_spi(spi, &st7571_spi_regmap_config); 26*052039e3SMarcus Folkesson if (IS_ERR(regmap)) { 27*052039e3SMarcus Folkesson return dev_err_probe(&spi->dev, PTR_ERR(regmap), 28*052039e3SMarcus Folkesson "Failed to initialize regmap\n"); 29*052039e3SMarcus Folkesson } 30*052039e3SMarcus Folkesson 31*052039e3SMarcus Folkesson st7571 = st7571_probe(&spi->dev, regmap); 32*052039e3SMarcus Folkesson if (IS_ERR(st7571)) 33*052039e3SMarcus Folkesson return dev_err_probe(&spi->dev, PTR_ERR(st7571), 34*052039e3SMarcus Folkesson "Failed to initialize regmap\n"); 35*052039e3SMarcus Folkesson 36*052039e3SMarcus Folkesson spi_set_drvdata(spi, st7571); 37*052039e3SMarcus Folkesson return 0; 38*052039e3SMarcus Folkesson } 39*052039e3SMarcus Folkesson 40*052039e3SMarcus Folkesson static void st7571_spi_remove(struct spi_device *spi) 41*052039e3SMarcus Folkesson { 42*052039e3SMarcus Folkesson struct st7571_device *st7571 = spi_get_drvdata(spi); 43*052039e3SMarcus Folkesson 44*052039e3SMarcus Folkesson st7571_remove(st7571); 45*052039e3SMarcus Folkesson } 46*052039e3SMarcus Folkesson 47*052039e3SMarcus Folkesson static const struct of_device_id st7571_of_match[] = { 48*052039e3SMarcus Folkesson { .compatible = "sitronix,st7567", .data = &st7567_config }, 49*052039e3SMarcus Folkesson { .compatible = "sitronix,st7571", .data = &st7571_config }, 50*052039e3SMarcus Folkesson {}, 51*052039e3SMarcus Folkesson }; 52*052039e3SMarcus Folkesson MODULE_DEVICE_TABLE(of, st7571_of_match); 53*052039e3SMarcus Folkesson 54*052039e3SMarcus Folkesson static const struct spi_device_id st7571_spi_id[] = { 55*052039e3SMarcus Folkesson { "st7567", 0 }, 56*052039e3SMarcus Folkesson { "st7571", 0 }, 57*052039e3SMarcus Folkesson { } 58*052039e3SMarcus Folkesson }; 59*052039e3SMarcus Folkesson MODULE_DEVICE_TABLE(spi, st7571_spi_id); 60*052039e3SMarcus Folkesson 61*052039e3SMarcus Folkesson static struct spi_driver st7571_spi_driver = { 62*052039e3SMarcus Folkesson .driver = { 63*052039e3SMarcus Folkesson .name = "st7571-spi", 64*052039e3SMarcus Folkesson .of_match_table = st7571_of_match, 65*052039e3SMarcus Folkesson }, 66*052039e3SMarcus Folkesson .probe = st7571_spi_probe, 67*052039e3SMarcus Folkesson .remove = st7571_spi_remove, 68*052039e3SMarcus Folkesson .id_table = st7571_spi_id, 69*052039e3SMarcus Folkesson }; 70*052039e3SMarcus Folkesson 71*052039e3SMarcus Folkesson module_spi_driver(st7571_spi_driver); 72*052039e3SMarcus Folkesson 73*052039e3SMarcus Folkesson MODULE_AUTHOR("Marcus Folkesson <marcus.folkesson@gmail.com>"); 74*052039e3SMarcus Folkesson MODULE_DESCRIPTION("DRM Driver for Sitronix ST7571 LCD controller (SPI)"); 75*052039e3SMarcus Folkesson MODULE_LICENSE("GPL"); 76*052039e3SMarcus Folkesson MODULE_IMPORT_NS("DRM_ST7571"); 77