From nobody Fri Jan 2 17:25:32 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 847FCCD611D for ; Mon, 9 Oct 2023 18:37:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1378128AbjJIShY (ORCPT ); Mon, 9 Oct 2023 14:37:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49666 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1378121AbjJIShK (ORCPT ); Mon, 9 Oct 2023 14:37:10 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 159C8B7 for ; Mon, 9 Oct 2023 11:36:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1696876577; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ZQtzxS22vOw1sYR83d0Rh3aDs2Kq0xcl9WK0ryRbJEA=; b=KuQ1jihf1IFIGecFzJgt5Nzrls+S6H/iKTBoRlIDthvlvfotYCKiCsy/kCM0B4woMBfjWG zEnrIZ2C72RcKhOEz5Hr79jvSpWs6Nx01CUMvqaj1vahIqZroNbEigdLDqPY3vcYxxZnvm P/1Ml/U1oBSgNdAa9+NjM42GkN6Dqfo= Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-680-qDZySENjOxGobsVmlMK9ig-1; Mon, 09 Oct 2023 14:36:01 -0400 X-MC-Unique: qDZySENjOxGobsVmlMK9ig-1 Received: by mail-wr1-f71.google.com with SMTP id ffacd0b85a97d-323306960e3so3212687f8f.1 for ; Mon, 09 Oct 2023 11:36:01 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1696876560; x=1697481360; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ZQtzxS22vOw1sYR83d0Rh3aDs2Kq0xcl9WK0ryRbJEA=; b=E76NZL7U22YQl8JKRQdXIaYfvQ9+l5yjq3hMds2QsjOitHwnttrmcpJSnvkoAXFspW 5Pb1hZMzJhGDHeSAJt8peZRle0CZJJKZ4OiAKM1bUd29sw6zvQQlPe3DenEu3fbLCK/E mX5/PrQarUspCNJfjvdJ2Xsg8qKwZmhIavjWGi3D+HraPKjyYjmXtP2lj3j8i3CCx5qB E0uhBlxL1kSP8jF1t81MLVrRdAkO1OzfDuxA9PfufUoY17d3rNk0B3ry7SoxR6r5Eyq7 nRcakaeXOThuFagReSU00Yfp3Zw1CEC7ZW6g5YazXio7NhgiSIkYyv15KfKcgOElNmB1 klqw== X-Gm-Message-State: AOJu0YyeTStptYv5rz6P+R/C7OyTitUzVGr2XIbN8EVl9lV2Hx24XD7K l7hKqFF4gvzVLoT1nqU1wRh6oqBZez8g/Bk/LVOsT/3Xc/45NtUXsiydqdrVrslyjJjAx79Tghh N0sWsn+YiS/tpk1tNLVs7PEhYDsEpUqxX0+EUU7vbR6xVS/384fLslq7R7w9tO8mc+onvSenT26 Tmy8oZQLM= X-Received: by 2002:adf:edce:0:b0:317:58e4:e941 with SMTP id v14-20020adfedce000000b0031758e4e941mr14527342wro.33.1696876559733; Mon, 09 Oct 2023 11:35:59 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGLxco/wzAWiAo6IzkCN3y+muqM+F9g/NYV5e2UUAr05jilQZ8GgRD3J7WRGsBFHNEOBkwloQ== X-Received: by 2002:adf:edce:0:b0:317:58e4:e941 with SMTP id v14-20020adfedce000000b0031758e4e941mr14527317wro.33.1696876559164; Mon, 09 Oct 2023 11:35:59 -0700 (PDT) Received: from localhost (205.pool92-176-231.dynamic.orange.es. [92.176.231.205]) by smtp.gmail.com with ESMTPSA id l10-20020a7bc44a000000b004067e905f44sm11968813wmi.9.2023.10.09.11.35.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Oct 2023 11:35:58 -0700 (PDT) From: Javier Martinez Canillas To: linux-kernel@vger.kernel.org Cc: Maxime Ripard , Thomas Zimmermann , Geert Uytterhoeven , Javier Martinez Canillas , Daniel Vetter , David Airlie , Maarten Lankhorst , dri-devel@lists.freedesktop.org Subject: [PATCH 1/8] drm/solomon: Rename ssd130x driver to ssd13xx Date: Mon, 9 Oct 2023 20:34:15 +0200 Message-ID: <20231009183522.543918-2-javierm@redhat.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231009183522.543918-1-javierm@redhat.com> References: <20231009183522.543918-1-javierm@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The driver only supports the SSD130x family of Solomon OLED controllers now, but will be extended to also support the SSD132x (4-bit grayscale) and SSD133x (16-bit RGB) controller families. Rename driver to ssd13xx. Signed-off-by: Javier Martinez Canillas --- MAINTAINERS | 6 ++-- drivers/gpu/drm/solomon/Kconfig | 28 +++++++++---------- drivers/gpu/drm/solomon/Makefile | 6 ++-- .../solomon/{ssd130x-i2c.c =3D> ssd13xx-i2c.c} | 10 +++---- .../solomon/{ssd130x-spi.c =3D> ssd13xx-spi.c} | 14 +++++----- .../gpu/drm/solomon/{ssd130x.c =3D> ssd13xx.c} | 10 +++---- .../gpu/drm/solomon/{ssd130x.h =3D> ssd13xx.h} | 8 +++--- 7 files changed, 41 insertions(+), 41 deletions(-) rename drivers/gpu/drm/solomon/{ssd130x-i2c.c =3D> ssd13xx-i2c.c} (92%) rename drivers/gpu/drm/solomon/{ssd130x-spi.c =3D> ssd13xx-spi.c} (93%) rename drivers/gpu/drm/solomon/{ssd130x.c =3D> ssd13xx.c} (99%) rename drivers/gpu/drm/solomon/{ssd130x.h =3D> ssd13xx.h} (94%) diff --git a/MAINTAINERS b/MAINTAINERS index 46ca5c4affdb..8eab0d9dca89 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -6728,12 +6728,12 @@ T: git git://anongit.freedesktop.org/drm/drm-misc F: Documentation/devicetree/bindings/display/sitronix,st7735r.yaml F: drivers/gpu/drm/tiny/st7735r.c =20 -DRM DRIVER FOR SOLOMON SSD130X OLED DISPLAYS +DRM DRIVER FOR SOLOMON SSD13XX OLED DISPLAYS M: Javier Martinez Canillas S: Maintained T: git git://anongit.freedesktop.org/drm/drm-misc -F: Documentation/devicetree/bindings/display/solomon,ssd1307fb.yaml -F: drivers/gpu/drm/solomon/ssd130x* +F: Documentation/devicetree/bindings/display/solomon,ssd13*.yaml +F: drivers/gpu/drm/solomon/ssd13* =20 DRM DRIVER FOR ST-ERICSSON MCDE M: Linus Walleij diff --git a/drivers/gpu/drm/solomon/Kconfig b/drivers/gpu/drm/solomon/Kcon= fig index e170716d976b..ba9f631402bc 100644 --- a/drivers/gpu/drm/solomon/Kconfig +++ b/drivers/gpu/drm/solomon/Kconfig @@ -1,31 +1,31 @@ -config DRM_SSD130X - tristate "DRM support for Solomon SSD130x OLED displays" +config DRM_SSD13XX + tristate "DRM support for Solomon SSD13xx OLED displays" depends on DRM && MMU select BACKLIGHT_CLASS_DEVICE select DRM_GEM_SHMEM_HELPER select DRM_KMS_HELPER help - DRM driver for the SSD130x Solomon and SINO WEALTH SH110x OLED + DRM driver for the SSD13xx Solomon and SINO WEALTH SH110x OLED controllers. This is only for the core driver, a driver for the appropriate bus transport in your chip also must be selected. =20 - If M is selected the module will be called ssd130x. + If M is selected the module will be called ssd13xx. =20 -config DRM_SSD130X_I2C - tristate "DRM support for Solomon SSD130x OLED displays (I2C bus)" - depends on DRM_SSD130X && I2C +config DRM_SSD13XX_I2C + tristate "DRM support for Solomon SSD13xx OLED displays (I2C bus)" + depends on DRM_SSD13XX && I2C select REGMAP_I2C help - Say Y here if the SSD130x or SH110x OLED display is connected via + Say Y here if the SSD13xx or SH110x OLED display is connected via I2C bus. =20 - If M is selected the module will be called ssd130x-i2c. + If M is selected the module will be called ssd13xx-i2c. =20 -config DRM_SSD130X_SPI - tristate "DRM support for Solomon SSD130X OLED displays (SPI bus)" - depends on DRM_SSD130X && SPI +config DRM_SSD13XX_SPI + tristate "DRM support for Solomon SSD13xx OLED displays (SPI bus)" + depends on DRM_SSD13XX && SPI select REGMAP help - Say Y here if the SSD130x OLED display is connected via SPI bus. + Say Y here if the SSD13xx OLED display is connected via SPI bus. =20 - If M is selected the module will be called ssd130x-spi. + If M is selected the module will be called ssd13xx-spi. diff --git a/drivers/gpu/drm/solomon/Makefile b/drivers/gpu/drm/solomon/Mak= efile index b5fc792257d7..6cec14c4062d 100644 --- a/drivers/gpu/drm/solomon/Makefile +++ b/drivers/gpu/drm/solomon/Makefile @@ -1,3 +1,3 @@ -obj-$(CONFIG_DRM_SSD130X) +=3D ssd130x.o -obj-$(CONFIG_DRM_SSD130X_I2C) +=3D ssd130x-i2c.o -obj-$(CONFIG_DRM_SSD130X_SPI) +=3D ssd130x-spi.o +obj-$(CONFIG_DRM_SSD13XX) +=3D ssd13xx.o +obj-$(CONFIG_DRM_SSD13XX_I2C) +=3D ssd13xx-i2c.o +obj-$(CONFIG_DRM_SSD13XX_SPI) +=3D ssd13xx-spi.o diff --git a/drivers/gpu/drm/solomon/ssd130x-i2c.c b/drivers/gpu/drm/solomo= n/ssd13xx-i2c.c similarity index 92% rename from drivers/gpu/drm/solomon/ssd130x-i2c.c rename to drivers/gpu/drm/solomon/ssd13xx-i2c.c index b4eb2d64bf6e..f4d0feaa8515 100644 --- a/drivers/gpu/drm/solomon/ssd130x-i2c.c +++ b/drivers/gpu/drm/solomon/ssd13xx-i2c.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * DRM driver for Solomon SSD130x OLED displays (I2C bus) + * DRM driver for Solomon SSD13xx OLED displays (I2C bus) * * Copyright 2022 Red Hat Inc. * Author: Javier Martinez Canillas @@ -11,10 +11,10 @@ #include #include =20 -#include "ssd130x.h" +#include "ssd13xx.h" =20 -#define DRIVER_NAME "ssd130x-i2c" -#define DRIVER_DESC "DRM driver for Solomon SSD130x OLED displays (I2C)" +#define DRIVER_NAME "ssd13xx-i2c" +#define DRIVER_DESC "DRM driver for Solomon SSD13xx OLED displays (I2C)" =20 static const struct regmap_config ssd130x_i2c_regmap_config =3D { .reg_bits =3D 8, @@ -109,4 +109,4 @@ module_i2c_driver(ssd130x_i2c_driver); MODULE_DESCRIPTION(DRIVER_DESC); MODULE_AUTHOR("Javier Martinez Canillas "); MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(DRM_SSD130X); +MODULE_IMPORT_NS(DRM_SSD13XX); diff --git a/drivers/gpu/drm/solomon/ssd130x-spi.c b/drivers/gpu/drm/solomo= n/ssd13xx-spi.c similarity index 93% rename from drivers/gpu/drm/solomon/ssd130x-spi.c rename to drivers/gpu/drm/solomon/ssd13xx-spi.c index 19ab4942cb33..20d1e3711e2f 100644 --- a/drivers/gpu/drm/solomon/ssd130x-spi.c +++ b/drivers/gpu/drm/solomon/ssd13xx-spi.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * DRM driver for Solomon SSD130X OLED displays (SPI bus) + * DRM driver for Solomon SSD13xx OLED displays (SPI bus) * * Copyright 2022 Red Hat Inc. * Authors: Javier Martinez Canillas @@ -8,10 +8,10 @@ #include #include =20 -#include "ssd130x.h" +#include "ssd13xx.h" =20 -#define DRIVER_NAME "ssd130x-spi" -#define DRIVER_DESC "DRM driver for Solomon SSD130X OLED displays (SPI)" +#define DRIVER_NAME "ssd13xx-spi" +#define DRIVER_DESC "DRM driver for Solomon SSD13xx OLED displays (SPI)" =20 struct ssd130x_spi_transport { struct spi_device *spi; @@ -25,7 +25,7 @@ struct ssd130x_spi_transport { * prior to every data byte, that contains a bit with the D/C# value. * * These control bytes are considered registers by the ssd130x core driver - * and can be used by the ssd130x SPI driver to determine if the data sent + * and can be used by the ssd13xx SPI driver to determine if the data sent * is for a command register or for the Graphic Display Data RAM (GDDRAM). */ static int ssd130x_spi_write(void *context, const void *data, size_t count) @@ -132,7 +132,7 @@ static const struct of_device_id ssd130x_of_match[] =3D= { }; MODULE_DEVICE_TABLE(of, ssd130x_of_match); =20 -#if IS_MODULE(CONFIG_DRM_SSD130X_SPI) +#if IS_MODULE(CONFIG_DRM_SSD13XX_SPI) /* * The SPI core always reports a MODALIAS uevent of the form "spi:", = even * if the device was registered via OF. This means that the module will no= t be @@ -166,4 +166,4 @@ module_spi_driver(ssd130x_spi_driver); MODULE_DESCRIPTION(DRIVER_DESC); MODULE_AUTHOR("Javier Martinez Canillas "); MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(DRM_SSD130X); +MODULE_IMPORT_NS(DRM_SSD13XX); diff --git a/drivers/gpu/drm/solomon/ssd130x.c b/drivers/gpu/drm/solomon/ss= d13xx.c similarity index 99% rename from drivers/gpu/drm/solomon/ssd130x.c rename to drivers/gpu/drm/solomon/ssd13xx.c index 6dcf3e041113..0bf12965719a 100644 --- a/drivers/gpu/drm/solomon/ssd130x.c +++ b/drivers/gpu/drm/solomon/ssd13xx.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * DRM driver for Solomon SSD130x OLED displays + * DRM driver for Solomon SSD13xx OLED displays * * Copyright 2022 Red Hat Inc. * Author: Javier Martinez Canillas @@ -34,10 +34,10 @@ #include #include =20 -#include "ssd130x.h" +#include "ssd13xx.h" =20 -#define DRIVER_NAME "ssd130x" -#define DRIVER_DESC "DRM driver for Solomon SSD130x OLED displays" +#define DRIVER_NAME "ssd13xx" +#define DRIVER_DESC "DRM driver for Solomon SSD13xx OLED displays" #define DRIVER_DATE "20220131" #define DRIVER_MAJOR 1 #define DRIVER_MINOR 0 @@ -139,7 +139,7 @@ const struct ssd130x_deviceinfo ssd130x_variants[] =3D { .page_height =3D 8, } }; -EXPORT_SYMBOL_NS_GPL(ssd130x_variants, DRM_SSD130X); +EXPORT_SYMBOL_NS_GPL(ssd130x_variants, DRM_SSD13XX); =20 struct ssd130x_crtc_state { struct drm_crtc_state base; diff --git a/drivers/gpu/drm/solomon/ssd130x.h b/drivers/gpu/drm/solomon/ss= d13xx.h similarity index 94% rename from drivers/gpu/drm/solomon/ssd130x.h rename to drivers/gpu/drm/solomon/ssd13xx.h index aa39b13615eb..f89ccd11cd29 100644 --- a/drivers/gpu/drm/solomon/ssd130x.h +++ b/drivers/gpu/drm/solomon/ssd13xx.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* * Header file for: - * DRM driver for Solomon SSD130x OLED displays + * DRM driver for Solomon SSD13xx OLED displays * * Copyright 2022 Red Hat Inc. * Author: Javier Martinez Canillas @@ -10,8 +10,8 @@ * Copyright 2012 Free Electrons */ =20 -#ifndef __SSD130X_H__ -#define __SSD130X_H__ +#ifndef __SSD13XX_H__ +#define __SSD13XX_H__ =20 #include #include @@ -97,4 +97,4 @@ struct ssd130x_device *ssd130x_probe(struct device *dev, = struct regmap *regmap); void ssd130x_remove(struct ssd130x_device *ssd130x); void ssd130x_shutdown(struct ssd130x_device *ssd130x); =20 -#endif /* __SSD130X_H__ */ +#endif /* __SSD13XX_H__ */ --=20 2.41.0 From nobody Fri Jan 2 17:25:33 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9C20DCD611D for ; Mon, 9 Oct 2023 18:36:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1378057AbjJISg5 (ORCPT ); Mon, 9 Oct 2023 14:36:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47856 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1378081AbjJISgy (ORCPT ); Mon, 9 Oct 2023 14:36:54 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5E656AC for ; Mon, 9 Oct 2023 11:36:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1696876565; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=AS2xzFzZgdgyN36MvD7TG0hgNc8bhRrNc8wsTPEa2bU=; b=XQtqZDp6jFoZNKeL+vn9S2oLm9ufmXelJ4MUzD/RGgXfB4Y5uM2FgS/FNuYZygjcp92rJE 6bqnJ+C1N4oEHUyj3IuwUeRFxbgWqcSHW8LhWl+mlAfD27x2mzBtlWsWwE+lJvDjssM0Jd EIURPUD6orrBpMLcWYtznQMgFU1VGUw= Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-456-VKvyRWq9Oaunv279h2VyQw-1; Mon, 09 Oct 2023 14:36:03 -0400 X-MC-Unique: VKvyRWq9Oaunv279h2VyQw-1 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-3fe182913c5so35693245e9.0 for ; Mon, 09 Oct 2023 11:36:03 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1696876562; x=1697481362; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=AS2xzFzZgdgyN36MvD7TG0hgNc8bhRrNc8wsTPEa2bU=; b=jqnzUM06VwYNtQoqrM5V4zsENI6NGMozMkYSk2nkDdtPse84/AUhhPkyqD5G7M6uBn u3bDBy7EKfTAoIVfModY2vgJnZlJ5cJGPHfp8UQq1IyqtvxgCoAk37DEkhhxnDO9RFsS hD13MrqBnbuuguKL8+73q10LMUJcxIomnr80uuYizEykFh0zMh+RYCMMWiKujyAEas9k dNOxVnxYRkuTIruuMEOQ76BWa5h/U+BTf/A/5z0OA8mHOk+D50DViPKgYH3mcvucU7z0 IkaBdwmx+Eg1yQrmPuSvuwdqB/tej6bpkkSVbpo5FltahQMDDKKLvGWiLy1aJB5GE7Y3 GHyA== X-Gm-Message-State: AOJu0Yys3VL1+/24OzGQB3X/qaqLpNGnygMgzYAl6WXArp25Bn9ZwMMd CnxiXNrFsLHpAcAiciOjHPhux0sdJQASfr17mSZTSNC0zqJZqmKzN+vdrqcTw5DtsrXK1ogVf3q syToPukjJ+dhlKObU0c0POKUD2wfHEflq+gnJ2iYl9K5xLwQrmXZyJL0Ti81BYY0qmDGXcVX2Eq isqjnlEp8= X-Received: by 2002:a05:600c:22ce:b0:405:4c3a:796f with SMTP id 14-20020a05600c22ce00b004054c3a796fmr15028089wmg.2.1696876561568; Mon, 09 Oct 2023 11:36:01 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHWJhKMLn5coCsSo/jRIXKww/SawpnLUP1yHfiQwkSbB3lgXd7mxY+dq9vvijq7p0oEoooq3g== X-Received: by 2002:a05:600c:22ce:b0:405:4c3a:796f with SMTP id 14-20020a05600c22ce00b004054c3a796fmr15028051wmg.2.1696876560672; Mon, 09 Oct 2023 11:36:00 -0700 (PDT) Received: from localhost (205.pool92-176-231.dynamic.orange.es. [92.176.231.205]) by smtp.gmail.com with ESMTPSA id k22-20020a7bc416000000b00404719b05b5sm11897542wmi.27.2023.10.09.11.36.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Oct 2023 11:36:00 -0700 (PDT) From: Javier Martinez Canillas To: linux-kernel@vger.kernel.org Cc: Maxime Ripard , Thomas Zimmermann , Geert Uytterhoeven , Javier Martinez Canillas , Daniel Vetter , David Airlie , Maarten Lankhorst , Thierry Reding , =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= , dri-devel@lists.freedesktop.org, linux-pwm@vger.kernel.org Subject: [PATCH 2/8] drm/ssd13xx: Rename data structures and functions prefixes Date: Mon, 9 Oct 2023 20:34:16 +0200 Message-ID: <20231009183522.543918-3-javierm@redhat.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231009183522.543918-1-javierm@redhat.com> References: <20231009183522.543918-1-javierm@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Since the driver is now called ssd13xx and will support other Solomon OLED controller families, rename the structs and functions prefixes as well. Signed-off-by: Javier Martinez Canillas --- drivers/gpu/drm/solomon/ssd13xx-i2c.c | 63 +-- drivers/gpu/drm/solomon/ssd13xx-spi.c | 73 +-- drivers/gpu/drm/solomon/ssd13xx.c | 644 +++++++++++++------------- drivers/gpu/drm/solomon/ssd13xx.h | 18 +- 4 files changed, 400 insertions(+), 398 deletions(-) diff --git a/drivers/gpu/drm/solomon/ssd13xx-i2c.c b/drivers/gpu/drm/solomo= n/ssd13xx-i2c.c index f4d0feaa8515..d9cece374331 100644 --- a/drivers/gpu/drm/solomon/ssd13xx-i2c.c +++ b/drivers/gpu/drm/solomon/ssd13xx-i2c.c @@ -16,95 +16,96 @@ #define DRIVER_NAME "ssd13xx-i2c" #define DRIVER_DESC "DRM driver for Solomon SSD13xx OLED displays (I2C)" =20 -static const struct regmap_config ssd130x_i2c_regmap_config =3D { +static const struct regmap_config ssd13xx_i2c_regmap_config =3D { .reg_bits =3D 8, .val_bits =3D 8, }; =20 -static int ssd130x_i2c_probe(struct i2c_client *client) +static int ssd13xx_i2c_probe(struct i2c_client *client) { - struct ssd130x_device *ssd130x; + struct ssd13xx_device *ssd13xx; struct regmap *regmap; =20 - regmap =3D devm_regmap_init_i2c(client, &ssd130x_i2c_regmap_config); + regmap =3D devm_regmap_init_i2c(client, &ssd13xx_i2c_regmap_config); if (IS_ERR(regmap)) return PTR_ERR(regmap); =20 - ssd130x =3D ssd130x_probe(&client->dev, regmap); - if (IS_ERR(ssd130x)) - return PTR_ERR(ssd130x); + ssd13xx =3D ssd13xx_probe(&client->dev, regmap); + if (IS_ERR(ssd13xx)) + return PTR_ERR(ssd13xx); =20 - i2c_set_clientdata(client, ssd130x); + i2c_set_clientdata(client, ssd13xx); =20 return 0; } =20 -static void ssd130x_i2c_remove(struct i2c_client *client) +static void ssd13xx_i2c_remove(struct i2c_client *client) { - struct ssd130x_device *ssd130x =3D i2c_get_clientdata(client); + struct ssd13xx_device *ssd13xx =3D i2c_get_clientdata(client); =20 - ssd130x_remove(ssd130x); + ssd13xx_remove(ssd13xx); } =20 -static void ssd130x_i2c_shutdown(struct i2c_client *client) +static void ssd13xx_i2c_shutdown(struct i2c_client *client) { - struct ssd130x_device *ssd130x =3D i2c_get_clientdata(client); + struct ssd13xx_device *ssd13xx =3D i2c_get_clientdata(client); =20 - ssd130x_shutdown(ssd130x); + ssd13xx_shutdown(ssd13xx); } =20 -static const struct of_device_id ssd130x_of_match[] =3D { +static const struct of_device_id ssd13xx_of_match[] =3D { + /* ssd130x family */ { .compatible =3D "sinowealth,sh1106", - .data =3D &ssd130x_variants[SH1106_ID], + .data =3D &ssd13xx_variants[SH1106_ID], }, { .compatible =3D "solomon,ssd1305", - .data =3D &ssd130x_variants[SSD1305_ID], + .data =3D &ssd13xx_variants[SSD1305_ID], }, { .compatible =3D "solomon,ssd1306", - .data =3D &ssd130x_variants[SSD1306_ID], + .data =3D &ssd13xx_variants[SSD1306_ID], }, { .compatible =3D "solomon,ssd1307", - .data =3D &ssd130x_variants[SSD1307_ID], + .data =3D &ssd13xx_variants[SSD1307_ID], }, { .compatible =3D "solomon,ssd1309", - .data =3D &ssd130x_variants[SSD1309_ID], + .data =3D &ssd13xx_variants[SSD1309_ID], }, /* Deprecated but kept for backward compatibility */ { .compatible =3D "solomon,ssd1305fb-i2c", - .data =3D &ssd130x_variants[SSD1305_ID], + .data =3D &ssd13xx_variants[SSD1305_ID], }, { .compatible =3D "solomon,ssd1306fb-i2c", - .data =3D &ssd130x_variants[SSD1306_ID], + .data =3D &ssd13xx_variants[SSD1306_ID], }, { .compatible =3D "solomon,ssd1307fb-i2c", - .data =3D &ssd130x_variants[SSD1307_ID], + .data =3D &ssd13xx_variants[SSD1307_ID], }, { .compatible =3D "solomon,ssd1309fb-i2c", - .data =3D &ssd130x_variants[SSD1309_ID], + .data =3D &ssd13xx_variants[SSD1309_ID], }, { /* sentinel */ } }; -MODULE_DEVICE_TABLE(of, ssd130x_of_match); +MODULE_DEVICE_TABLE(of, ssd13xx_of_match); =20 -static struct i2c_driver ssd130x_i2c_driver =3D { +static struct i2c_driver ssd13xx_i2c_driver =3D { .driver =3D { .name =3D DRIVER_NAME, - .of_match_table =3D ssd130x_of_match, + .of_match_table =3D ssd13xx_of_match, }, - .probe =3D ssd130x_i2c_probe, - .remove =3D ssd130x_i2c_remove, - .shutdown =3D ssd130x_i2c_shutdown, + .probe =3D ssd13xx_i2c_probe, + .remove =3D ssd13xx_i2c_remove, + .shutdown =3D ssd13xx_i2c_shutdown, }; -module_i2c_driver(ssd130x_i2c_driver); +module_i2c_driver(ssd13xx_i2c_driver); =20 MODULE_DESCRIPTION(DRIVER_DESC); MODULE_AUTHOR("Javier Martinez Canillas "); diff --git a/drivers/gpu/drm/solomon/ssd13xx-spi.c b/drivers/gpu/drm/solomo= n/ssd13xx-spi.c index 20d1e3711e2f..a5ebe5475a49 100644 --- a/drivers/gpu/drm/solomon/ssd13xx-spi.c +++ b/drivers/gpu/drm/solomon/ssd13xx-spi.c @@ -13,7 +13,7 @@ #define DRIVER_NAME "ssd13xx-spi" #define DRIVER_DESC "DRM driver for Solomon SSD13xx OLED displays (SPI)" =20 -struct ssd130x_spi_transport { +struct ssd13xx_spi_transport { struct spi_device *spi; struct gpio_desc *dc; }; @@ -28,9 +28,9 @@ struct ssd130x_spi_transport { * and can be used by the ssd13xx SPI driver to determine if the data sent * is for a command register or for the Graphic Display Data RAM (GDDRAM). */ -static int ssd130x_spi_write(void *context, const void *data, size_t count) +static int ssd13xx_spi_write(void *context, const void *data, size_t count) { - struct ssd130x_spi_transport *t =3D context; + struct ssd13xx_spi_transport *t =3D context; struct spi_device *spi =3D t->spi; const u8 *reg =3D data; =20 @@ -45,24 +45,24 @@ static int ssd130x_spi_write(void *context, const void = *data, size_t count) } =20 /* The ssd130x driver does not read registers but regmap expects a .read */ -static int ssd130x_spi_read(void *context, const void *reg, size_t reg_siz= e, +static int ssd13xx_spi_read(void *context, const void *reg, size_t reg_siz= e, void *val, size_t val_size) { return -EOPNOTSUPP; } =20 -static const struct regmap_config ssd130x_spi_regmap_config =3D { +static const struct regmap_config ssd13xx_spi_regmap_config =3D { .reg_bits =3D 8, .val_bits =3D 8, - .write =3D ssd130x_spi_write, - .read =3D ssd130x_spi_read, + .write =3D ssd13xx_spi_write, + .read =3D ssd13xx_spi_read, .can_multi_write =3D true, }; =20 -static int ssd130x_spi_probe(struct spi_device *spi) +static int ssd13xx_spi_probe(struct spi_device *spi) { - struct ssd130x_spi_transport *t; - struct ssd130x_device *ssd130x; + struct ssd13xx_spi_transport *t; + struct ssd13xx_device *ssd13xx; struct regmap *regmap; struct gpio_desc *dc; struct device *dev =3D &spi->dev; @@ -80,57 +80,58 @@ static int ssd130x_spi_probe(struct spi_device *spi) t->spi =3D spi; t->dc =3D dc; =20 - regmap =3D devm_regmap_init(dev, NULL, t, &ssd130x_spi_regmap_config); + regmap =3D devm_regmap_init(dev, NULL, t, &ssd13xx_spi_regmap_config); if (IS_ERR(regmap)) return PTR_ERR(regmap); =20 - ssd130x =3D ssd130x_probe(dev, regmap); - if (IS_ERR(ssd130x)) - return PTR_ERR(ssd130x); + ssd13xx =3D ssd13xx_probe(dev, regmap); + if (IS_ERR(ssd13xx)) + return PTR_ERR(ssd13xx); =20 - spi_set_drvdata(spi, ssd130x); + spi_set_drvdata(spi, ssd13xx); =20 return 0; } =20 -static void ssd130x_spi_remove(struct spi_device *spi) +static void ssd13xx_spi_remove(struct spi_device *spi) { - struct ssd130x_device *ssd130x =3D spi_get_drvdata(spi); + struct ssd13xx_device *ssd13xx =3D spi_get_drvdata(spi); =20 - ssd130x_remove(ssd130x); + ssd13xx_remove(ssd13xx); } =20 -static void ssd130x_spi_shutdown(struct spi_device *spi) +static void ssd13xx_spi_shutdown(struct spi_device *spi) { - struct ssd130x_device *ssd130x =3D spi_get_drvdata(spi); + struct ssd13xx_device *ssd13xx =3D spi_get_drvdata(spi); =20 - ssd130x_shutdown(ssd130x); + ssd13xx_shutdown(ssd13xx); } =20 -static const struct of_device_id ssd130x_of_match[] =3D { +static const struct of_device_id ssd13xx_of_match[] =3D { + /* ssd130x family */ { .compatible =3D "sinowealth,sh1106", - .data =3D &ssd130x_variants[SH1106_ID], + .data =3D &ssd13xx_variants[SH1106_ID], }, { .compatible =3D "solomon,ssd1305", - .data =3D &ssd130x_variants[SSD1305_ID], + .data =3D &ssd13xx_variants[SSD1305_ID], }, { .compatible =3D "solomon,ssd1306", - .data =3D &ssd130x_variants[SSD1306_ID], + .data =3D &ssd13xx_variants[SSD1306_ID], }, { .compatible =3D "solomon,ssd1307", - .data =3D &ssd130x_variants[SSD1307_ID], + .data =3D &ssd13xx_variants[SSD1307_ID], }, { .compatible =3D "solomon,ssd1309", - .data =3D &ssd130x_variants[SSD1309_ID], + .data =3D &ssd13xx_variants[SSD1309_ID], }, { /* sentinel */ } }; -MODULE_DEVICE_TABLE(of, ssd130x_of_match); +MODULE_DEVICE_TABLE(of, ssd13xx_of_match); =20 #if IS_MODULE(CONFIG_DRM_SSD13XX_SPI) /* @@ -141,7 +142,7 @@ MODULE_DEVICE_TABLE(of, ssd130x_of_match); * To workaround this issue, add a SPI device ID table. Even when this sho= uld * not be needed for this driver to match the registered SPI devices. */ -static const struct spi_device_id ssd130x_spi_table[] =3D { +static const struct spi_device_id ssd13xx_spi_table[] =3D { { "sh1106", SH1106_ID }, { "ssd1305", SSD1305_ID }, { "ssd1306", SSD1306_ID }, @@ -149,19 +150,19 @@ static const struct spi_device_id ssd130x_spi_table[]= =3D { { "ssd1309", SSD1309_ID }, { /* sentinel */ } }; -MODULE_DEVICE_TABLE(spi, ssd130x_spi_table); +MODULE_DEVICE_TABLE(spi, ssd13xx_spi_table); #endif =20 -static struct spi_driver ssd130x_spi_driver =3D { +static struct spi_driver ssd13xx_spi_driver =3D { .driver =3D { .name =3D DRIVER_NAME, - .of_match_table =3D ssd130x_of_match, + .of_match_table =3D ssd13xx_of_match, }, - .probe =3D ssd130x_spi_probe, - .remove =3D ssd130x_spi_remove, - .shutdown =3D ssd130x_spi_shutdown, + .probe =3D ssd13xx_spi_probe, + .remove =3D ssd13xx_spi_remove, + .shutdown =3D ssd13xx_spi_shutdown, }; -module_spi_driver(ssd130x_spi_driver); +module_spi_driver(ssd13xx_spi_driver); =20 MODULE_DESCRIPTION(DRIVER_DESC); MODULE_AUTHOR("Javier Martinez Canillas "); diff --git a/drivers/gpu/drm/solomon/ssd13xx.c b/drivers/gpu/drm/solomon/ss= d13xx.c index 0bf12965719a..10a767fb614c 100644 --- a/drivers/gpu/drm/solomon/ssd13xx.c +++ b/drivers/gpu/drm/solomon/ssd13xx.c @@ -94,7 +94,7 @@ =20 #define MAX_CONTRAST 255 =20 -const struct ssd130x_deviceinfo ssd130x_variants[] =3D { +const struct ssd13xx_deviceinfo ssd13xx_variants[] =3D { [SH1106_ID] =3D { .default_vcomh =3D 0x40, .default_dclk_div =3D 1, @@ -139,52 +139,52 @@ const struct ssd130x_deviceinfo ssd130x_variants[] = =3D { .page_height =3D 8, } }; -EXPORT_SYMBOL_NS_GPL(ssd130x_variants, DRM_SSD13XX); +EXPORT_SYMBOL_NS_GPL(ssd13xx_variants, DRM_SSD13XX); =20 -struct ssd130x_crtc_state { +struct ssd13xx_crtc_state { struct drm_crtc_state base; /* Buffer to store pixels in HW format and written to the panel */ u8 *data_array; }; =20 -struct ssd130x_plane_state { +struct ssd13xx_plane_state { struct drm_shadow_plane_state base; /* Intermediate buffer to convert pixels from XRGB8888 to HW format */ u8 *buffer; }; =20 -static inline struct ssd130x_crtc_state *to_ssd130x_crtc_state(struct drm_= crtc_state *state) +static inline struct ssd13xx_crtc_state *to_ssd13xx_crtc_state(struct drm_= crtc_state *state) { - return container_of(state, struct ssd130x_crtc_state, base); + return container_of(state, struct ssd13xx_crtc_state, base); } =20 -static inline struct ssd130x_plane_state *to_ssd130x_plane_state(struct dr= m_plane_state *state) +static inline struct ssd13xx_plane_state *to_ssd13xx_plane_state(struct dr= m_plane_state *state) { - return container_of(state, struct ssd130x_plane_state, base.base); + return container_of(state, struct ssd13xx_plane_state, base.base); } =20 -static inline struct ssd130x_device *drm_to_ssd130x(struct drm_device *drm) +static inline struct ssd13xx_device *drm_to_ssd13xx(struct drm_device *drm) { - return container_of(drm, struct ssd130x_device, drm); + return container_of(drm, struct ssd13xx_device, drm); } =20 /* * Helper to write data (SSD130X_DATA) to the device. */ -static int ssd130x_write_data(struct ssd130x_device *ssd130x, u8 *values, = int count) +static int ssd13xx_write_data(struct ssd13xx_device *ssd13xx, u8 *values, = int count) { - return regmap_bulk_write(ssd130x->regmap, SSD130X_DATA, values, count); + return regmap_bulk_write(ssd13xx->regmap, SSD130X_DATA, values, count); } =20 /* * Helper to write command (SSD130X_COMMAND). The fist variadic argument * is the command to write and the following are the command options. * - * Note that the ssd130x protocol requires each command and option to be + * Note that the ssd13xx protocol requires each command and option to be * written as a SSD130X_COMMAND device register value. That is why a call * to regmap_write(..., SSD130X_COMMAND, ...) is done for each argument. */ -static int ssd130x_write_cmd(struct ssd130x_device *ssd130x, int count, +static int ssd13xx_write_cmd(struct ssd13xx_device *ssd13xx, int count, /* u8 cmd, u8 option, ... */...) { va_list ap; @@ -195,7 +195,7 @@ static int ssd130x_write_cmd(struct ssd130x_device *ssd= 130x, int count, =20 do { value =3D va_arg(ap, int); - ret =3D regmap_write(ssd130x->regmap, SSD130X_COMMAND, value); + ret =3D regmap_write(ssd13xx->regmap, SSD130X_COMMAND, value); if (ret) goto out_end; } while (--count); @@ -207,44 +207,44 @@ static int ssd130x_write_cmd(struct ssd130x_device *s= sd130x, int count, } =20 /* Set address range for horizontal/vertical addressing modes */ -static int ssd130x_set_col_range(struct ssd130x_device *ssd130x, +static int ssd13xx_set_col_range(struct ssd13xx_device *ssd13xx, u8 col_start, u8 cols) { u8 col_end =3D col_start + cols - 1; int ret; =20 - if (col_start =3D=3D ssd130x->col_start && col_end =3D=3D ssd130x->col_en= d) + if (col_start =3D=3D ssd13xx->col_start && col_end =3D=3D ssd13xx->col_en= d) return 0; =20 - ret =3D ssd130x_write_cmd(ssd130x, 3, SSD130X_SET_COL_RANGE, col_start, c= ol_end); + ret =3D ssd13xx_write_cmd(ssd13xx, 3, SSD130X_SET_COL_RANGE, col_start, c= ol_end); if (ret < 0) return ret; =20 - ssd130x->col_start =3D col_start; - ssd130x->col_end =3D col_end; + ssd13xx->col_start =3D col_start; + ssd13xx->col_end =3D col_end; return 0; } =20 -static int ssd130x_set_page_range(struct ssd130x_device *ssd130x, +static int ssd13xx_set_page_range(struct ssd13xx_device *ssd13xx, u8 page_start, u8 pages) { u8 page_end =3D page_start + pages - 1; int ret; =20 - if (page_start =3D=3D ssd130x->page_start && page_end =3D=3D ssd130x->pag= e_end) + if (page_start =3D=3D ssd13xx->page_start && page_end =3D=3D ssd13xx->pag= e_end) return 0; =20 - ret =3D ssd130x_write_cmd(ssd130x, 3, SSD130X_SET_PAGE_RANGE, page_start,= page_end); + ret =3D ssd13xx_write_cmd(ssd13xx, 3, SSD130X_SET_PAGE_RANGE, page_start,= page_end); if (ret < 0) return ret; =20 - ssd130x->page_start =3D page_start; - ssd130x->page_end =3D page_end; + ssd13xx->page_start =3D page_start; + ssd13xx->page_end =3D page_end; return 0; } =20 /* Set page and column start address for page addressing mode */ -static int ssd130x_set_page_pos(struct ssd130x_device *ssd130x, +static int ssd13xx_set_page_pos(struct ssd13xx_device *ssd13xx, u8 page_start, u8 col_start) { int ret; @@ -256,67 +256,67 @@ static int ssd130x_set_page_pos(struct ssd130x_device= *ssd130x, SSD130X_PAGE_COL_START_LOW_SET(col_start); col_high =3D SSD130X_PAGE_COL_START_HIGH | SSD130X_PAGE_COL_START_HIGH_SET(col_start); - ret =3D ssd130x_write_cmd(ssd130x, 3, page, col_low, col_high); + ret =3D ssd13xx_write_cmd(ssd13xx, 3, page, col_low, col_high); if (ret < 0) return ret; =20 return 0; } =20 -static int ssd130x_pwm_enable(struct ssd130x_device *ssd130x) +static int ssd13xx_pwm_enable(struct ssd13xx_device *ssd13xx) { - struct device *dev =3D ssd130x->dev; + struct device *dev =3D ssd13xx->dev; struct pwm_state pwmstate; =20 - ssd130x->pwm =3D pwm_get(dev, NULL); - if (IS_ERR(ssd130x->pwm)) { + ssd13xx->pwm =3D pwm_get(dev, NULL); + if (IS_ERR(ssd13xx->pwm)) { dev_err(dev, "Could not get PWM from firmware description!\n"); - return PTR_ERR(ssd130x->pwm); + return PTR_ERR(ssd13xx->pwm); } =20 - pwm_init_state(ssd130x->pwm, &pwmstate); + pwm_init_state(ssd13xx->pwm, &pwmstate); pwm_set_relative_duty_cycle(&pwmstate, 50, 100); - pwm_apply_state(ssd130x->pwm, &pwmstate); + pwm_apply_state(ssd13xx->pwm, &pwmstate); =20 /* Enable the PWM */ - pwm_enable(ssd130x->pwm); + pwm_enable(ssd13xx->pwm); =20 dev_dbg(dev, "Using PWM %s with a %lluns period.\n", - ssd130x->pwm->label, pwm_get_period(ssd130x->pwm)); + ssd13xx->pwm->label, pwm_get_period(ssd13xx->pwm)); =20 return 0; } =20 -static void ssd130x_reset(struct ssd130x_device *ssd130x) +static void ssd13xx_reset(struct ssd13xx_device *ssd13xx) { - if (!ssd130x->reset) + if (!ssd13xx->reset) return; =20 /* Reset the screen */ - gpiod_set_value_cansleep(ssd130x->reset, 1); + gpiod_set_value_cansleep(ssd13xx->reset, 1); udelay(4); - gpiod_set_value_cansleep(ssd130x->reset, 0); + gpiod_set_value_cansleep(ssd13xx->reset, 0); udelay(4); } =20 -static int ssd130x_power_on(struct ssd130x_device *ssd130x) +static int ssd13xx_power_on(struct ssd13xx_device *ssd13xx) { - struct device *dev =3D ssd130x->dev; + struct device *dev =3D ssd13xx->dev; int ret; =20 - ssd130x_reset(ssd130x); + ssd13xx_reset(ssd13xx); =20 - ret =3D regulator_enable(ssd130x->vcc_reg); + ret =3D regulator_enable(ssd13xx->vcc_reg); if (ret) { dev_err(dev, "Failed to enable VCC: %d\n", ret); return ret; } =20 - if (ssd130x->device_info->need_pwm) { - ret =3D ssd130x_pwm_enable(ssd130x); + if (ssd13xx->device_info->need_pwm) { + ret =3D ssd13xx_pwm_enable(ssd13xx); if (ret) { dev_err(dev, "Failed to enable PWM: %d\n", ret); - regulator_disable(ssd130x->vcc_reg); + regulator_disable(ssd13xx->vcc_reg); return ret; } } @@ -324,75 +324,75 @@ static int ssd130x_power_on(struct ssd130x_device *ss= d130x) return 0; } =20 -static void ssd130x_power_off(struct ssd130x_device *ssd130x) +static void ssd13xx_power_off(struct ssd13xx_device *ssd13xx) { - pwm_disable(ssd130x->pwm); - pwm_put(ssd130x->pwm); + pwm_disable(ssd13xx->pwm); + pwm_put(ssd13xx->pwm); =20 - regulator_disable(ssd130x->vcc_reg); + regulator_disable(ssd13xx->vcc_reg); } =20 -static int ssd130x_init(struct ssd130x_device *ssd130x) +static int ssd13xx_init(struct ssd13xx_device *ssd13xx) { u32 precharge, dclk, com_invdir, compins, chargepump, seg_remap; bool scan_mode; int ret; =20 /* Set initial contrast */ - ret =3D ssd130x_write_cmd(ssd130x, 2, SSD130X_CONTRAST, ssd130x->contrast= ); + ret =3D ssd13xx_write_cmd(ssd13xx, 2, SSD130X_CONTRAST, ssd13xx->contrast= ); if (ret < 0) return ret; =20 /* Set segment re-map */ seg_remap =3D (SSD130X_SET_SEG_REMAP | - SSD130X_SET_SEG_REMAP_SET(ssd130x->seg_remap)); - ret =3D ssd130x_write_cmd(ssd130x, 1, seg_remap); + SSD130X_SET_SEG_REMAP_SET(ssd13xx->seg_remap)); + ret =3D ssd13xx_write_cmd(ssd13xx, 1, seg_remap); if (ret < 0) return ret; =20 /* Set COM direction */ com_invdir =3D (SSD130X_SET_COM_SCAN_DIR | - SSD130X_SET_COM_SCAN_DIR_SET(ssd130x->com_invdir)); - ret =3D ssd130x_write_cmd(ssd130x, 1, com_invdir); + SSD130X_SET_COM_SCAN_DIR_SET(ssd13xx->com_invdir)); + ret =3D ssd13xx_write_cmd(ssd13xx, 1, com_invdir); if (ret < 0) return ret; =20 /* Set multiplex ratio value */ - ret =3D ssd130x_write_cmd(ssd130x, 2, SSD130X_SET_MULTIPLEX_RATIO, ssd130= x->height - 1); + ret =3D ssd13xx_write_cmd(ssd13xx, 2, SSD130X_SET_MULTIPLEX_RATIO, ssd13x= x->height - 1); if (ret < 0) return ret; =20 /* set display offset value */ - ret =3D ssd130x_write_cmd(ssd130x, 2, SSD130X_SET_DISPLAY_OFFSET, ssd130x= ->com_offset); + ret =3D ssd13xx_write_cmd(ssd13xx, 2, SSD130X_SET_DISPLAY_OFFSET, ssd13xx= ->com_offset); if (ret < 0) return ret; =20 /* Set clock frequency */ - dclk =3D (SSD130X_SET_CLOCK_DIV_SET(ssd130x->dclk_div - 1) | - SSD130X_SET_CLOCK_FREQ_SET(ssd130x->dclk_frq)); - ret =3D ssd130x_write_cmd(ssd130x, 2, SSD130X_SET_CLOCK_FREQ, dclk); + dclk =3D (SSD130X_SET_CLOCK_DIV_SET(ssd13xx->dclk_div - 1) | + SSD130X_SET_CLOCK_FREQ_SET(ssd13xx->dclk_frq)); + ret =3D ssd13xx_write_cmd(ssd13xx, 2, SSD130X_SET_CLOCK_FREQ, dclk); if (ret < 0) return ret; =20 /* Set Area Color Mode ON/OFF & Low Power Display Mode */ - if (ssd130x->area_color_enable || ssd130x->low_power) { + if (ssd13xx->area_color_enable || ssd13xx->low_power) { u32 mode =3D 0; =20 - if (ssd130x->area_color_enable) + if (ssd13xx->area_color_enable) mode |=3D SSD130X_SET_AREA_COLOR_MODE_ENABLE; =20 - if (ssd130x->low_power) + if (ssd13xx->low_power) mode |=3D SSD130X_SET_AREA_COLOR_MODE_LOW_POWER; =20 - ret =3D ssd130x_write_cmd(ssd130x, 2, SSD130X_SET_AREA_COLOR_MODE, mode); + ret =3D ssd13xx_write_cmd(ssd13xx, 2, SSD130X_SET_AREA_COLOR_MODE, mode); if (ret < 0) return ret; } =20 /* Set precharge period in number of ticks from the internal clock */ - precharge =3D (SSD130X_SET_PRECHARGE_PERIOD1_SET(ssd130x->prechargep1) | - SSD130X_SET_PRECHARGE_PERIOD2_SET(ssd130x->prechargep2)); - ret =3D ssd130x_write_cmd(ssd130x, 2, SSD130X_SET_PRECHARGE_PERIOD, prech= arge); + precharge =3D (SSD130X_SET_PRECHARGE_PERIOD1_SET(ssd13xx->prechargep1) | + SSD130X_SET_PRECHARGE_PERIOD2_SET(ssd13xx->prechargep2)); + ret =3D ssd13xx_write_cmd(ssd13xx, 2, SSD130X_SET_PRECHARGE_PERIOD, prech= arge); if (ret < 0) return ret; =20 @@ -403,60 +403,60 @@ static int ssd130x_init(struct ssd130x_device *ssd130= x) * property "solomon,com-seq". The value 0b means scan from COM0 to * COM[N - 1] while 1b means scan from COM[N - 1] to COM0. */ - scan_mode =3D !ssd130x->com_seq; + scan_mode =3D !ssd13xx->com_seq; compins |=3D (SSD130X_SET_COM_PINS_CONFIG1_SET(scan_mode) | - SSD130X_SET_COM_PINS_CONFIG2_SET(ssd130x->com_lrremap)); - ret =3D ssd130x_write_cmd(ssd130x, 2, SSD130X_SET_COM_PINS_CONFIG, compin= s); + SSD130X_SET_COM_PINS_CONFIG2_SET(ssd13xx->com_lrremap)); + ret =3D ssd13xx_write_cmd(ssd13xx, 2, SSD130X_SET_COM_PINS_CONFIG, compin= s); if (ret < 0) return ret; =20 /* Set VCOMH */ - ret =3D ssd130x_write_cmd(ssd130x, 2, SSD130X_SET_VCOMH, ssd130x->vcomh); + ret =3D ssd13xx_write_cmd(ssd13xx, 2, SSD130X_SET_VCOMH, ssd13xx->vcomh); if (ret < 0) return ret; =20 /* Turn on the DC-DC Charge Pump */ chargepump =3D BIT(4); =20 - if (ssd130x->device_info->need_chargepump) + if (ssd13xx->device_info->need_chargepump) chargepump |=3D BIT(2); =20 - ret =3D ssd130x_write_cmd(ssd130x, 2, SSD130X_CHARGE_PUMP, chargepump); + ret =3D ssd13xx_write_cmd(ssd13xx, 2, SSD130X_CHARGE_PUMP, chargepump); if (ret < 0) return ret; =20 /* Set lookup table */ - if (ssd130x->lookup_table_set) { + if (ssd13xx->lookup_table_set) { int i; =20 - ret =3D ssd130x_write_cmd(ssd130x, 1, SSD130X_SET_LOOKUP_TABLE); + ret =3D ssd13xx_write_cmd(ssd13xx, 1, SSD130X_SET_LOOKUP_TABLE); if (ret < 0) return ret; =20 - for (i =3D 0; i < ARRAY_SIZE(ssd130x->lookup_table); i++) { - u8 val =3D ssd130x->lookup_table[i]; + for (i =3D 0; i < ARRAY_SIZE(ssd13xx->lookup_table); i++) { + u8 val =3D ssd13xx->lookup_table[i]; =20 if (val < 31 || val > 63) - dev_warn(ssd130x->dev, + dev_warn(ssd13xx->dev, "lookup table index %d value out of range 31 <=3D %d <=3D 63\n", i, val); - ret =3D ssd130x_write_cmd(ssd130x, 1, val); + ret =3D ssd13xx_write_cmd(ssd13xx, 1, val); if (ret < 0) return ret; } } =20 /* Switch to page addressing mode */ - if (ssd130x->page_address_mode) - return ssd130x_write_cmd(ssd130x, 2, SSD130X_SET_ADDRESS_MODE, + if (ssd13xx->page_address_mode) + return ssd13xx_write_cmd(ssd13xx, 2, SSD130X_SET_ADDRESS_MODE, SSD130X_SET_ADDRESS_MODE_PAGE); =20 /* Switch to horizontal addressing mode */ - return ssd130x_write_cmd(ssd130x, 2, SSD130X_SET_ADDRESS_MODE, + return ssd13xx_write_cmd(ssd13xx, 2, SSD130X_SET_ADDRESS_MODE, SSD130X_SET_ADDRESS_MODE_HORIZONTAL); } =20 -static int ssd130x_update_rect(struct ssd130x_device *ssd130x, +static int ssd13xx_update_rect(struct ssd13xx_device *ssd13xx, struct drm_rect *rect, u8 *buf, u8 *data_array) { @@ -465,9 +465,9 @@ static int ssd130x_update_rect(struct ssd130x_device *s= sd130x, unsigned int width =3D drm_rect_width(rect); unsigned int height =3D drm_rect_height(rect); unsigned int line_length =3D DIV_ROUND_UP(width, 8); - unsigned int page_height =3D ssd130x->device_info->page_height; + unsigned int page_height =3D ssd13xx->device_info->page_height; unsigned int pages =3D DIV_ROUND_UP(height, page_height); - struct drm_device *drm =3D &ssd130x->drm; + struct drm_device *drm =3D &ssd13xx->drm; u32 array_idx =3D 0; int ret, i, j, k; =20 @@ -502,13 +502,13 @@ static int ssd130x_update_rect(struct ssd130x_device = *ssd130x, * (5) A4 B4 C4 D4 E4 F4 G4 H4 */ =20 - if (!ssd130x->page_address_mode) { + if (!ssd13xx->page_address_mode) { /* Set address range for horizontal addressing mode */ - ret =3D ssd130x_set_col_range(ssd130x, ssd130x->col_offset + x, width); + ret =3D ssd13xx_set_col_range(ssd13xx, ssd13xx->col_offset + x, width); if (ret < 0) return ret; =20 - ret =3D ssd130x_set_page_range(ssd130x, ssd130x->page_offset + y / 8, pa= ges); + ret =3D ssd13xx_set_page_range(ssd13xx, ssd13xx->page_offset + y / 8, pa= ges); if (ret < 0) return ret; } @@ -517,8 +517,8 @@ static int ssd130x_update_rect(struct ssd130x_device *s= sd130x, int m =3D 8; =20 /* Last page may be partial */ - if (8 * (y / 8 + i + 1) > ssd130x->height) - m =3D ssd130x->height % 8; + if (8 * (y / 8 + i + 1) > ssd13xx->height) + m =3D ssd13xx->height % 8; for (j =3D 0; j < width; j++) { u8 data =3D 0; =20 @@ -535,14 +535,14 @@ static int ssd130x_update_rect(struct ssd130x_device = *ssd130x, * In page addressing mode, the start address needs to be reset, * and each page then needs to be written out separately. */ - if (ssd130x->page_address_mode) { - ret =3D ssd130x_set_page_pos(ssd130x, - ssd130x->page_offset + i, - ssd130x->col_offset + x); + if (ssd13xx->page_address_mode) { + ret =3D ssd13xx_set_page_pos(ssd13xx, + ssd13xx->page_offset + i, + ssd13xx->col_offset + x); if (ret < 0) return ret; =20 - ret =3D ssd130x_write_data(ssd130x, data_array, width); + ret =3D ssd13xx_write_data(ssd13xx, data_array, width); if (ret < 0) return ret; =20 @@ -551,33 +551,33 @@ static int ssd130x_update_rect(struct ssd130x_device = *ssd130x, } =20 /* Write out update in one go if we aren't using page addressing mode */ - if (!ssd130x->page_address_mode) - ret =3D ssd130x_write_data(ssd130x, data_array, width * pages); + if (!ssd13xx->page_address_mode) + ret =3D ssd13xx_write_data(ssd13xx, data_array, width * pages); =20 return ret; } =20 -static void ssd130x_clear_screen(struct ssd130x_device *ssd130x, u8 *data_= array) +static void ssd13xx_clear_screen(struct ssd13xx_device *ssd13xx, u8 *data_= array) { - unsigned int page_height =3D ssd130x->device_info->page_height; - unsigned int pages =3D DIV_ROUND_UP(ssd130x->height, page_height); - unsigned int width =3D ssd130x->width; + unsigned int page_height =3D ssd13xx->device_info->page_height; + unsigned int pages =3D DIV_ROUND_UP(ssd13xx->height, page_height); + unsigned int width =3D ssd13xx->width; int ret, i; =20 - if (!ssd130x->page_address_mode) { + if (!ssd13xx->page_address_mode) { memset(data_array, 0, width * pages); =20 /* Set address range for horizontal addressing mode */ - ret =3D ssd130x_set_col_range(ssd130x, ssd130x->col_offset, width); + ret =3D ssd13xx_set_col_range(ssd13xx, ssd13xx->col_offset, width); if (ret < 0) return; =20 - ret =3D ssd130x_set_page_range(ssd130x, ssd130x->page_offset, pages); + ret =3D ssd13xx_set_page_range(ssd13xx, ssd13xx->page_offset, pages); if (ret < 0) return; =20 /* Write out update in one go if we aren't using page addressing mode */ - ssd130x_write_data(ssd130x, data_array, width * pages); + ssd13xx_write_data(ssd13xx, data_array, width * pages); } else { /* * In page addressing mode, the start address needs to be reset, @@ -586,33 +586,33 @@ static void ssd130x_clear_screen(struct ssd130x_devic= e *ssd130x, u8 *data_array) memset(data_array, 0, width); =20 for (i =3D 0; i < pages; i++) { - ret =3D ssd130x_set_page_pos(ssd130x, - ssd130x->page_offset + i, - ssd130x->col_offset); + ret =3D ssd13xx_set_page_pos(ssd13xx, + ssd13xx->page_offset + i, + ssd13xx->col_offset); if (ret < 0) return; =20 - ret =3D ssd130x_write_data(ssd130x, data_array, width); + ret =3D ssd13xx_write_data(ssd13xx, data_array, width); if (ret < 0) return; } } } =20 -static int ssd130x_fb_blit_rect(struct drm_framebuffer *fb, +static int ssd13xx_fb_blit_rect(struct drm_framebuffer *fb, const struct iosys_map *vmap, struct drm_rect *rect, u8 *buf, u8 *data_array) { - struct ssd130x_device *ssd130x =3D drm_to_ssd130x(fb->dev); - unsigned int page_height =3D ssd130x->device_info->page_height; + struct ssd13xx_device *ssd13xx =3D drm_to_ssd13xx(fb->dev); + unsigned int page_height =3D ssd13xx->device_info->page_height; struct iosys_map dst; unsigned int dst_pitch; int ret =3D 0; =20 /* Align y to display page boundaries */ rect->y1 =3D round_down(rect->y1, page_height); - rect->y2 =3D min_t(unsigned int, round_up(rect->y2, page_height), ssd130x= ->height); + rect->y2 =3D min_t(unsigned int, round_up(rect->y2, page_height), ssd13xx= ->height); =20 dst_pitch =3D DIV_ROUND_UP(drm_rect_width(rect), 8); =20 @@ -625,18 +625,18 @@ static int ssd130x_fb_blit_rect(struct drm_framebuffe= r *fb, =20 drm_gem_fb_end_cpu_access(fb, DMA_FROM_DEVICE); =20 - ssd130x_update_rect(ssd130x, rect, buf, data_array); + ssd13xx_update_rect(ssd13xx, rect, buf, data_array); =20 return ret; } =20 -static int ssd130x_primary_plane_atomic_check(struct drm_plane *plane, +static int ssd13xx_primary_plane_atomic_check(struct drm_plane *plane, struct drm_atomic_state *state) { struct drm_device *drm =3D plane->dev; - struct ssd130x_device *ssd130x =3D drm_to_ssd130x(drm); + struct ssd13xx_device *ssd13xx =3D drm_to_ssd13xx(drm); struct drm_plane_state *plane_state =3D drm_atomic_get_new_plane_state(st= ate, plane); - struct ssd130x_plane_state *ssd130x_state =3D to_ssd130x_plane_state(plan= e_state); + struct ssd13xx_plane_state *ssd13xx_state =3D to_ssd13xx_plane_state(plan= e_state); struct drm_crtc *crtc =3D plane_state->crtc; struct drm_crtc_state *crtc_state; const struct drm_format_info *fi; @@ -658,24 +658,24 @@ static int ssd130x_primary_plane_atomic_check(struct = drm_plane *plane, if (!fi) return -EINVAL; =20 - pitch =3D drm_format_info_min_pitch(fi, 0, ssd130x->width); + pitch =3D drm_format_info_min_pitch(fi, 0, ssd13xx->width); =20 - ssd130x_state->buffer =3D kcalloc(pitch, ssd130x->height, GFP_KERNEL); - if (!ssd130x_state->buffer) + ssd13xx_state->buffer =3D kcalloc(pitch, ssd13xx->height, GFP_KERNEL); + if (!ssd13xx_state->buffer) return -ENOMEM; =20 return 0; } =20 -static void ssd130x_primary_plane_atomic_update(struct drm_plane *plane, +static void ssd13xx_primary_plane_atomic_update(struct drm_plane *plane, struct drm_atomic_state *state) { struct drm_plane_state *plane_state =3D drm_atomic_get_new_plane_state(st= ate, plane); struct drm_plane_state *old_plane_state =3D drm_atomic_get_old_plane_stat= e(state, plane); struct drm_shadow_plane_state *shadow_plane_state =3D to_drm_shadow_plane= _state(plane_state); struct drm_crtc_state *crtc_state =3D drm_atomic_get_new_crtc_state(state= , plane_state->crtc); - struct ssd130x_crtc_state *ssd130x_crtc_state =3D to_ssd130x_crtc_state(= crtc_state); - struct ssd130x_plane_state *ssd130x_plane_state =3D to_ssd130x_plane_stat= e(plane_state); + struct ssd13xx_crtc_state *ssd13xx_crtc_state =3D to_ssd13xx_crtc_state(= crtc_state); + struct ssd13xx_plane_state *ssd13xx_plane_state =3D to_ssd13xx_plane_stat= e(plane_state); struct drm_framebuffer *fb =3D plane_state->fb; struct drm_atomic_helper_damage_iter iter; struct drm_device *drm =3D plane->dev; @@ -693,187 +693,187 @@ static void ssd130x_primary_plane_atomic_update(str= uct drm_plane *plane, if (!drm_rect_intersect(&dst_clip, &damage)) continue; =20 - ssd130x_fb_blit_rect(fb, &shadow_plane_state->data[0], &dst_clip, - ssd130x_plane_state->buffer, - ssd130x_crtc_state->data_array); + ssd13xx_fb_blit_rect(fb, &shadow_plane_state->data[0], &dst_clip, + ssd13xx_plane_state->buffer, + ssd13xx_crtc_state->data_array); } =20 drm_dev_exit(idx); } =20 -static void ssd130x_primary_plane_atomic_disable(struct drm_plane *plane, +static void ssd13xx_primary_plane_atomic_disable(struct drm_plane *plane, struct drm_atomic_state *state) { struct drm_device *drm =3D plane->dev; - struct ssd130x_device *ssd130x =3D drm_to_ssd130x(drm); + struct ssd13xx_device *ssd13xx =3D drm_to_ssd13xx(drm); struct drm_plane_state *plane_state =3D drm_atomic_get_new_plane_state(st= ate, plane); struct drm_crtc_state *crtc_state; - struct ssd130x_crtc_state *ssd130x_crtc_state; + struct ssd13xx_crtc_state *ssd13xx_crtc_state; int idx; =20 if (!plane_state->crtc) return; =20 crtc_state =3D drm_atomic_get_new_crtc_state(state, plane_state->crtc); - ssd130x_crtc_state =3D to_ssd130x_crtc_state(crtc_state); + ssd13xx_crtc_state =3D to_ssd13xx_crtc_state(crtc_state); =20 if (!drm_dev_enter(drm, &idx)) return; =20 - ssd130x_clear_screen(ssd130x, ssd130x_crtc_state->data_array); + ssd13xx_clear_screen(ssd13xx, ssd13xx_crtc_state->data_array); =20 drm_dev_exit(idx); } =20 /* Called during init to allocate the plane's atomic state. */ -static void ssd130x_primary_plane_reset(struct drm_plane *plane) +static void ssd13xx_primary_plane_reset(struct drm_plane *plane) { - struct ssd130x_plane_state *ssd130x_state; + struct ssd13xx_plane_state *ssd13xx_state; =20 WARN_ON(plane->state); =20 - ssd130x_state =3D kzalloc(sizeof(*ssd130x_state), GFP_KERNEL); - if (!ssd130x_state) + ssd13xx_state =3D kzalloc(sizeof(*ssd13xx_state), GFP_KERNEL); + if (!ssd13xx_state) return; =20 - __drm_gem_reset_shadow_plane(plane, &ssd130x_state->base); + __drm_gem_reset_shadow_plane(plane, &ssd13xx_state->base); } =20 -static struct drm_plane_state *ssd130x_primary_plane_duplicate_state(struc= t drm_plane *plane) +static struct drm_plane_state *ssd13xx_primary_plane_duplicate_state(struc= t drm_plane *plane) { struct drm_shadow_plane_state *new_shadow_plane_state; - struct ssd130x_plane_state *old_ssd130x_state; - struct ssd130x_plane_state *ssd130x_state; + struct ssd13xx_plane_state *old_ssd13xx_state; + struct ssd13xx_plane_state *ssd13xx_state; =20 if (WARN_ON(!plane->state)) return NULL; =20 - old_ssd130x_state =3D to_ssd130x_plane_state(plane->state); - ssd130x_state =3D kmemdup(old_ssd130x_state, sizeof(*ssd130x_state), GFP_= KERNEL); - if (!ssd130x_state) + old_ssd13xx_state =3D to_ssd13xx_plane_state(plane->state); + ssd13xx_state =3D kmemdup(old_ssd13xx_state, sizeof(*ssd13xx_state), GFP_= KERNEL); + if (!ssd13xx_state) return NULL; =20 /* The buffer is not duplicated and is allocated in .atomic_check */ - ssd130x_state->buffer =3D NULL; + ssd13xx_state->buffer =3D NULL; =20 - new_shadow_plane_state =3D &ssd130x_state->base; + new_shadow_plane_state =3D &ssd13xx_state->base; =20 __drm_gem_duplicate_shadow_plane_state(plane, new_shadow_plane_state); =20 return &new_shadow_plane_state->base; } =20 -static void ssd130x_primary_plane_destroy_state(struct drm_plane *plane, +static void ssd13xx_primary_plane_destroy_state(struct drm_plane *plane, struct drm_plane_state *state) { - struct ssd130x_plane_state *ssd130x_state =3D to_ssd130x_plane_state(stat= e); + struct ssd13xx_plane_state *ssd13xx_state =3D to_ssd13xx_plane_state(stat= e); =20 - kfree(ssd130x_state->buffer); + kfree(ssd13xx_state->buffer); =20 - __drm_gem_destroy_shadow_plane_state(&ssd130x_state->base); + __drm_gem_destroy_shadow_plane_state(&ssd13xx_state->base); =20 - kfree(ssd130x_state); + kfree(ssd13xx_state); } =20 -static const struct drm_plane_helper_funcs ssd130x_primary_plane_helper_fu= ncs =3D { +static const struct drm_plane_helper_funcs ssd13xx_primary_plane_helper_fu= ncs =3D { DRM_GEM_SHADOW_PLANE_HELPER_FUNCS, - .atomic_check =3D ssd130x_primary_plane_atomic_check, - .atomic_update =3D ssd130x_primary_plane_atomic_update, - .atomic_disable =3D ssd130x_primary_plane_atomic_disable, + .atomic_check =3D ssd13xx_primary_plane_atomic_check, + .atomic_update =3D ssd13xx_primary_plane_atomic_update, + .atomic_disable =3D ssd13xx_primary_plane_atomic_disable, }; =20 -static const struct drm_plane_funcs ssd130x_primary_plane_funcs =3D { +static const struct drm_plane_funcs ssd13xx_primary_plane_funcs =3D { .update_plane =3D drm_atomic_helper_update_plane, .disable_plane =3D drm_atomic_helper_disable_plane, - .reset =3D ssd130x_primary_plane_reset, - .atomic_duplicate_state =3D ssd130x_primary_plane_duplicate_state, - .atomic_destroy_state =3D ssd130x_primary_plane_destroy_state, + .reset =3D ssd13xx_primary_plane_reset, + .atomic_duplicate_state =3D ssd13xx_primary_plane_duplicate_state, + .atomic_destroy_state =3D ssd13xx_primary_plane_destroy_state, .destroy =3D drm_plane_cleanup, }; =20 -static enum drm_mode_status ssd130x_crtc_mode_valid(struct drm_crtc *crtc, +static enum drm_mode_status ssd13xx_crtc_mode_valid(struct drm_crtc *crtc, const struct drm_display_mode *mode) { - struct ssd130x_device *ssd130x =3D drm_to_ssd130x(crtc->dev); + struct ssd13xx_device *ssd13xx =3D drm_to_ssd13xx(crtc->dev); =20 - if (mode->hdisplay !=3D ssd130x->mode.hdisplay && - mode->vdisplay !=3D ssd130x->mode.vdisplay) + if (mode->hdisplay !=3D ssd13xx->mode.hdisplay && + mode->vdisplay !=3D ssd13xx->mode.vdisplay) return MODE_ONE_SIZE; - else if (mode->hdisplay !=3D ssd130x->mode.hdisplay) + else if (mode->hdisplay !=3D ssd13xx->mode.hdisplay) return MODE_ONE_WIDTH; - else if (mode->vdisplay !=3D ssd130x->mode.vdisplay) + else if (mode->vdisplay !=3D ssd13xx->mode.vdisplay) return MODE_ONE_HEIGHT; =20 return MODE_OK; } =20 -static int ssd130x_crtc_atomic_check(struct drm_crtc *crtc, +static int ssd13xx_crtc_atomic_check(struct drm_crtc *crtc, struct drm_atomic_state *state) { struct drm_device *drm =3D crtc->dev; - struct ssd130x_device *ssd130x =3D drm_to_ssd130x(drm); + struct ssd13xx_device *ssd13xx =3D drm_to_ssd13xx(drm); struct drm_crtc_state *crtc_state =3D drm_atomic_get_new_crtc_state(state= , crtc); - struct ssd130x_crtc_state *ssd130x_state =3D to_ssd130x_crtc_state(crtc_s= tate); - unsigned int page_height =3D ssd130x->device_info->page_height; - unsigned int pages =3D DIV_ROUND_UP(ssd130x->height, page_height); + struct ssd13xx_crtc_state *ssd13xx_state =3D to_ssd13xx_crtc_state(crtc_s= tate); + unsigned int page_height =3D ssd13xx->device_info->page_height; + unsigned int pages =3D DIV_ROUND_UP(ssd13xx->height, page_height); int ret; =20 ret =3D drm_crtc_helper_atomic_check(crtc, state); if (ret) return ret; =20 - ssd130x_state->data_array =3D kmalloc(ssd130x->width * pages, GFP_KERNEL); - if (!ssd130x_state->data_array) + ssd13xx_state->data_array =3D kmalloc(ssd13xx->width * pages, GFP_KERNEL); + if (!ssd13xx_state->data_array) return -ENOMEM; =20 return 0; } =20 /* Called during init to allocate the CRTC's atomic state. */ -static void ssd130x_crtc_reset(struct drm_crtc *crtc) +static void ssd13xx_crtc_reset(struct drm_crtc *crtc) { - struct ssd130x_crtc_state *ssd130x_state; + struct ssd13xx_crtc_state *ssd13xx_state; =20 WARN_ON(crtc->state); =20 - ssd130x_state =3D kzalloc(sizeof(*ssd130x_state), GFP_KERNEL); - if (!ssd130x_state) + ssd13xx_state =3D kzalloc(sizeof(*ssd13xx_state), GFP_KERNEL); + if (!ssd13xx_state) return; =20 - __drm_atomic_helper_crtc_reset(crtc, &ssd130x_state->base); + __drm_atomic_helper_crtc_reset(crtc, &ssd13xx_state->base); } =20 -static struct drm_crtc_state *ssd130x_crtc_duplicate_state(struct drm_crtc= *crtc) +static struct drm_crtc_state *ssd13xx_crtc_duplicate_state(struct drm_crtc= *crtc) { - struct ssd130x_crtc_state *old_ssd130x_state; - struct ssd130x_crtc_state *ssd130x_state; + struct ssd13xx_crtc_state *old_ssd13xx_state; + struct ssd13xx_crtc_state *ssd13xx_state; =20 if (WARN_ON(!crtc->state)) return NULL; =20 - old_ssd130x_state =3D to_ssd130x_crtc_state(crtc->state); - ssd130x_state =3D kmemdup(old_ssd130x_state, sizeof(*ssd130x_state), GFP_= KERNEL); - if (!ssd130x_state) + old_ssd13xx_state =3D to_ssd13xx_crtc_state(crtc->state); + ssd13xx_state =3D kmemdup(old_ssd13xx_state, sizeof(*ssd13xx_state), GFP_= KERNEL); + if (!ssd13xx_state) return NULL; =20 /* The buffer is not duplicated and is allocated in .atomic_check */ - ssd130x_state->data_array =3D NULL; + ssd13xx_state->data_array =3D NULL; =20 - __drm_atomic_helper_crtc_duplicate_state(crtc, &ssd130x_state->base); + __drm_atomic_helper_crtc_duplicate_state(crtc, &ssd13xx_state->base); =20 - return &ssd130x_state->base; + return &ssd13xx_state->base; } =20 -static void ssd130x_crtc_destroy_state(struct drm_crtc *crtc, +static void ssd13xx_crtc_destroy_state(struct drm_crtc *crtc, struct drm_crtc_state *state) { - struct ssd130x_crtc_state *ssd130x_state =3D to_ssd130x_crtc_state(state); + struct ssd13xx_crtc_state *ssd13xx_state =3D to_ssd13xx_crtc_state(state); =20 - kfree(ssd130x_state->data_array); + kfree(ssd13xx_state->data_array); =20 __drm_atomic_helper_crtc_destroy_state(state); =20 - kfree(ssd130x_state); + kfree(ssd13xx_state); } =20 /* @@ -881,75 +881,75 @@ static void ssd130x_crtc_destroy_state(struct drm_crt= c *crtc, * the primary plane's atomic_update function. Disabling clears * the screen in the primary plane's atomic_disable function. */ -static const struct drm_crtc_helper_funcs ssd130x_crtc_helper_funcs =3D { - .mode_valid =3D ssd130x_crtc_mode_valid, - .atomic_check =3D ssd130x_crtc_atomic_check, +static const struct drm_crtc_helper_funcs ssd13xx_crtc_helper_funcs =3D { + .mode_valid =3D ssd13xx_crtc_mode_valid, + .atomic_check =3D ssd13xx_crtc_atomic_check, }; =20 -static const struct drm_crtc_funcs ssd130x_crtc_funcs =3D { - .reset =3D ssd130x_crtc_reset, +static const struct drm_crtc_funcs ssd13xx_crtc_funcs =3D { + .reset =3D ssd13xx_crtc_reset, .destroy =3D drm_crtc_cleanup, .set_config =3D drm_atomic_helper_set_config, .page_flip =3D drm_atomic_helper_page_flip, - .atomic_duplicate_state =3D ssd130x_crtc_duplicate_state, - .atomic_destroy_state =3D ssd130x_crtc_destroy_state, + .atomic_duplicate_state =3D ssd13xx_crtc_duplicate_state, + .atomic_destroy_state =3D ssd13xx_crtc_destroy_state, }; =20 -static void ssd130x_encoder_atomic_enable(struct drm_encoder *encoder, +static void ssd13xx_encoder_atomic_enable(struct drm_encoder *encoder, struct drm_atomic_state *state) { struct drm_device *drm =3D encoder->dev; - struct ssd130x_device *ssd130x =3D drm_to_ssd130x(drm); + struct ssd13xx_device *ssd13xx =3D drm_to_ssd13xx(drm); int ret; =20 - ret =3D ssd130x_power_on(ssd130x); + ret =3D ssd13xx_power_on(ssd13xx); if (ret) return; =20 - ret =3D ssd130x_init(ssd130x); + ret =3D ssd13xx_init(ssd13xx); if (ret) goto power_off; =20 - ssd130x_write_cmd(ssd130x, 1, SSD130X_DISPLAY_ON); + ssd13xx_write_cmd(ssd13xx, 1, SSD130X_DISPLAY_ON); =20 - backlight_enable(ssd130x->bl_dev); + backlight_enable(ssd13xx->bl_dev); =20 return; =20 power_off: - ssd130x_power_off(ssd130x); + ssd13xx_power_off(ssd13xx); return; } =20 -static void ssd130x_encoder_atomic_disable(struct drm_encoder *encoder, +static void ssd13xx_encoder_atomic_disable(struct drm_encoder *encoder, struct drm_atomic_state *state) { struct drm_device *drm =3D encoder->dev; - struct ssd130x_device *ssd130x =3D drm_to_ssd130x(drm); + struct ssd13xx_device *ssd13xx =3D drm_to_ssd13xx(drm); =20 - backlight_disable(ssd130x->bl_dev); + backlight_disable(ssd13xx->bl_dev); =20 - ssd130x_write_cmd(ssd130x, 1, SSD130X_DISPLAY_OFF); + ssd13xx_write_cmd(ssd13xx, 1, SSD130X_DISPLAY_OFF); =20 - ssd130x_power_off(ssd130x); + ssd13xx_power_off(ssd13xx); } =20 -static const struct drm_encoder_helper_funcs ssd130x_encoder_helper_funcs = =3D { - .atomic_enable =3D ssd130x_encoder_atomic_enable, - .atomic_disable =3D ssd130x_encoder_atomic_disable, +static const struct drm_encoder_helper_funcs ssd13xx_encoder_helper_funcs = =3D { + .atomic_enable =3D ssd13xx_encoder_atomic_enable, + .atomic_disable =3D ssd13xx_encoder_atomic_disable, }; =20 -static const struct drm_encoder_funcs ssd130x_encoder_funcs =3D { +static const struct drm_encoder_funcs ssd13xx_encoder_funcs =3D { .destroy =3D drm_encoder_cleanup, }; =20 -static int ssd130x_connector_get_modes(struct drm_connector *connector) +static int ssd13xx_connector_get_modes(struct drm_connector *connector) { - struct ssd130x_device *ssd130x =3D drm_to_ssd130x(connector->dev); + struct ssd13xx_device *ssd13xx =3D drm_to_ssd13xx(connector->dev); struct drm_display_mode *mode; - struct device *dev =3D ssd130x->dev; + struct device *dev =3D ssd13xx->dev; =20 - mode =3D drm_mode_duplicate(connector->dev, &ssd130x->mode); + mode =3D drm_mode_duplicate(connector->dev, &ssd13xx->mode); if (!mode) { dev_err(dev, "Failed to duplicated mode\n"); return 0; @@ -962,11 +962,11 @@ static int ssd130x_connector_get_modes(struct drm_con= nector *connector) return 1; } =20 -static const struct drm_connector_helper_funcs ssd130x_connector_helper_fu= ncs =3D { - .get_modes =3D ssd130x_connector_get_modes, +static const struct drm_connector_helper_funcs ssd13xx_connector_helper_fu= ncs =3D { + .get_modes =3D ssd13xx_connector_get_modes, }; =20 -static const struct drm_connector_funcs ssd130x_connector_funcs =3D { +static const struct drm_connector_funcs ssd13xx_connector_funcs =3D { .reset =3D drm_atomic_helper_connector_reset, .fill_modes =3D drm_helper_probe_single_connector_modes, .destroy =3D drm_connector_cleanup, @@ -974,19 +974,19 @@ static const struct drm_connector_funcs ssd130x_conne= ctor_funcs =3D { .atomic_destroy_state =3D drm_atomic_helper_connector_destroy_state, }; =20 -static const struct drm_mode_config_funcs ssd130x_mode_config_funcs =3D { +static const struct drm_mode_config_funcs ssd13xx_mode_config_funcs =3D { .fb_create =3D drm_gem_fb_create_with_dirty, .atomic_check =3D drm_atomic_helper_check, .atomic_commit =3D drm_atomic_helper_commit, }; =20 -static const uint32_t ssd130x_formats[] =3D { +static const uint32_t ssd13xx_formats[] =3D { DRM_FORMAT_XRGB8888, }; =20 -DEFINE_DRM_GEM_FOPS(ssd130x_fops); +DEFINE_DRM_GEM_FOPS(ssd13xx_fops); =20 -static const struct drm_driver ssd130x_drm_driver =3D { +static const struct drm_driver ssd13xx_drm_driver =3D { DRM_GEM_SHMEM_DRIVER_OPS, .name =3D DRIVER_NAME, .desc =3D DRIVER_DESC, @@ -994,85 +994,85 @@ static const struct drm_driver ssd130x_drm_driver =3D= { .major =3D DRIVER_MAJOR, .minor =3D DRIVER_MINOR, .driver_features =3D DRIVER_ATOMIC | DRIVER_GEM | DRIVER_MODESET, - .fops =3D &ssd130x_fops, + .fops =3D &ssd13xx_fops, }; =20 -static int ssd130x_update_bl(struct backlight_device *bdev) +static int ssd13xx_update_bl(struct backlight_device *bdev) { - struct ssd130x_device *ssd130x =3D bl_get_data(bdev); + struct ssd13xx_device *ssd13xx =3D bl_get_data(bdev); int brightness =3D backlight_get_brightness(bdev); int ret; =20 - ssd130x->contrast =3D brightness; + ssd13xx->contrast =3D brightness; =20 - ret =3D ssd130x_write_cmd(ssd130x, 1, SSD130X_CONTRAST); + ret =3D ssd13xx_write_cmd(ssd13xx, 1, SSD130X_CONTRAST); if (ret < 0) return ret; =20 - ret =3D ssd130x_write_cmd(ssd130x, 1, ssd130x->contrast); + ret =3D ssd13xx_write_cmd(ssd13xx, 1, ssd13xx->contrast); if (ret < 0) return ret; =20 return 0; } =20 -static const struct backlight_ops ssd130xfb_bl_ops =3D { - .update_status =3D ssd130x_update_bl, +static const struct backlight_ops ssd13xxfb_bl_ops =3D { + .update_status =3D ssd13xx_update_bl, }; =20 -static void ssd130x_parse_properties(struct ssd130x_device *ssd130x) +static void ssd13xx_parse_properties(struct ssd13xx_device *ssd13xx) { - struct device *dev =3D ssd130x->dev; + struct device *dev =3D ssd13xx->dev; =20 - if (device_property_read_u32(dev, "solomon,width", &ssd130x->width)) - ssd130x->width =3D ssd130x->device_info->default_width; + if (device_property_read_u32(dev, "solomon,width", &ssd13xx->width)) + ssd13xx->width =3D ssd13xx->device_info->default_width; =20 - if (device_property_read_u32(dev, "solomon,height", &ssd130x->height)) - ssd130x->height =3D ssd130x->device_info->default_height; + if (device_property_read_u32(dev, "solomon,height", &ssd13xx->height)) + ssd13xx->height =3D ssd13xx->device_info->default_height; =20 - if (device_property_read_u32(dev, "solomon,page-offset", &ssd130x->page_o= ffset)) - ssd130x->page_offset =3D 1; + if (device_property_read_u32(dev, "solomon,page-offset", &ssd13xx->page_o= ffset)) + ssd13xx->page_offset =3D 1; =20 - if (device_property_read_u32(dev, "solomon,col-offset", &ssd130x->col_off= set)) - ssd130x->col_offset =3D 0; + if (device_property_read_u32(dev, "solomon,col-offset", &ssd13xx->col_off= set)) + ssd13xx->col_offset =3D 0; =20 - if (device_property_read_u32(dev, "solomon,com-offset", &ssd130x->com_off= set)) - ssd130x->com_offset =3D 0; + if (device_property_read_u32(dev, "solomon,com-offset", &ssd13xx->com_off= set)) + ssd13xx->com_offset =3D 0; =20 - if (device_property_read_u32(dev, "solomon,prechargep1", &ssd130x->precha= rgep1)) - ssd130x->prechargep1 =3D 2; + if (device_property_read_u32(dev, "solomon,prechargep1", &ssd13xx->precha= rgep1)) + ssd13xx->prechargep1 =3D 2; =20 - if (device_property_read_u32(dev, "solomon,prechargep2", &ssd130x->precha= rgep2)) - ssd130x->prechargep2 =3D 2; + if (device_property_read_u32(dev, "solomon,prechargep2", &ssd13xx->precha= rgep2)) + ssd13xx->prechargep2 =3D 2; =20 if (!device_property_read_u8_array(dev, "solomon,lookup-table", - ssd130x->lookup_table, - ARRAY_SIZE(ssd130x->lookup_table))) - ssd130x->lookup_table_set =3D 1; - - ssd130x->seg_remap =3D !device_property_read_bool(dev, "solomon,segment-n= o-remap"); - ssd130x->com_seq =3D device_property_read_bool(dev, "solomon,com-seq"); - ssd130x->com_lrremap =3D device_property_read_bool(dev, "solomon,com-lrre= map"); - ssd130x->com_invdir =3D device_property_read_bool(dev, "solomon,com-invdi= r"); - ssd130x->area_color_enable =3D + ssd13xx->lookup_table, + ARRAY_SIZE(ssd13xx->lookup_table))) + ssd13xx->lookup_table_set =3D 1; + + ssd13xx->seg_remap =3D !device_property_read_bool(dev, "solomon,segment-n= o-remap"); + ssd13xx->com_seq =3D device_property_read_bool(dev, "solomon,com-seq"); + ssd13xx->com_lrremap =3D device_property_read_bool(dev, "solomon,com-lrre= map"); + ssd13xx->com_invdir =3D device_property_read_bool(dev, "solomon,com-invdi= r"); + ssd13xx->area_color_enable =3D device_property_read_bool(dev, "solomon,area-color-enable"); - ssd130x->low_power =3D device_property_read_bool(dev, "solomon,low-power"= ); + ssd13xx->low_power =3D device_property_read_bool(dev, "solomon,low-power"= ); =20 - ssd130x->contrast =3D 127; - ssd130x->vcomh =3D ssd130x->device_info->default_vcomh; + ssd13xx->contrast =3D 127; + ssd13xx->vcomh =3D ssd13xx->device_info->default_vcomh; =20 /* Setup display timing */ - if (device_property_read_u32(dev, "solomon,dclk-div", &ssd130x->dclk_div)) - ssd130x->dclk_div =3D ssd130x->device_info->default_dclk_div; - if (device_property_read_u32(dev, "solomon,dclk-frq", &ssd130x->dclk_frq)) - ssd130x->dclk_frq =3D ssd130x->device_info->default_dclk_frq; + if (device_property_read_u32(dev, "solomon,dclk-div", &ssd13xx->dclk_div)) + ssd13xx->dclk_div =3D ssd13xx->device_info->default_dclk_div; + if (device_property_read_u32(dev, "solomon,dclk-frq", &ssd13xx->dclk_frq)) + ssd13xx->dclk_frq =3D ssd13xx->device_info->default_dclk_frq; } =20 -static int ssd130x_init_modeset(struct ssd130x_device *ssd130x) +static int ssd13xx_init_modeset(struct ssd13xx_device *ssd13xx) { - struct drm_display_mode *mode =3D &ssd130x->mode; - struct device *dev =3D ssd130x->dev; - struct drm_device *drm =3D &ssd130x->drm; + struct drm_display_mode *mode =3D &ssd13xx->mode; + struct device *dev =3D ssd13xx->dev; + struct drm_device *drm =3D &ssd13xx->drm; unsigned long max_width, max_height; struct drm_plane *primary_plane; struct drm_crtc *crtc; @@ -1092,10 +1092,10 @@ static int ssd130x_init_modeset(struct ssd130x_devi= ce *ssd130x) =20 mode->type =3D DRM_MODE_TYPE_DRIVER; mode->clock =3D 1; - mode->hdisplay =3D mode->htotal =3D ssd130x->width; - mode->hsync_start =3D mode->hsync_end =3D ssd130x->width; - mode->vdisplay =3D mode->vtotal =3D ssd130x->height; - mode->vsync_start =3D mode->vsync_end =3D ssd130x->height; + mode->hdisplay =3D mode->htotal =3D ssd13xx->width; + mode->hsync_start =3D mode->hsync_end =3D ssd13xx->width; + mode->vdisplay =3D mode->vtotal =3D ssd13xx->height; + mode->vsync_start =3D mode->vsync_end =3D ssd13xx->height; mode->width_mm =3D 27; mode->height_mm =3D 27; =20 @@ -1107,60 +1107,60 @@ static int ssd130x_init_modeset(struct ssd130x_devi= ce *ssd130x) drm->mode_config.min_height =3D mode->vdisplay; drm->mode_config.max_height =3D max_height; drm->mode_config.preferred_depth =3D 24; - drm->mode_config.funcs =3D &ssd130x_mode_config_funcs; + drm->mode_config.funcs =3D &ssd13xx_mode_config_funcs; =20 /* Primary plane */ =20 - primary_plane =3D &ssd130x->primary_plane; - ret =3D drm_universal_plane_init(drm, primary_plane, 0, &ssd130x_primary_= plane_funcs, - ssd130x_formats, ARRAY_SIZE(ssd130x_formats), + primary_plane =3D &ssd13xx->primary_plane; + ret =3D drm_universal_plane_init(drm, primary_plane, 0, &ssd13xx_primary_= plane_funcs, + ssd13xx_formats, ARRAY_SIZE(ssd13xx_formats), NULL, DRM_PLANE_TYPE_PRIMARY, NULL); if (ret) { dev_err(dev, "DRM primary plane init failed: %d\n", ret); return ret; } =20 - drm_plane_helper_add(primary_plane, &ssd130x_primary_plane_helper_funcs); + drm_plane_helper_add(primary_plane, &ssd13xx_primary_plane_helper_funcs); =20 drm_plane_enable_fb_damage_clips(primary_plane); =20 /* CRTC */ =20 - crtc =3D &ssd130x->crtc; + crtc =3D &ssd13xx->crtc; ret =3D drm_crtc_init_with_planes(drm, crtc, primary_plane, NULL, - &ssd130x_crtc_funcs, NULL); + &ssd13xx_crtc_funcs, NULL); if (ret) { dev_err(dev, "DRM crtc init failed: %d\n", ret); return ret; } =20 - drm_crtc_helper_add(crtc, &ssd130x_crtc_helper_funcs); + drm_crtc_helper_add(crtc, &ssd13xx_crtc_helper_funcs); =20 /* Encoder */ =20 - encoder =3D &ssd130x->encoder; - ret =3D drm_encoder_init(drm, encoder, &ssd130x_encoder_funcs, + encoder =3D &ssd13xx->encoder; + ret =3D drm_encoder_init(drm, encoder, &ssd13xx_encoder_funcs, DRM_MODE_ENCODER_NONE, NULL); if (ret) { dev_err(dev, "DRM encoder init failed: %d\n", ret); return ret; } =20 - drm_encoder_helper_add(encoder, &ssd130x_encoder_helper_funcs); + drm_encoder_helper_add(encoder, &ssd13xx_encoder_helper_funcs); =20 encoder->possible_crtcs =3D drm_crtc_mask(crtc); =20 /* Connector */ =20 - connector =3D &ssd130x->connector; - ret =3D drm_connector_init(drm, connector, &ssd130x_connector_funcs, + connector =3D &ssd13xx->connector; + ret =3D drm_connector_init(drm, connector, &ssd13xx_connector_funcs, DRM_MODE_CONNECTOR_Unknown); if (ret) { dev_err(dev, "DRM connector init failed: %d\n", ret); return ret; } =20 - drm_connector_helper_add(connector, &ssd130x_connector_helper_funcs); + drm_connector_helper_add(connector, &ssd13xx_connector_helper_funcs); =20 ret =3D drm_connector_attach_encoder(connector, encoder); if (ret) { @@ -1173,62 +1173,62 @@ static int ssd130x_init_modeset(struct ssd130x_devi= ce *ssd130x) return 0; } =20 -static int ssd130x_get_resources(struct ssd130x_device *ssd130x) +static int ssd13xx_get_resources(struct ssd13xx_device *ssd13xx) { - struct device *dev =3D ssd130x->dev; + struct device *dev =3D ssd13xx->dev; =20 - ssd130x->reset =3D devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); - if (IS_ERR(ssd130x->reset)) - return dev_err_probe(dev, PTR_ERR(ssd130x->reset), + ssd13xx->reset =3D devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); + if (IS_ERR(ssd13xx->reset)) + return dev_err_probe(dev, PTR_ERR(ssd13xx->reset), "Failed to get reset gpio\n"); =20 - ssd130x->vcc_reg =3D devm_regulator_get(dev, "vcc"); - if (IS_ERR(ssd130x->vcc_reg)) - return dev_err_probe(dev, PTR_ERR(ssd130x->vcc_reg), + ssd13xx->vcc_reg =3D devm_regulator_get(dev, "vcc"); + if (IS_ERR(ssd13xx->vcc_reg)) + return dev_err_probe(dev, PTR_ERR(ssd13xx->vcc_reg), "Failed to get VCC regulator\n"); =20 return 0; } =20 -struct ssd130x_device *ssd130x_probe(struct device *dev, struct regmap *re= gmap) +struct ssd13xx_device *ssd13xx_probe(struct device *dev, struct regmap *re= gmap) { - struct ssd130x_device *ssd130x; + struct ssd13xx_device *ssd13xx; struct backlight_device *bl; struct drm_device *drm; int ret; =20 - ssd130x =3D devm_drm_dev_alloc(dev, &ssd130x_drm_driver, - struct ssd130x_device, drm); - if (IS_ERR(ssd130x)) - return ERR_PTR(dev_err_probe(dev, PTR_ERR(ssd130x), + ssd13xx =3D devm_drm_dev_alloc(dev, &ssd13xx_drm_driver, + struct ssd13xx_device, drm); + if (IS_ERR(ssd13xx)) + return ERR_PTR(dev_err_probe(dev, PTR_ERR(ssd13xx), "Failed to allocate DRM device\n")); =20 - drm =3D &ssd130x->drm; + drm =3D &ssd13xx->drm; =20 - ssd130x->dev =3D dev; - ssd130x->regmap =3D regmap; - ssd130x->device_info =3D device_get_match_data(dev); + ssd13xx->dev =3D dev; + ssd13xx->regmap =3D regmap; + ssd13xx->device_info =3D device_get_match_data(dev); =20 - if (ssd130x->device_info->page_mode_only) - ssd130x->page_address_mode =3D 1; + if (ssd13xx->device_info->page_mode_only) + ssd13xx->page_address_mode =3D 1; =20 - ssd130x_parse_properties(ssd130x); + ssd13xx_parse_properties(ssd13xx); =20 - ret =3D ssd130x_get_resources(ssd130x); + ret =3D ssd13xx_get_resources(ssd13xx); if (ret) return ERR_PTR(ret); =20 - bl =3D devm_backlight_device_register(dev, dev_name(dev), dev, ssd130x, - &ssd130xfb_bl_ops, NULL); + bl =3D devm_backlight_device_register(dev, dev_name(dev), dev, ssd13xx, + &ssd13xxfb_bl_ops, NULL); if (IS_ERR(bl)) return ERR_PTR(dev_err_probe(dev, PTR_ERR(bl), "Unable to register backlight device\n")); =20 - bl->props.brightness =3D ssd130x->contrast; + bl->props.brightness =3D ssd13xx->contrast; bl->props.max_brightness =3D MAX_CONTRAST; - ssd130x->bl_dev =3D bl; + ssd13xx->bl_dev =3D bl; =20 - ret =3D ssd130x_init_modeset(ssd130x); + ret =3D ssd13xx_init_modeset(ssd13xx); if (ret) return ERR_PTR(ret); =20 @@ -1238,22 +1238,22 @@ struct ssd130x_device *ssd130x_probe(struct device = *dev, struct regmap *regmap) =20 drm_fbdev_generic_setup(drm, 32); =20 - return ssd130x; + return ssd13xx; } -EXPORT_SYMBOL_GPL(ssd130x_probe); +EXPORT_SYMBOL_GPL(ssd13xx_probe); =20 -void ssd130x_remove(struct ssd130x_device *ssd130x) +void ssd13xx_remove(struct ssd13xx_device *ssd13xx) { - drm_dev_unplug(&ssd130x->drm); - drm_atomic_helper_shutdown(&ssd130x->drm); + drm_dev_unplug(&ssd13xx->drm); + drm_atomic_helper_shutdown(&ssd13xx->drm); } -EXPORT_SYMBOL_GPL(ssd130x_remove); +EXPORT_SYMBOL_GPL(ssd13xx_remove); =20 -void ssd130x_shutdown(struct ssd130x_device *ssd130x) +void ssd13xx_shutdown(struct ssd13xx_device *ssd13xx) { - drm_atomic_helper_shutdown(&ssd130x->drm); + drm_atomic_helper_shutdown(&ssd13xx->drm); } -EXPORT_SYMBOL_GPL(ssd130x_shutdown); +EXPORT_SYMBOL_GPL(ssd13xx_shutdown); =20 MODULE_DESCRIPTION(DRIVER_DESC); MODULE_AUTHOR("Javier Martinez Canillas "); diff --git a/drivers/gpu/drm/solomon/ssd13xx.h b/drivers/gpu/drm/solomon/ss= d13xx.h index f89ccd11cd29..e5abf23196b0 100644 --- a/drivers/gpu/drm/solomon/ssd13xx.h +++ b/drivers/gpu/drm/solomon/ssd13xx.h @@ -24,16 +24,16 @@ #define SSD130X_DATA 0x40 #define SSD130X_COMMAND 0x80 =20 -enum ssd130x_variants { +enum ssd13xx_variants { SH1106_ID, SSD1305_ID, SSD1306_ID, SSD1307_ID, SSD1309_ID, - NR_SSD130X_VARIANTS + NR_SSD13XX_VARIANTS }; =20 -struct ssd130x_deviceinfo { +struct ssd13xx_deviceinfo { u32 default_vcomh; u32 default_dclk_div; u32 default_dclk_frq; @@ -45,7 +45,7 @@ struct ssd130x_deviceinfo { bool page_mode_only; }; =20 -struct ssd130x_device { +struct ssd13xx_device { struct drm_device drm; struct device *dev; struct drm_display_mode mode; @@ -57,7 +57,7 @@ struct ssd130x_device { =20 struct regmap *regmap; =20 - const struct ssd130x_deviceinfo *device_info; + const struct ssd13xx_deviceinfo *device_info; =20 unsigned page_address_mode : 1; unsigned area_color_enable : 1; @@ -91,10 +91,10 @@ struct ssd130x_device { u8 page_end; }; =20 -extern const struct ssd130x_deviceinfo ssd130x_variants[]; +extern const struct ssd13xx_deviceinfo ssd13xx_variants[]; =20 -struct ssd130x_device *ssd130x_probe(struct device *dev, struct regmap *re= gmap); -void ssd130x_remove(struct ssd130x_device *ssd130x); -void ssd130x_shutdown(struct ssd130x_device *ssd130x); +struct ssd13xx_device *ssd13xx_probe(struct device *dev, struct regmap *re= gmap); +void ssd13xx_remove(struct ssd13xx_device *ssd13xx); +void ssd13xx_shutdown(struct ssd13xx_device *ssd13xx); =20 #endif /* __SSD13XX_H__ */ --=20 2.41.0 From nobody Fri Jan 2 17:25:33 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 81801CD611D for ; Mon, 9 Oct 2023 18:37:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1378160AbjJIShS (ORCPT ); Mon, 9 Oct 2023 14:37:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49662 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1378161AbjJIShG (ORCPT ); Mon, 9 Oct 2023 14:37:06 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4D2FBA3 for ; Mon, 9 Oct 2023 11:36:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1696876576; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=gALg4BuzDzCCCf3P05cRSMli/frUwAArjCkEkdq6b1A=; b=fQwC0Ds4FqNWCrHTCfYdKe2jIEgyxA/wwBviRNELkDTMuKARnb4MD2qMmp0DCeKcT5xM7p CbE4vvwymyZk8TfCyWFQqEwi0dUOAEsad8PXWKsK0iiTfGsuyKedsO19/UtRuEILnbiKJQ yA8shttz2Krw2d/MKJrU/9Ekv9AsY1k= Received: from mail-wr1-f69.google.com (mail-wr1-f69.google.com [209.85.221.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-154-yCexfcQ5MXKWHHX38_mBcw-1; Mon, 09 Oct 2023 14:36:05 -0400 X-MC-Unique: yCexfcQ5MXKWHHX38_mBcw-1 Received: by mail-wr1-f69.google.com with SMTP id ffacd0b85a97d-3296bd73d91so2050804f8f.1 for ; Mon, 09 Oct 2023 11:36:04 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1696876563; x=1697481363; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=gALg4BuzDzCCCf3P05cRSMli/frUwAArjCkEkdq6b1A=; b=UkdMku92zn4gX1ixqfFC8SAHwDnFu9kNylTeW2om2KowHRSeYFbQ8XYB/iOtCDsqbi p83CsGFhMIl7wYzzTenAlyqMomAf/p8I8QhNbMSbXE2yC8pH8cxwFMFdwOAfDMpa9o3o teLx5TgfENN7t9Ifx8MFF88wGsqoclr3zFqQfMzo8G/bu71ih4Q47KuYryt+gBwmb8/J CLINF9yCSwmVPH7hKsmeOLgPNnj63nsQ8OPRc2xTojPUcfn6UCWKKfRhi8GPcp/DrS8j Ppe4lMaL7vK2UIKbHs1t2Cu+on+Kg2TH7SqhI9DaV/ytCvURY3Xj/vA0WkxaFNlm4dv+ rywA== X-Gm-Message-State: AOJu0YxKjua68Td99MXM9bnRqASIUZ/lOq48ZQpyRUjbPfI3IKsmGBcy W70Z+tJdtadkPVkwPGzDYYZO5MZwDYVFi8HThbKn+LI5kHWT0iEKG2HHTvuYIaiT4VadM9MxuGG GBbHIB3WFIfn3/D0LQBUg8C5TqBmZM+JIuz1b2sIGZj+XST0BgO6ePzLJkh7XLz4nIzY45QDb+0 FlwGzrFd0= X-Received: by 2002:a05:6000:1e08:b0:329:6662:ac1d with SMTP id bj8-20020a0560001e0800b003296662ac1dmr11185855wrb.24.1696876563002; Mon, 09 Oct 2023 11:36:03 -0700 (PDT) X-Google-Smtp-Source: AGHT+IECJPV6fQzltcRPHfYUiuUATolHxklI0ViN4dcGzNMpNc2h6oW6hYsnrP1UmTcgV1MSDxmuGw== X-Received: by 2002:a05:6000:1e08:b0:329:6662:ac1d with SMTP id bj8-20020a0560001e0800b003296662ac1dmr11185837wrb.24.1696876562733; Mon, 09 Oct 2023 11:36:02 -0700 (PDT) Received: from localhost (205.pool92-176-231.dynamic.orange.es. [92.176.231.205]) by smtp.gmail.com with ESMTPSA id k21-20020adfb355000000b003296b913bbesm9770081wrd.12.2023.10.09.11.36.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Oct 2023 11:36:02 -0700 (PDT) From: Javier Martinez Canillas To: linux-kernel@vger.kernel.org Cc: Maxime Ripard , Thomas Zimmermann , Geert Uytterhoeven , Javier Martinez Canillas , Daniel Vetter , David Airlie , Maarten Lankhorst , dri-devel@lists.freedesktop.org Subject: [PATCH 3/8] drm/ssd13xx: Replace .page_height field in device info with a constant Date: Mon, 9 Oct 2023 20:34:17 +0200 Message-ID: <20231009183522.543918-4-javierm@redhat.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231009183522.543918-1-javierm@redhat.com> References: <20231009183522.543918-1-javierm@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" This deemed useful to avoid hardcoding a page height and allow to support other Solomon controller families, but dividing the screen in pages seems to be something that is specific to the SSD130x chip family. For example, SSD132x chip family divides the screen in segments (columns) and common outputs (rows), so the concept of screen pages does not exist for the SSD132x family. Let's drop this field from the device info struct and just use a constant SSD130X_PAGE_HEIGHT macro to define the page height. While being there, replace hardcoded 8 values in places where it is used as the page height. Signed-off-by: Javier Martinez Canillas Reviewed-by: Geert Uytterhoeven --- drivers/gpu/drm/solomon/ssd13xx.c | 37 +++++++++++++++---------------- drivers/gpu/drm/solomon/ssd13xx.h | 1 - 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/drivers/gpu/drm/solomon/ssd13xx.c b/drivers/gpu/drm/solomon/ss= d13xx.c index 10a767fb614c..d29be17665b5 100644 --- a/drivers/gpu/drm/solomon/ssd13xx.c +++ b/drivers/gpu/drm/solomon/ssd13xx.c @@ -42,6 +42,8 @@ #define DRIVER_MAJOR 1 #define DRIVER_MINOR 0 =20 +#define SSD130X_PAGE_HEIGHT 8 + #define SSD130X_PAGE_COL_START_LOW 0x00 #define SSD130X_PAGE_COL_START_HIGH 0x10 #define SSD130X_SET_ADDRESS_MODE 0x20 @@ -102,7 +104,6 @@ const struct ssd13xx_deviceinfo ssd13xx_variants[] =3D { .default_width =3D 132, .default_height =3D 64, .page_mode_only =3D 1, - .page_height =3D 8, }, [SSD1305_ID] =3D { .default_vcomh =3D 0x34, @@ -110,7 +111,6 @@ const struct ssd13xx_deviceinfo ssd13xx_variants[] =3D { .default_dclk_frq =3D 7, .default_width =3D 132, .default_height =3D 64, - .page_height =3D 8, }, [SSD1306_ID] =3D { .default_vcomh =3D 0x20, @@ -119,7 +119,6 @@ const struct ssd13xx_deviceinfo ssd13xx_variants[] =3D { .need_chargepump =3D 1, .default_width =3D 128, .default_height =3D 64, - .page_height =3D 8, }, [SSD1307_ID] =3D { .default_vcomh =3D 0x20, @@ -128,7 +127,6 @@ const struct ssd13xx_deviceinfo ssd13xx_variants[] =3D { .need_pwm =3D 1, .default_width =3D 128, .default_height =3D 39, - .page_height =3D 8, }, [SSD1309_ID] =3D { .default_vcomh =3D 0x34, @@ -136,7 +134,6 @@ const struct ssd13xx_deviceinfo ssd13xx_variants[] =3D { .default_dclk_frq =3D 10, .default_width =3D 128, .default_height =3D 64, - .page_height =3D 8, } }; EXPORT_SYMBOL_NS_GPL(ssd13xx_variants, DRM_SSD13XX); @@ -465,13 +462,13 @@ static int ssd13xx_update_rect(struct ssd13xx_device = *ssd13xx, unsigned int width =3D drm_rect_width(rect); unsigned int height =3D drm_rect_height(rect); unsigned int line_length =3D DIV_ROUND_UP(width, 8); - unsigned int page_height =3D ssd13xx->device_info->page_height; + unsigned int page_height =3D SSD130X_PAGE_HEIGHT; unsigned int pages =3D DIV_ROUND_UP(height, page_height); struct drm_device *drm =3D &ssd13xx->drm; u32 array_idx =3D 0; int ret, i, j, k; =20 - drm_WARN_ONCE(drm, y % 8 !=3D 0, "y must be aligned to screen page\n"); + drm_WARN_ONCE(drm, y % page_height !=3D 0, "y must be aligned to screen p= age\n"); =20 /* * The screen is divided in pages, each having a height of 8 @@ -503,27 +500,32 @@ static int ssd13xx_update_rect(struct ssd13xx_device = *ssd13xx, */ =20 if (!ssd13xx->page_address_mode) { + u8 page_start; + /* Set address range for horizontal addressing mode */ ret =3D ssd13xx_set_col_range(ssd13xx, ssd13xx->col_offset + x, width); if (ret < 0) return ret; =20 - ret =3D ssd13xx_set_page_range(ssd13xx, ssd13xx->page_offset + y / 8, pa= ges); + page_start =3D ssd13xx->page_offset + y / page_height; + ret =3D ssd13xx_set_page_range(ssd13xx, page_start, pages); if (ret < 0) return ret; } =20 for (i =3D 0; i < pages; i++) { - int m =3D 8; + int m =3D page_height; =20 /* Last page may be partial */ - if (8 * (y / 8 + i + 1) > ssd13xx->height) - m =3D ssd13xx->height % 8; + if (page_height * (y / page_height + i + 1) > ssd13xx->height) + m =3D ssd13xx->height % page_height; + for (j =3D 0; j < width; j++) { u8 data =3D 0; =20 for (k =3D 0; k < m; k++) { - u8 byte =3D buf[(8 * i + k) * line_length + j / 8]; + u32 idx =3D (page_height * i + k) * line_length + j / 8; + u8 byte =3D buf[idx]; u8 bit =3D (byte >> (j % 8)) & 1; =20 data |=3D bit << k; @@ -559,8 +561,7 @@ static int ssd13xx_update_rect(struct ssd13xx_device *s= sd13xx, =20 static void ssd13xx_clear_screen(struct ssd13xx_device *ssd13xx, u8 *data_= array) { - unsigned int page_height =3D ssd13xx->device_info->page_height; - unsigned int pages =3D DIV_ROUND_UP(ssd13xx->height, page_height); + unsigned int pages =3D DIV_ROUND_UP(ssd13xx->height, SSD130X_PAGE_HEIGHT); unsigned int width =3D ssd13xx->width; int ret, i; =20 @@ -605,14 +606,13 @@ static int ssd13xx_fb_blit_rect(struct drm_framebuffe= r *fb, u8 *buf, u8 *data_array) { struct ssd13xx_device *ssd13xx =3D drm_to_ssd13xx(fb->dev); - unsigned int page_height =3D ssd13xx->device_info->page_height; struct iosys_map dst; unsigned int dst_pitch; int ret =3D 0; =20 /* Align y to display page boundaries */ - rect->y1 =3D round_down(rect->y1, page_height); - rect->y2 =3D min_t(unsigned int, round_up(rect->y2, page_height), ssd13xx= ->height); + rect->y1 =3D round_down(rect->y1, SSD130X_PAGE_HEIGHT); + rect->y2 =3D min_t(unsigned int, round_up(rect->y2, SSD130X_PAGE_HEIGHT),= ssd13xx->height); =20 dst_pitch =3D DIV_ROUND_UP(drm_rect_width(rect), 8); =20 @@ -814,8 +814,7 @@ static int ssd13xx_crtc_atomic_check(struct drm_crtc *c= rtc, struct ssd13xx_device *ssd13xx =3D drm_to_ssd13xx(drm); struct drm_crtc_state *crtc_state =3D drm_atomic_get_new_crtc_state(state= , crtc); struct ssd13xx_crtc_state *ssd13xx_state =3D to_ssd13xx_crtc_state(crtc_s= tate); - unsigned int page_height =3D ssd13xx->device_info->page_height; - unsigned int pages =3D DIV_ROUND_UP(ssd13xx->height, page_height); + unsigned int pages =3D DIV_ROUND_UP(ssd13xx->height, SSD130X_PAGE_HEIGHT); int ret; =20 ret =3D drm_crtc_helper_atomic_check(crtc, state); diff --git a/drivers/gpu/drm/solomon/ssd13xx.h b/drivers/gpu/drm/solomon/ss= d13xx.h index e5abf23196b0..64283935fbc1 100644 --- a/drivers/gpu/drm/solomon/ssd13xx.h +++ b/drivers/gpu/drm/solomon/ssd13xx.h @@ -39,7 +39,6 @@ struct ssd13xx_deviceinfo { u32 default_dclk_frq; u32 default_width; u32 default_height; - u32 page_height; bool need_pwm; bool need_chargepump; bool page_mode_only; --=20 2.41.0 From nobody Fri Jan 2 17:25:33 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 91A64CD611F for ; Mon, 9 Oct 2023 18:37:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1378301AbjJISh1 (ORCPT ); Mon, 9 Oct 2023 14:37:27 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49690 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1377787AbjJIShM (ORCPT ); Mon, 9 Oct 2023 14:37:12 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AD51AA4 for ; Mon, 9 Oct 2023 11:36:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1696876581; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=j5ZrsHwzLorvUYPP8a8dcsR2FiW1aaopcCHsyKU7r9w=; b=UBzBED79ZspZUSpwFPDhuu77j5bq3SV7TBGTPYtEI/0e6++NXZWZk/I8tqXeMN2/cs81rc vLEsewLqO0fXVZSaklH/GSIGuNTUu8jEMDcYvXWv66D97yYY8uQPhxf4C/GYyv4N1msTGy Bt1tUcBrDmf7ZdQvQJfRoZPt4F7jV8A= Received: from mail-wr1-f69.google.com (mail-wr1-f69.google.com [209.85.221.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-639-5X6HZGfrPbeygmPqagbHJA-1; Mon, 09 Oct 2023 14:36:05 -0400 X-MC-Unique: 5X6HZGfrPbeygmPqagbHJA-1 Received: by mail-wr1-f69.google.com with SMTP id ffacd0b85a97d-323334992fbso3420622f8f.1 for ; Mon, 09 Oct 2023 11:36:05 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1696876564; x=1697481364; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=j5ZrsHwzLorvUYPP8a8dcsR2FiW1aaopcCHsyKU7r9w=; b=sZmxvDMGHE5pdZbgeOY6rr31VEISZAMfgjY8ApUBS6Mv59MlwnEIpaIhMgmJr3y2PP HiLl6b2WsNZhAreChxKfdKzKED0Tu/TqN40ndU7oA7j4dlinfkg49ImJbBO5m3zHWJ1y hm3hHc/YSuPQ8kMBdDU0fEgEjU4ZueBESMappCYkfKtu8nqxlBpOmzcYRhcU+gP5Y/7D Zkozs5/oDzwUwa5+0DzdxKOlu/OLaJ82jtT0yCZI4KrRnLYcL2dBdD/Iu07kakd0Slrz OY691F0b1uJ26erkmcSQxYIbHFRkN3ntnHGjkT1bWZ/5JU4wucsgKgd6/LDWvIxPmrGg hTSQ== X-Gm-Message-State: AOJu0Yz5Cip8n320gB3AEC+e0chgFNzlwQkRswXVk1ydHATATKud51Jh tQWygg2qXuoqkKf3gYcUPhLc8SyiI3HO/8W8sm+2lG0bmR/U43mpzW5EEjOZoWOdjcsZpUnIvDB eD+P/0BvV4nbCKI1XR9WGgzgsV20MGK3hdnMN1YAyaG6BZ3BOroSKyZD/wjKy0UzGXFBjxskmYv ktigy7TgQ= X-Received: by 2002:a5d:5187:0:b0:31f:ec06:20f with SMTP id k7-20020a5d5187000000b0031fec06020fmr13559055wrv.14.1696876564247; Mon, 09 Oct 2023 11:36:04 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEqZW1dmkwdaHjEnu5wPTZrKs4GUXK67CJwBipf1KKjzq7yNzfyAyt2SuzJkZ1eYkixZxo4Qg== X-Received: by 2002:a5d:5187:0:b0:31f:ec06:20f with SMTP id k7-20020a5d5187000000b0031fec06020fmr13559037wrv.14.1696876563940; Mon, 09 Oct 2023 11:36:03 -0700 (PDT) Received: from localhost (205.pool92-176-231.dynamic.orange.es. [92.176.231.205]) by smtp.gmail.com with ESMTPSA id x8-20020adfcc08000000b003296bb21c77sm9747623wrh.80.2023.10.09.11.36.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Oct 2023 11:36:03 -0700 (PDT) From: Javier Martinez Canillas To: linux-kernel@vger.kernel.org Cc: Maxime Ripard , Thomas Zimmermann , Geert Uytterhoeven , Javier Martinez Canillas , Daniel Vetter , David Airlie , Maarten Lankhorst , dri-devel@lists.freedesktop.org Subject: [PATCH 4/8] drm/ssd13xx: Use drm_format_info_min_pitch() to calculate the dest_pitch Date: Mon, 9 Oct 2023 20:34:18 +0200 Message-ID: <20231009183522.543918-5-javierm@redhat.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231009183522.543918-1-javierm@redhat.com> References: <20231009183522.543918-1-javierm@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Don't assume bpp of 1 and instead compute the destination pitch using the intermediate buffer pixel format info when doing a format conversion. Signed-off-by: Javier Martinez Canillas --- drivers/gpu/drm/solomon/ssd13xx.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/solomon/ssd13xx.c b/drivers/gpu/drm/solomon/ss= d13xx.c index d29be17665b5..9747f8656636 100644 --- a/drivers/gpu/drm/solomon/ssd13xx.c +++ b/drivers/gpu/drm/solomon/ssd13xx.c @@ -148,6 +148,8 @@ struct ssd13xx_plane_state { struct drm_shadow_plane_state base; /* Intermediate buffer to convert pixels from XRGB8888 to HW format */ u8 *buffer; + /* Pixel format info for the intermediate buffer */ + const struct drm_format_info *fi; }; =20 static inline struct ssd13xx_crtc_state *to_ssd13xx_crtc_state(struct drm_= crtc_state *state) @@ -602,8 +604,9 @@ static void ssd13xx_clear_screen(struct ssd13xx_device = *ssd13xx, u8 *data_array) =20 static int ssd13xx_fb_blit_rect(struct drm_framebuffer *fb, const struct iosys_map *vmap, - struct drm_rect *rect, - u8 *buf, u8 *data_array) + struct drm_rect *rect, u8 *buf, + const struct drm_format_info *fi, + u8 *data_array) { struct ssd13xx_device *ssd13xx =3D drm_to_ssd13xx(fb->dev); struct iosys_map dst; @@ -614,7 +617,7 @@ static int ssd13xx_fb_blit_rect(struct drm_framebuffer = *fb, rect->y1 =3D round_down(rect->y1, SSD130X_PAGE_HEIGHT); rect->y2 =3D min_t(unsigned int, round_up(rect->y2, SSD130X_PAGE_HEIGHT),= ssd13xx->height); =20 - dst_pitch =3D DIV_ROUND_UP(drm_rect_width(rect), 8); + dst_pitch =3D drm_format_info_min_pitch(fi, 0, drm_rect_width(rect)); =20 ret =3D drm_gem_fb_begin_cpu_access(fb, DMA_FROM_DEVICE); if (ret) @@ -664,6 +667,8 @@ static int ssd13xx_primary_plane_atomic_check(struct dr= m_plane *plane, if (!ssd13xx_state->buffer) return -ENOMEM; =20 + ssd13xx_state->fi =3D fi; + return 0; } =20 @@ -695,6 +700,7 @@ static void ssd13xx_primary_plane_atomic_update(struct = drm_plane *plane, =20 ssd13xx_fb_blit_rect(fb, &shadow_plane_state->data[0], &dst_clip, ssd13xx_plane_state->buffer, + ssd13xx_plane_state->fi, ssd13xx_crtc_state->data_array); } =20 --=20 2.41.0 From nobody Fri Jan 2 17:25:33 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0CD95CD611F for ; Mon, 9 Oct 2023 18:37:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1378149AbjJIShF (ORCPT ); Mon, 9 Oct 2023 14:37:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49638 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1378105AbjJISg7 (ORCPT ); Mon, 9 Oct 2023 14:36:59 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8BF0D9C for ; Mon, 9 Oct 2023 11:36:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1696876573; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=yKWds3HtLR10dcr4aoo+utAQtVVVNzCAHahFeeRCifI=; b=hZJuMJvYWhi0U1FpsYflLyF+qa2NFYozmRrYX5HvkjK/u7SrSG21vprpYTXvBEK1KV31xY KHd2chJxXoxRZ70CsGzrccBXUOYlVmRn9i7ri9GokVdtnROY2W74J014os04JvRbDi6IK4 ntNRv4MPzr/2hBEIsQ0JOJ1sF1jrGC0= Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-6-JC4QikPOMDCWCexyzZj2Lw-1; Mon, 09 Oct 2023 14:36:07 -0400 X-MC-Unique: JC4QikPOMDCWCexyzZj2Lw-1 Received: by mail-wr1-f71.google.com with SMTP id ffacd0b85a97d-3231f43fc5eso3397863f8f.2 for ; Mon, 09 Oct 2023 11:36:07 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1696876566; x=1697481366; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=yKWds3HtLR10dcr4aoo+utAQtVVVNzCAHahFeeRCifI=; b=QlkSG4mxFyqpIg/ep99ZB//XchapYTHaZxbAwFcxCkwVPhF+daNo2tx3vuZ3B3v5zy W1lSSmT5I/SDimA/pnKNr/tjN6M7tTCXg28mJmEgGjLQGfkNxmqxmeIv38bbHP9Eiybs EPe6oi199+zvYoTSZIVs8UT/Gx9q9hmuPPrRVCVxWpIREWcB4J8UmiCH7N4TZP7GFTxH cBThMaOzVaxZI85QpigMWsY7Dtz60j75zSKk3qcQvsh9u6XAEM4Cr9YEOL0qpD/Od+1d LFA72hjM+6CMFQc3NQptsumRw6CAt6Q30eUW16GZWu3ziBOz7lKxg3hNee4bZqWES+6c +YhA== X-Gm-Message-State: AOJu0Yy/9Xig9U/9Is0CI0ApjrLELSiLKVgElpCP4e3si3u/Yr40YdEb 2tDlSTM1IDkbgummnJP/lckgvL7MciE108GSDwI8IK67C9tLMQpfC24mkaocrCz9hk6W2jjaZYU fy3RqJ/q1gMcfL9tPzhYAoOaItQJOTXrSlaCq+606VkRt9wIp9ksfUazFdBVa2HcryIoJ0a6gZy 90zqAJNT4= X-Received: by 2002:adf:ea8f:0:b0:317:6175:95fd with SMTP id s15-20020adfea8f000000b00317617595fdmr14990538wrm.43.1696876565726; Mon, 09 Oct 2023 11:36:05 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHB61EIlQsYZ6j7/oURYZv5G2X0Vw8t58q6yedzHXwLbHyWJagJU9xZ1E61AxSRQC6PdxFq1w== X-Received: by 2002:adf:ea8f:0:b0:317:6175:95fd with SMTP id s15-20020adfea8f000000b00317617595fdmr14990522wrm.43.1696876565360; Mon, 09 Oct 2023 11:36:05 -0700 (PDT) Received: from localhost (205.pool92-176-231.dynamic.orange.es. [92.176.231.205]) by smtp.gmail.com with ESMTPSA id n5-20020a05600c294500b003fc02e8ea68sm14008591wmd.13.2023.10.09.11.36.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Oct 2023 11:36:05 -0700 (PDT) From: Javier Martinez Canillas To: linux-kernel@vger.kernel.org Cc: Maxime Ripard , Thomas Zimmermann , Geert Uytterhoeven , Javier Martinez Canillas , Daniel Vetter , David Airlie , Maarten Lankhorst , dri-devel@lists.freedesktop.org Subject: [PATCH 5/8] drm/ssd13xx: Add a per controller family functions table Date: Mon, 9 Oct 2023 20:34:19 +0200 Message-ID: <20231009183522.543918-6-javierm@redhat.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231009183522.543918-1-javierm@redhat.com> References: <20231009183522.543918-1-javierm@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" To allow the driver to decouple the common logic in the function callbacks from the behaviour that is specific of a given Solomon controller family. For this, include a chip family to the device info and add fields to the driver-private device struct, to store the hardware buffer maximum size, the intermediate buffer maximum size and pixel format, and a set of per chip family function handlers. Signed-off-by: Javier Martinez Canillas --- drivers/gpu/drm/solomon/ssd13xx.c | 88 ++++++++++++++++++++++--------- drivers/gpu/drm/solomon/ssd13xx.h | 27 ++++++++++ 2 files changed, 90 insertions(+), 25 deletions(-) diff --git a/drivers/gpu/drm/solomon/ssd13xx.c b/drivers/gpu/drm/solomon/ss= d13xx.c index 9747f8656636..5a426ac10c58 100644 --- a/drivers/gpu/drm/solomon/ssd13xx.c +++ b/drivers/gpu/drm/solomon/ssd13xx.c @@ -104,6 +104,7 @@ const struct ssd13xx_deviceinfo ssd13xx_variants[] =3D { .default_width =3D 132, .default_height =3D 64, .page_mode_only =3D 1, + .family_id =3D SSD130X_FAMILY, }, [SSD1305_ID] =3D { .default_vcomh =3D 0x34, @@ -111,6 +112,7 @@ const struct ssd13xx_deviceinfo ssd13xx_variants[] =3D { .default_dclk_frq =3D 7, .default_width =3D 132, .default_height =3D 64, + .family_id =3D SSD130X_FAMILY, }, [SSD1306_ID] =3D { .default_vcomh =3D 0x20, @@ -119,6 +121,7 @@ const struct ssd13xx_deviceinfo ssd13xx_variants[] =3D { .need_chargepump =3D 1, .default_width =3D 128, .default_height =3D 64, + .family_id =3D SSD130X_FAMILY, }, [SSD1307_ID] =3D { .default_vcomh =3D 0x20, @@ -127,6 +130,7 @@ const struct ssd13xx_deviceinfo ssd13xx_variants[] =3D { .need_pwm =3D 1, .default_width =3D 128, .default_height =3D 39, + .family_id =3D SSD130X_FAMILY, }, [SSD1309_ID] =3D { .default_vcomh =3D 0x34, @@ -134,6 +138,7 @@ const struct ssd13xx_deviceinfo ssd13xx_variants[] =3D { .default_dclk_frq =3D 10, .default_width =3D 128, .default_height =3D 64, + .family_id =3D SSD130X_FAMILY, } }; EXPORT_SYMBOL_NS_GPL(ssd13xx_variants, DRM_SSD13XX); @@ -148,8 +153,6 @@ struct ssd13xx_plane_state { struct drm_shadow_plane_state base; /* Intermediate buffer to convert pixels from XRGB8888 to HW format */ u8 *buffer; - /* Pixel format info for the intermediate buffer */ - const struct drm_format_info *fi; }; =20 static inline struct ssd13xx_crtc_state *to_ssd13xx_crtc_state(struct drm_= crtc_state *state) @@ -331,7 +334,7 @@ static void ssd13xx_power_off(struct ssd13xx_device *ss= d13xx) regulator_disable(ssd13xx->vcc_reg); } =20 -static int ssd13xx_init(struct ssd13xx_device *ssd13xx) +static int ssd130x_init(struct ssd13xx_device *ssd13xx) { u32 precharge, dclk, com_invdir, compins, chargepump, seg_remap; bool scan_mode; @@ -455,7 +458,7 @@ static int ssd13xx_init(struct ssd13xx_device *ssd13xx) SSD130X_SET_ADDRESS_MODE_HORIZONTAL); } =20 -static int ssd13xx_update_rect(struct ssd13xx_device *ssd13xx, +static int ssd130x_update_rect(struct ssd13xx_device *ssd13xx, struct drm_rect *rect, u8 *buf, u8 *data_array) { @@ -561,7 +564,7 @@ static int ssd13xx_update_rect(struct ssd13xx_device *s= sd13xx, return ret; } =20 -static void ssd13xx_clear_screen(struct ssd13xx_device *ssd13xx, u8 *data_= array) +static void ssd130x_clear_screen(struct ssd13xx_device *ssd13xx, u8 *data_= array) { unsigned int pages =3D DIV_ROUND_UP(ssd13xx->height, SSD130X_PAGE_HEIGHT); unsigned int width =3D ssd13xx->width; @@ -602,6 +605,15 @@ static void ssd13xx_clear_screen(struct ssd13xx_device= *ssd13xx, u8 *data_array) } } =20 +static const struct ssd13xx_funcs ssd13xx_family_funcs[] =3D { + [SSD130X_FAMILY] =3D { + .init =3D ssd130x_init, + .update_rect =3D ssd130x_update_rect, + .clear_screen =3D ssd130x_clear_screen, + .fmt_convert =3D drm_fb_xrgb8888_to_mono, + }, +}; + static int ssd13xx_fb_blit_rect(struct drm_framebuffer *fb, const struct iosys_map *vmap, struct drm_rect *rect, u8 *buf, @@ -609,6 +621,7 @@ static int ssd13xx_fb_blit_rect(struct drm_framebuffer = *fb, u8 *data_array) { struct ssd13xx_device *ssd13xx =3D drm_to_ssd13xx(fb->dev); + const struct ssd13xx_funcs *ssd13xx_funcs =3D ssd13xx->funcs; struct iosys_map dst; unsigned int dst_pitch; int ret =3D 0; @@ -624,13 +637,11 @@ static int ssd13xx_fb_blit_rect(struct drm_framebuffe= r *fb, return ret; =20 iosys_map_set_vaddr(&dst, buf); - drm_fb_xrgb8888_to_mono(&dst, &dst_pitch, vmap, fb, rect); + ssd13xx_funcs->fmt_convert(&dst, &dst_pitch, vmap, fb, rect); =20 drm_gem_fb_end_cpu_access(fb, DMA_FROM_DEVICE); =20 - ssd13xx_update_rect(ssd13xx, rect, buf, data_array); - - return ret; + return ssd13xx_funcs->update_rect(ssd13xx, rect, buf, data_array); } =20 static int ssd13xx_primary_plane_atomic_check(struct drm_plane *plane, @@ -642,8 +653,6 @@ static int ssd13xx_primary_plane_atomic_check(struct dr= m_plane *plane, struct ssd13xx_plane_state *ssd13xx_state =3D to_ssd13xx_plane_state(plan= e_state); struct drm_crtc *crtc =3D plane_state->crtc; struct drm_crtc_state *crtc_state; - const struct drm_format_info *fi; - unsigned int pitch; int ret; =20 if (!crtc) @@ -657,18 +666,10 @@ static int ssd13xx_primary_plane_atomic_check(struct = drm_plane *plane, if (ret) return ret; =20 - fi =3D drm_format_info(DRM_FORMAT_R1); - if (!fi) - return -EINVAL; - - pitch =3D drm_format_info_min_pitch(fi, 0, ssd13xx->width); - - ssd13xx_state->buffer =3D kcalloc(pitch, ssd13xx->height, GFP_KERNEL); + ssd13xx_state->buffer =3D kzalloc(ssd13xx->buffer_size, GFP_KERNEL); if (!ssd13xx_state->buffer) return -ENOMEM; =20 - ssd13xx_state->fi =3D fi; - return 0; } =20 @@ -684,6 +685,7 @@ static void ssd13xx_primary_plane_atomic_update(struct = drm_plane *plane, struct drm_framebuffer *fb =3D plane_state->fb; struct drm_atomic_helper_damage_iter iter; struct drm_device *drm =3D plane->dev; + struct ssd13xx_device *ssd13xx =3D drm_to_ssd13xx(drm); struct drm_rect dst_clip; struct drm_rect damage; int idx; @@ -700,7 +702,7 @@ static void ssd13xx_primary_plane_atomic_update(struct = drm_plane *plane, =20 ssd13xx_fb_blit_rect(fb, &shadow_plane_state->data[0], &dst_clip, ssd13xx_plane_state->buffer, - ssd13xx_plane_state->fi, + ssd13xx->buffer_fi, ssd13xx_crtc_state->data_array); } =20 @@ -712,6 +714,7 @@ static void ssd13xx_primary_plane_atomic_disable(struct= drm_plane *plane, { struct drm_device *drm =3D plane->dev; struct ssd13xx_device *ssd13xx =3D drm_to_ssd13xx(drm); + const struct ssd13xx_funcs *ssd13xx_funcs =3D ssd13xx->funcs; struct drm_plane_state *plane_state =3D drm_atomic_get_new_plane_state(st= ate, plane); struct drm_crtc_state *crtc_state; struct ssd13xx_crtc_state *ssd13xx_crtc_state; @@ -726,7 +729,7 @@ static void ssd13xx_primary_plane_atomic_disable(struct= drm_plane *plane, if (!drm_dev_enter(drm, &idx)) return; =20 - ssd13xx_clear_screen(ssd13xx, ssd13xx_crtc_state->data_array); + ssd13xx_funcs->clear_screen(ssd13xx, ssd13xx_crtc_state->data_array); =20 drm_dev_exit(idx); } @@ -820,14 +823,13 @@ static int ssd13xx_crtc_atomic_check(struct drm_crtc = *crtc, struct ssd13xx_device *ssd13xx =3D drm_to_ssd13xx(drm); struct drm_crtc_state *crtc_state =3D drm_atomic_get_new_crtc_state(state= , crtc); struct ssd13xx_crtc_state *ssd13xx_state =3D to_ssd13xx_crtc_state(crtc_s= tate); - unsigned int pages =3D DIV_ROUND_UP(ssd13xx->height, SSD130X_PAGE_HEIGHT); int ret; =20 ret =3D drm_crtc_helper_atomic_check(crtc, state); if (ret) return ret; =20 - ssd13xx_state->data_array =3D kmalloc(ssd13xx->width * pages, GFP_KERNEL); + ssd13xx_state->data_array =3D kmalloc(ssd13xx->data_array_size, GFP_KERNE= L); if (!ssd13xx_state->data_array) return -ENOMEM; =20 @@ -905,13 +907,14 @@ static void ssd13xx_encoder_atomic_enable(struct drm_= encoder *encoder, { struct drm_device *drm =3D encoder->dev; struct ssd13xx_device *ssd13xx =3D drm_to_ssd13xx(drm); + const struct ssd13xx_funcs *ssd13xx_funcs =3D ssd13xx->funcs; int ret; =20 ret =3D ssd13xx_power_on(ssd13xx); if (ret) return; =20 - ret =3D ssd13xx_init(ssd13xx); + ret =3D ssd13xx_funcs->init(ssd13xx); if (ret) goto power_off; =20 @@ -1195,11 +1198,38 @@ static int ssd13xx_get_resources(struct ssd13xx_dev= ice *ssd13xx) return 0; } =20 +static int ssd13xx_set_buffer_sizes(struct ssd13xx_device *ssd13xx, + enum ssd13xx_family_ids family_id) +{ + const struct drm_format_info *fi; + unsigned int buffer_pitch; + + switch (family_id) { + case SSD130X_FAMILY: + unsigned int pages =3D DIV_ROUND_UP(ssd13xx->height, SSD130X_PAGE_HEIGHT= ); + + ssd13xx->data_array_size =3D ssd13xx->width * pages; + + fi =3D drm_format_info(DRM_FORMAT_R1); + break; + } + + if (!fi) + return -EINVAL; + + buffer_pitch =3D drm_format_info_min_pitch(fi, 0, ssd13xx->width); + ssd13xx->buffer_size =3D buffer_pitch * ssd13xx->height; + ssd13xx->buffer_fi =3D fi; + + return 0; +} + struct ssd13xx_device *ssd13xx_probe(struct device *dev, struct regmap *re= gmap) { struct ssd13xx_device *ssd13xx; struct backlight_device *bl; struct drm_device *drm; + enum ssd13xx_family_ids family_id; int ret; =20 ssd13xx =3D devm_drm_dev_alloc(dev, &ssd13xx_drm_driver, @@ -1214,11 +1244,19 @@ struct ssd13xx_device *ssd13xx_probe(struct device = *dev, struct regmap *regmap) ssd13xx->regmap =3D regmap; ssd13xx->device_info =3D device_get_match_data(dev); =20 + family_id =3D ssd13xx->device_info->family_id; + + ssd13xx->funcs =3D &ssd13xx_family_funcs[family_id]; + if (ssd13xx->device_info->page_mode_only) ssd13xx->page_address_mode =3D 1; =20 ssd13xx_parse_properties(ssd13xx); =20 + ret =3D ssd13xx_set_buffer_sizes(ssd13xx, family_id); + if (ret) + return ERR_PTR(ret); + ret =3D ssd13xx_get_resources(ssd13xx); if (ret) return ERR_PTR(ret); diff --git a/drivers/gpu/drm/solomon/ssd13xx.h b/drivers/gpu/drm/solomon/ss= d13xx.h index 64283935fbc1..e78d5ab87474 100644 --- a/drivers/gpu/drm/solomon/ssd13xx.h +++ b/drivers/gpu/drm/solomon/ssd13xx.h @@ -20,11 +20,17 @@ #include =20 #include +#include =20 #define SSD130X_DATA 0x40 #define SSD130X_COMMAND 0x80 =20 +enum ssd13xx_family_ids { + SSD130X_FAMILY, +}; + enum ssd13xx_variants { + /* ssd130x family */ SH1106_ID, SSD1305_ID, SSD1306_ID, @@ -39,6 +45,7 @@ struct ssd13xx_deviceinfo { u32 default_dclk_frq; u32 default_width; u32 default_height; + enum ssd13xx_family_ids family_id; bool need_pwm; bool need_chargepump; bool page_mode_only; @@ -76,6 +83,12 @@ struct ssd13xx_device { u32 col_offset; u32 prechargep1; u32 prechargep2; + /* HW format buffer size */ + u32 data_array_size; + /* Intermediate buffer size */ + u32 buffer_size; + /* Pixel format info for the intermediate buffer */ + const struct drm_format_info *buffer_fi; =20 struct backlight_device *bl_dev; struct pwm_device *pwm; @@ -88,6 +101,20 @@ struct ssd13xx_device { u8 col_end; u8 page_start; u8 page_end; + + /* Chip family specific operations */ + const struct ssd13xx_funcs *funcs; +}; + +struct ssd13xx_funcs { + int (*init)(struct ssd13xx_device *ssd130x); + int (*update_rect)(struct ssd13xx_device *ssd13xx, struct drm_rect *rect, + u8 *buf, u8 *data_array); + void (*clear_screen)(struct ssd13xx_device *ssd13xx, + u8 *data_array); + void (*fmt_convert)(struct iosys_map *dst, const unsigned int *dst_pitch, + const struct iosys_map *src, const struct drm_framebuffer *fb, + const struct drm_rect *clip); }; =20 extern const struct ssd13xx_deviceinfo ssd13xx_variants[]; --=20 2.41.0 From nobody Fri Jan 2 17:25:33 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6D249CD611D for ; Mon, 9 Oct 2023 18:37:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1378186AbjJIShO (ORCPT ); Mon, 9 Oct 2023 14:37:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33396 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1378155AbjJIShF (ORCPT ); Mon, 9 Oct 2023 14:37:05 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DE089AF for ; Mon, 9 Oct 2023 11:36:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1696876572; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ZmdLaoW0F30jKaDHNrK6iK6jvqeSrkXDxHFhLB7O+XU=; b=XwSXWQ32xZHzse7TtRDwHu9iGSboEtb7EKsi52v4Lc7xRoUh5dOe88Vrh52y+HiIEGsxuC RtpRnfhqOhl/RpGTnPZShMQenJu4L7N2fR54AlsyZfHQVZFq3eZ/4ACRpcesC2RzCm20yQ 6L/bRV1CCAn9++N/9U9eUvcB/FAwoZs= Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-41-hDtuha9eOsqQYWp2JIUL_g-1; Mon, 09 Oct 2023 14:36:08 -0400 X-MC-Unique: hDtuha9eOsqQYWp2JIUL_g-1 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-4064b38dc63so26333965e9.1 for ; Mon, 09 Oct 2023 11:36:08 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1696876567; x=1697481367; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ZmdLaoW0F30jKaDHNrK6iK6jvqeSrkXDxHFhLB7O+XU=; b=BIxmsfuk3k//lP4kmFu5E4HAMFcjBFKjpkmvz13EPJF+8ZovWHO6Pj2alKraX3i0Su WN3szofgaXBtlpV1MODJLKfihUpJHcCPxvhZe7YlRKBxWE26JjkCIJ0cUT9/cQJbr3eT BeVJ9Q4cR0+k75Gr+OewfhlzV+zj+lEgGMIwYTSYU+1/lr6sJZUFqqjGnwJXdVGog5lN U1k3aIOIslw8xJ2M41S5BDJlNQa0nk+40zrHxI3VUpwliP4rEa/eSRaC605n+1/jXPcs rJn5AB+k0z8HhnFTSaXnfaajlDr8/8CwDzUE3EznwNS0OWAZ2FejftQc9FoNSpbfKjp6 5HEA== X-Gm-Message-State: AOJu0Yw04XUEGysXR6Aq29Rcib+Fc2PbPXiRl8j1+q0/Kbp6oArpthwi VluVao6PwbjZlpIAkKtVmWuELecN4CjebLQRQ8K/BdayzmD5YiXzwdFHbch40+/mh2I0gOpFAPa J5umDM5Lm4gBP+e3tA2iX9xHbEKHXtV3Ul+hZ5s/J0MfdV88K4agYHdOYyj7WqggbrizGOMic+F qfofNhDrM= X-Received: by 2002:a05:600c:4f51:b0:403:aced:f7f4 with SMTP id m17-20020a05600c4f5100b00403acedf7f4mr11347606wmq.12.1696876567046; Mon, 09 Oct 2023 11:36:07 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHPiQQ2IHRmlkRAdSD3xtyc6wwq0bdpnugNy/1WSPvCyhAo3jLFf0Py7gaFUOe0tOZxAO9qMw== X-Received: by 2002:a05:600c:4f51:b0:403:aced:f7f4 with SMTP id m17-20020a05600c4f5100b00403acedf7f4mr11347585wmq.12.1696876566650; Mon, 09 Oct 2023 11:36:06 -0700 (PDT) Received: from localhost (205.pool92-176-231.dynamic.orange.es. [92.176.231.205]) by smtp.gmail.com with ESMTPSA id 1-20020a05600c230100b0040644e699a0sm14171296wmo.45.2023.10.09.11.36.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Oct 2023 11:36:06 -0700 (PDT) From: Javier Martinez Canillas To: linux-kernel@vger.kernel.org Cc: Maxime Ripard , Thomas Zimmermann , Geert Uytterhoeven , Javier Martinez Canillas , Daniel Vetter , David Airlie , Maarten Lankhorst , dri-devel@lists.freedesktop.org Subject: [PATCH 6/8] drm/ssd13xx: Rename commands that are shared across chip families Date: Mon, 9 Oct 2023 20:34:20 +0200 Message-ID: <20231009183522.543918-7-javierm@redhat.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231009183522.543918-1-javierm@redhat.com> References: <20231009183522.543918-1-javierm@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" There are some commands that are shared between the SSD130x and SSD132x controller families, define these as a common SSD13XX set of commands. Signed-off-by: Javier Martinez Canillas --- drivers/gpu/drm/solomon/ssd13xx-spi.c | 4 +-- drivers/gpu/drm/solomon/ssd13xx.c | 45 +++++++++++++++------------ drivers/gpu/drm/solomon/ssd13xx.h | 4 +-- 3 files changed, 29 insertions(+), 24 deletions(-) diff --git a/drivers/gpu/drm/solomon/ssd13xx-spi.c b/drivers/gpu/drm/solomo= n/ssd13xx-spi.c index a5ebe5475a49..2416756686cc 100644 --- a/drivers/gpu/drm/solomon/ssd13xx-spi.c +++ b/drivers/gpu/drm/solomon/ssd13xx-spi.c @@ -34,10 +34,10 @@ static int ssd13xx_spi_write(void *context, const void = *data, size_t count) struct spi_device *spi =3D t->spi; const u8 *reg =3D data; =20 - if (*reg =3D=3D SSD130X_COMMAND) + if (*reg =3D=3D SSD13XX_COMMAND) gpiod_set_value_cansleep(t->dc, 0); =20 - if (*reg =3D=3D SSD130X_DATA) + if (*reg =3D=3D SSD13XX_DATA) gpiod_set_value_cansleep(t->dc, 1); =20 /* Remove control byte since is not used in a 4-wire SPI interface */ diff --git a/drivers/gpu/drm/solomon/ssd13xx.c b/drivers/gpu/drm/solomon/ss= d13xx.c index 5a426ac10c58..b30224856518 100644 --- a/drivers/gpu/drm/solomon/ssd13xx.c +++ b/drivers/gpu/drm/solomon/ssd13xx.c @@ -44,18 +44,24 @@ =20 #define SSD130X_PAGE_HEIGHT 8 =20 +/* ssd13xx commands */ +#define SSD13XX_CONTRAST 0x81 +#define SSD13XX_SET_SEG_REMAP 0xa0 +#define SSD13XX_SET_MULTIPLEX_RATIO 0xa8 +#define SSD13XX_DISPLAY_OFF 0xae +#define SSD13XX_DISPLAY_ON 0xaf + +#define SSD13XX_SET_SEG_REMAP_MASK GENMASK(0, 0) +#define SSD13XX_SET_SEG_REMAP_SET(val) FIELD_PREP(SSD13XX_SET_SEG_REMAP_M= ASK, (val)) + +/* ssd130x commands */ #define SSD130X_PAGE_COL_START_LOW 0x00 #define SSD130X_PAGE_COL_START_HIGH 0x10 #define SSD130X_SET_ADDRESS_MODE 0x20 #define SSD130X_SET_COL_RANGE 0x21 #define SSD130X_SET_PAGE_RANGE 0x22 -#define SSD130X_CONTRAST 0x81 #define SSD130X_SET_LOOKUP_TABLE 0x91 #define SSD130X_CHARGE_PUMP 0x8d -#define SSD130X_SET_SEG_REMAP 0xa0 -#define SSD130X_DISPLAY_OFF 0xae -#define SSD130X_SET_MULTIPLEX_RATIO 0xa8 -#define SSD130X_DISPLAY_ON 0xaf #define SSD130X_START_PAGE_ADDRESS 0xb0 #define SSD130X_SET_COM_SCAN_DIR 0xc0 #define SSD130X_SET_DISPLAY_OFFSET 0xd3 @@ -65,13 +71,12 @@ #define SSD130X_SET_COM_PINS_CONFIG 0xda #define SSD130X_SET_VCOMH 0xdb =20 +/* ssd130x commands accessors */ #define SSD130X_PAGE_COL_START_MASK GENMASK(3, 0) #define SSD130X_PAGE_COL_START_HIGH_SET(val) FIELD_PREP(SSD130X_PAGE_COL_S= TART_MASK, (val) >> 4) #define SSD130X_PAGE_COL_START_LOW_SET(val) FIELD_PREP(SSD130X_PAGE_COL_ST= ART_MASK, (val)) #define SSD130X_START_PAGE_ADDRESS_MASK GENMASK(2, 0) #define SSD130X_START_PAGE_ADDRESS_SET(val) FIELD_PREP(SSD130X_START_PAGE_= ADDRESS_MASK, (val)) -#define SSD130X_SET_SEG_REMAP_MASK GENMASK(0, 0) -#define SSD130X_SET_SEG_REMAP_SET(val) FIELD_PREP(SSD130X_SET_SEG_REMAP_M= ASK, (val)) #define SSD130X_SET_COM_SCAN_DIR_MASK GENMASK(3, 3) #define SSD130X_SET_COM_SCAN_DIR_SET(val) FIELD_PREP(SSD130X_SET_COM_SCAN_= DIR_MASK, (val)) #define SSD130X_SET_CLOCK_DIV_MASK GENMASK(3, 0) @@ -171,20 +176,20 @@ static inline struct ssd13xx_device *drm_to_ssd13xx(s= truct drm_device *drm) } =20 /* - * Helper to write data (SSD130X_DATA) to the device. + * Helper to write data (SSD13XX_DATA) to the device. */ static int ssd13xx_write_data(struct ssd13xx_device *ssd13xx, u8 *values, = int count) { - return regmap_bulk_write(ssd13xx->regmap, SSD130X_DATA, values, count); + return regmap_bulk_write(ssd13xx->regmap, SSD13XX_DATA, values, count); } =20 /* - * Helper to write command (SSD130X_COMMAND). The fist variadic argument + * Helper to write command (SSD13XX_COMMAND). The fist variadic argument * is the command to write and the following are the command options. * * Note that the ssd13xx protocol requires each command and option to be - * written as a SSD130X_COMMAND device register value. That is why a call - * to regmap_write(..., SSD130X_COMMAND, ...) is done for each argument. + * written as a SSD13XX_COMMAND device register value. That is why a call + * to regmap_write(..., SSD13XX_COMMAND, ...) is done for each argument. */ static int ssd13xx_write_cmd(struct ssd13xx_device *ssd13xx, int count, /* u8 cmd, u8 option, ... */...) @@ -197,7 +202,7 @@ static int ssd13xx_write_cmd(struct ssd13xx_device *ssd= 13xx, int count, =20 do { value =3D va_arg(ap, int); - ret =3D regmap_write(ssd13xx->regmap, SSD130X_COMMAND, value); + ret =3D regmap_write(ssd13xx->regmap, SSD13XX_COMMAND, value); if (ret) goto out_end; } while (--count); @@ -341,13 +346,13 @@ static int ssd130x_init(struct ssd13xx_device *ssd13x= x) int ret; =20 /* Set initial contrast */ - ret =3D ssd13xx_write_cmd(ssd13xx, 2, SSD130X_CONTRAST, ssd13xx->contrast= ); + ret =3D ssd13xx_write_cmd(ssd13xx, 2, SSD13XX_CONTRAST, ssd13xx->contrast= ); if (ret < 0) return ret; =20 /* Set segment re-map */ - seg_remap =3D (SSD130X_SET_SEG_REMAP | - SSD130X_SET_SEG_REMAP_SET(ssd13xx->seg_remap)); + seg_remap =3D (SSD13XX_SET_SEG_REMAP | + SSD13XX_SET_SEG_REMAP_SET(ssd13xx->seg_remap)); ret =3D ssd13xx_write_cmd(ssd13xx, 1, seg_remap); if (ret < 0) return ret; @@ -360,7 +365,7 @@ static int ssd130x_init(struct ssd13xx_device *ssd13xx) return ret; =20 /* Set multiplex ratio value */ - ret =3D ssd13xx_write_cmd(ssd13xx, 2, SSD130X_SET_MULTIPLEX_RATIO, ssd13x= x->height - 1); + ret =3D ssd13xx_write_cmd(ssd13xx, 2, SSD13XX_SET_MULTIPLEX_RATIO, ssd13x= x->height - 1); if (ret < 0) return ret; =20 @@ -918,7 +923,7 @@ static void ssd13xx_encoder_atomic_enable(struct drm_en= coder *encoder, if (ret) goto power_off; =20 - ssd13xx_write_cmd(ssd13xx, 1, SSD130X_DISPLAY_ON); + ssd13xx_write_cmd(ssd13xx, 1, SSD13XX_DISPLAY_ON); =20 backlight_enable(ssd13xx->bl_dev); =20 @@ -937,7 +942,7 @@ static void ssd13xx_encoder_atomic_disable(struct drm_e= ncoder *encoder, =20 backlight_disable(ssd13xx->bl_dev); =20 - ssd13xx_write_cmd(ssd13xx, 1, SSD130X_DISPLAY_OFF); + ssd13xx_write_cmd(ssd13xx, 1, SSD13XX_DISPLAY_OFF); =20 ssd13xx_power_off(ssd13xx); } @@ -1013,7 +1018,7 @@ static int ssd13xx_update_bl(struct backlight_device = *bdev) =20 ssd13xx->contrast =3D brightness; =20 - ret =3D ssd13xx_write_cmd(ssd13xx, 1, SSD130X_CONTRAST); + ret =3D ssd13xx_write_cmd(ssd13xx, 1, SSD13XX_CONTRAST); if (ret < 0) return ret; =20 diff --git a/drivers/gpu/drm/solomon/ssd13xx.h b/drivers/gpu/drm/solomon/ss= d13xx.h index e78d5ab87474..399b0c8b5680 100644 --- a/drivers/gpu/drm/solomon/ssd13xx.h +++ b/drivers/gpu/drm/solomon/ssd13xx.h @@ -22,8 +22,8 @@ #include #include =20 -#define SSD130X_DATA 0x40 -#define SSD130X_COMMAND 0x80 +#define SSD13XX_DATA 0x40 +#define SSD13XX_COMMAND 0x80 =20 enum ssd13xx_family_ids { SSD130X_FAMILY, --=20 2.41.0 From nobody Fri Jan 2 17:25:33 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C2E33CD611D for ; Mon, 9 Oct 2023 18:37:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1378208AbjJIShL (ORCPT ); Mon, 9 Oct 2023 14:37:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33386 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1378138AbjJIShE (ORCPT ); Mon, 9 Oct 2023 14:37:04 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E45A9A6 for ; Mon, 9 Oct 2023 11:36:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1696876571; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=cAaThqSJ1bntsN2jg+kycHzuBu+ozB5ircxnmQS3wP4=; b=ZNfKXxFUPGR6mtpdXS5VslKDX6FDUrmLvETE2qy67vtPoS0tveg1PJlsw/X8jp3v5BlYyp tTJZ+681zPtnZppnslJqFGmi4PmoYGBFggMhoW9Uc9QdtYI+eBXAKYDz2VvgvmyIcBeXuE 0fh/sYmw9KvhBrIlCnMkkyoEOur++QI= Received: from mail-wr1-f70.google.com (mail-wr1-f70.google.com [209.85.221.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-581-vlD2x_M0NbiM2ZueCIMuQg-1; Mon, 09 Oct 2023 14:36:09 -0400 X-MC-Unique: vlD2x_M0NbiM2ZueCIMuQg-1 Received: by mail-wr1-f70.google.com with SMTP id ffacd0b85a97d-3231f43fc5eso3397881f8f.2 for ; Mon, 09 Oct 2023 11:36:09 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1696876568; x=1697481368; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=cAaThqSJ1bntsN2jg+kycHzuBu+ozB5ircxnmQS3wP4=; b=TtdqZpXTeifxZ+V41VreH3xED8fdUM2oiwDgw3K5Ns1CXBllrytD33O7fk9zOX4GP/ 2Oriq+gWm2hxdrV5XpkPRArBJNLigonf2va5FYcXyTUV9fZPPVZVAuj2Q794dMEXNl8E dTY2CWB/2YnShdZBjcuFM6L3ztqvN4YPBeSlewnEBmjKsQ7uFluPFylZblY5EyQ8Q/Eu Pyv8Xk/ArrnXaQ2DnfjiKT0o8Zq0BmGacZB3va4KRiHpYXz5PJFCjFQOMyusxQJtyNW6 vG94x3mgXTtKz7OWQAAO9TMtxpXTDyw/0Gmr0/ly89tL5r+gFVkZSHdmkib5sRrFzhVU C81w== X-Gm-Message-State: AOJu0YxRydIqEODJvbZFIEuMe9mjsEcPYg5/4q9nv8wFe9sQSeteDyMV qogc4Izhr1PogcaI1v632pR4Y1MUsWHzHfC6Q8AvWNSNSAaLl3jD1M8tKtpMcLgqOqO8g2GORoz sMKaBJkBvUrY4GqAxZvvSFVqEdBP+tQf2mwaZMcMhXUlNcu99c6bq6Z8VjFIEsJHeqdxQtbCVar zY91mRjog= X-Received: by 2002:a5d:4650:0:b0:319:7c14:b06b with SMTP id j16-20020a5d4650000000b003197c14b06bmr14360247wrs.47.1696876568456; Mon, 09 Oct 2023 11:36:08 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFmiIGqQ4xbXICwKFnBJtMR2yQZr9iiHnXKi+pbx5GVR/MJi6cvkyOFjq45ubbCtuMrA4YqbA== X-Received: by 2002:a5d:4650:0:b0:319:7c14:b06b with SMTP id j16-20020a5d4650000000b003197c14b06bmr14360222wrs.47.1696876568045; Mon, 09 Oct 2023 11:36:08 -0700 (PDT) Received: from localhost (205.pool92-176-231.dynamic.orange.es. [92.176.231.205]) by smtp.gmail.com with ESMTPSA id l2-20020a5d4802000000b0031fe0576460sm10335828wrq.11.2023.10.09.11.36.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Oct 2023 11:36:07 -0700 (PDT) From: Javier Martinez Canillas To: linux-kernel@vger.kernel.org Cc: Maxime Ripard , Thomas Zimmermann , Geert Uytterhoeven , Javier Martinez Canillas , Daniel Vetter , David Airlie , Maarten Lankhorst , dri-devel@lists.freedesktop.org Subject: [PATCH 7/8] drm/ssd13xx: Add support for the SSD132x OLED controller family Date: Mon, 9 Oct 2023 20:34:21 +0200 Message-ID: <20231009183522.543918-8-javierm@redhat.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231009183522.543918-1-javierm@redhat.com> References: <20231009183522.543918-1-javierm@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The Solomon SSD132x controllers (such as the SSD1322, SSD1325 and SSD1327) are used by 16 grayscale dot matrix OLED panels, extend the driver to also support this chip family. Signed-off-by: Javier Martinez Canillas --- drivers/gpu/drm/solomon/ssd13xx-i2c.c | 13 ++ drivers/gpu/drm/solomon/ssd13xx-spi.c | 13 ++ drivers/gpu/drm/solomon/ssd13xx.c | 206 +++++++++++++++++++++++++- drivers/gpu/drm/solomon/ssd13xx.h | 5 + 4 files changed, 234 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/solomon/ssd13xx-i2c.c b/drivers/gpu/drm/solomo= n/ssd13xx-i2c.c index d9cece374331..9cf78d206c6e 100644 --- a/drivers/gpu/drm/solomon/ssd13xx-i2c.c +++ b/drivers/gpu/drm/solomon/ssd13xx-i2c.c @@ -92,6 +92,19 @@ static const struct of_device_id ssd13xx_of_match[] =3D { .compatible =3D "solomon,ssd1309fb-i2c", .data =3D &ssd13xx_variants[SSD1309_ID], }, + /* ssd1302x family */ + { + .compatible =3D "solomon,ssd1322", + .data =3D &ssd13xx_variants[SSD1322_ID], + }, + { + .compatible =3D "solomon,ssd1325", + .data =3D &ssd13xx_variants[SSD1325_ID], + }, + { + .compatible =3D "solomon,ssd1327", + .data =3D &ssd13xx_variants[SSD1327_ID], + }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, ssd13xx_of_match); diff --git a/drivers/gpu/drm/solomon/ssd13xx-spi.c b/drivers/gpu/drm/solomo= n/ssd13xx-spi.c index 2416756686cc..55162e49f037 100644 --- a/drivers/gpu/drm/solomon/ssd13xx-spi.c +++ b/drivers/gpu/drm/solomon/ssd13xx-spi.c @@ -129,6 +129,19 @@ static const struct of_device_id ssd13xx_of_match[] = =3D { .compatible =3D "solomon,ssd1309", .data =3D &ssd13xx_variants[SSD1309_ID], }, + /* ssd1302x family */ + { + .compatible =3D "solomon,ssd1322", + .data =3D &ssd13xx_variants[SSD1322_ID], + }, + { + .compatible =3D "solomon,ssd1325", + .data =3D &ssd13xx_variants[SSD1325_ID], + }, + { + .compatible =3D "solomon,ssd1327", + .data =3D &ssd13xx_variants[SSD1327_ID], + }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, ssd13xx_of_match); diff --git a/drivers/gpu/drm/solomon/ssd13xx.c b/drivers/gpu/drm/solomon/ss= d13xx.c index b30224856518..bc53e7c80ffe 100644 --- a/drivers/gpu/drm/solomon/ssd13xx.c +++ b/drivers/gpu/drm/solomon/ssd13xx.c @@ -99,6 +99,24 @@ #define SSD130X_SET_AREA_COLOR_MODE_ENABLE 0x1e #define SSD130X_SET_AREA_COLOR_MODE_LOW_POWER 0x05 =20 +/* ssd132x commands */ +#define SSD132X_SET_COL_RANGE 0x15 +#define SSD132X_SET_DEACTIVATE_SCROLL 0x2e +#define SSD132X_SET_ROW_RANGE 0x75 +#define SSD132X_SET_DISPLAY_START 0xa1 +#define SSD132X_SET_DISPLAY_OFFSET 0xa2 +#define SSD132X_SET_DISPLAY_NORMAL 0xa4 +#define SSD132X_SET_FUNCTION_SELECT_A 0xab +#define SSD132X_SET_PHASE_LENGTH 0xb1 +#define SSD132X_SET_CLOCK_FREQ 0xb3 +#define SSD132X_SET_GPIO 0xb5 +#define SSD132X_SET_PRECHARGE_PERIOD 0xb6 +#define SSD132X_SET_GRAY_SCALE_TABLE 0xb8 +#define SSD132X_SELECT_DEFAULT_TABLE 0xb9 +#define SSD132X_SET_PRECHARGE_VOLTAGE 0xbc +#define SSD130X_SET_VCOMH_VOLTAGE 0xbe +#define SSD132X_SET_FUNCTION_SELECT_B 0xd5 + #define MAX_CONTRAST 255 =20 const struct ssd13xx_deviceinfo ssd13xx_variants[] =3D { @@ -144,6 +162,22 @@ const struct ssd13xx_deviceinfo ssd13xx_variants[] =3D= { .default_width =3D 128, .default_height =3D 64, .family_id =3D SSD130X_FAMILY, + }, + /* ssd132x family */ + [SSD1322_ID] =3D { + .default_width =3D 480, + .default_height =3D 128, + .family_id =3D SSD132X_FAMILY, + }, + [SSD1325_ID] =3D { + .default_width =3D 128, + .default_height =3D 80, + .family_id =3D SSD132X_FAMILY, + }, + [SSD1327_ID] =3D { + .default_width =3D 128, + .default_height =3D 128, + .family_id =3D SSD132X_FAMILY, } }; EXPORT_SYMBOL_NS_GPL(ssd13xx_variants, DRM_SSD13XX); @@ -610,6 +644,156 @@ static void ssd130x_clear_screen(struct ssd13xx_devic= e *ssd13xx, u8 *data_array) } } =20 +static int ssd132x_init(struct ssd13xx_device *ssd13xx) +{ + int ret; + + /* Set initial contrast */ + ret =3D ssd13xx_write_cmd(ssd13xx, 2, SSD13XX_CONTRAST, 0x80); + if (ret < 0) + return ret; + + /* Set column start and end */ + ret =3D ssd13xx_write_cmd(ssd13xx, 3, SSD132X_SET_COL_RANGE, 0x00, ssd13x= x->width / 2 - 1); + if (ret < 0) + return ret; + + /* Set row start and end */ + ret =3D ssd13xx_write_cmd(ssd13xx, 3, SSD132X_SET_ROW_RANGE, 0x00, ssd13x= x->height - 1); + if (ret < 0) + return ret; + /* + * Horizontal Address Increment + * Re-map for Column Address, Nibble and COM + * COM Split Odd Even + */ + ret =3D ssd13xx_write_cmd(ssd13xx, 2, SSD13XX_SET_SEG_REMAP, 0x53); + if (ret < 0) + return ret; + + /* Set display start and offset */ + ret =3D ssd13xx_write_cmd(ssd13xx, 2, SSD132X_SET_DISPLAY_START, 0x00); + if (ret < 0) + return ret; + + ret =3D ssd13xx_write_cmd(ssd13xx, 2, SSD132X_SET_DISPLAY_OFFSET, 0x00); + if (ret < 0) + return ret; + + /* Set display mode normal */ + ret =3D ssd13xx_write_cmd(ssd13xx, 1, SSD132X_SET_DISPLAY_NORMAL); + if (ret < 0) + return ret; + + /* Set multiplex ratio value */ + ret =3D ssd13xx_write_cmd(ssd13xx, 2, SSD13XX_SET_MULTIPLEX_RATIO, ssd13x= x->height - 1); + if (ret < 0) + return ret; + + /* Set phase length */ + ret =3D ssd13xx_write_cmd(ssd13xx, 2, SSD132X_SET_PHASE_LENGTH, 0x55); + if (ret < 0) + return ret; + + /* Select default linear gray scale table */ + ret =3D ssd13xx_write_cmd(ssd13xx, 1, SSD132X_SELECT_DEFAULT_TABLE); + if (ret < 0) + return ret; + + /* Set clock frequency */ + ret =3D ssd13xx_write_cmd(ssd13xx, 2, SSD132X_SET_CLOCK_FREQ, 0x01); + if (ret < 0) + return ret; + + /* Enable internal VDD regulator */ + ret =3D ssd13xx_write_cmd(ssd13xx, 2, SSD132X_SET_FUNCTION_SELECT_A, 0x1); + if (ret < 0) + return ret; + + /* Set pre-charge period */ + ret =3D ssd13xx_write_cmd(ssd13xx, 2, SSD132X_SET_PRECHARGE_PERIOD, 0x01); + if (ret < 0) + return ret; + + /* Set pre-charge voltage */ + ret =3D ssd13xx_write_cmd(ssd13xx, 2, SSD132X_SET_PRECHARGE_VOLTAGE, 0x08= ); + if (ret < 0) + return ret; + + /* Set VCOMH voltage */ + ret =3D ssd13xx_write_cmd(ssd13xx, 2, SSD130X_SET_VCOMH_VOLTAGE, 0x07); + if (ret < 0) + return ret; + + /* Enable second pre-charge and internal VSL */ + ret =3D ssd13xx_write_cmd(ssd13xx, 2, SSD132X_SET_FUNCTION_SELECT_B, 0x62= ); + if (ret < 0) + return ret; + + return 0; +} + +static int ssd132x_update_rect(struct ssd13xx_device *ssd13xx, + struct drm_rect *rect, u8 *buf, + u8 *data_array) +{ + unsigned int x =3D rect->x1 / 2; + unsigned int y =3D rect->y1; + unsigned int width =3D drm_rect_width(rect); + unsigned int height =3D drm_rect_height(rect); + unsigned int columns =3D DIV_ROUND_UP(width, 2); + unsigned int rows =3D height; + u32 array_idx =3D 0; + int ret, i, j; + + /* + * The screen is divided in Segment and Common outputs, where + * COM0 to COM[N - 1] are the rows and SEG0 to SEG[M - 1] are + * the columns. + * + * Each Segment has a 4-bit pixel and each Common output has a + * row of pixels. When using the (default) horizontal address + * increment mode, each byte of data sent to the controller has + * two Segments (e.g: SEG0 and SEG1) that are stored in the lower + * and higher nibbles of a single byte representing one column. + * That is, the first byte are SEG0 (D0[3:0]) and SEG1 (D0[7:4]), + * the second byte are SEG2 (D1[3:0]) and SEG3 (D1[7:4]) and so on. + */ + + /* Set column start and end */ + ret =3D ssd13xx_write_cmd(ssd13xx, 3, SSD132X_SET_COL_RANGE, x, columns -= 1); + if (ret < 0) + return ret; + + /* Set row start and end */ + ret =3D ssd13xx_write_cmd(ssd13xx, 3, SSD132X_SET_ROW_RANGE, y, rows - 1); + if (ret < 0) + return ret; + + for (i =3D 0; i < height; i++) { + /* Process pair of pixels and combine them into a single byte */ + for (j =3D 0; j < width; j +=3D 2) { + u8 n1 =3D buf[i * width + j]; + u8 n2 =3D buf[i * width + j + 1]; + + data_array[array_idx++] =3D (n2 << 4) | n1; + } + } + + /* Write out update in one go since horizontal addressing mode is used */ + ret =3D ssd13xx_write_data(ssd13xx, data_array, columns * rows); + + return ret; +} + +static void ssd132x_clear_screen(struct ssd13xx_device *ssd13xx, u8 *data_= array) +{ + memset(data_array, 0, ssd13xx->data_array_size); + + /* Write out update in one go since horizontal addressing mode is used */ + ssd13xx_write_data(ssd13xx, data_array, ssd13xx->data_array_size); +} + static const struct ssd13xx_funcs ssd13xx_family_funcs[] =3D { [SSD130X_FAMILY] =3D { .init =3D ssd130x_init, @@ -617,6 +801,12 @@ static const struct ssd13xx_funcs ssd13xx_family_funcs= [] =3D { .clear_screen =3D ssd130x_clear_screen, .fmt_convert =3D drm_fb_xrgb8888_to_mono, }, + [SSD132X_FAMILY] =3D { + .init =3D ssd132x_init, + .update_rect =3D ssd132x_update_rect, + .clear_screen =3D ssd132x_clear_screen, + .fmt_convert =3D drm_fb_xrgb8888_to_gray8, + } }; =20 static int ssd13xx_fb_blit_rect(struct drm_framebuffer *fb, @@ -631,9 +821,12 @@ static int ssd13xx_fb_blit_rect(struct drm_framebuffer= *fb, unsigned int dst_pitch; int ret =3D 0; =20 - /* Align y to display page boundaries */ - rect->y1 =3D round_down(rect->y1, SSD130X_PAGE_HEIGHT); - rect->y2 =3D min_t(unsigned int, round_up(rect->y2, SSD130X_PAGE_HEIGHT),= ssd13xx->height); + if (ssd13xx->device_info->family_id =3D=3D SSD130X_FAMILY) { + /* Align y to display page boundaries */ + rect->y1 =3D round_down(rect->y1, SSD130X_PAGE_HEIGHT); + rect->y2 =3D min_t(unsigned int, round_up(rect->y2, SSD130X_PAGE_HEIGHT), + ssd13xx->height); + } =20 dst_pitch =3D drm_format_info_min_pitch(fi, 0, drm_rect_width(rect)); =20 @@ -1217,6 +1410,13 @@ static int ssd13xx_set_buffer_sizes(struct ssd13xx_d= evice *ssd13xx, =20 fi =3D drm_format_info(DRM_FORMAT_R1); break; + case SSD132X_FAMILY: + unsigned int columns =3D DIV_ROUND_UP(ssd13xx->width, 2); + unsigned int rows =3D ssd13xx->height; + + ssd13xx->data_array_size =3D columns * rows; + + fi =3D drm_format_info(DRM_FORMAT_R8); } =20 if (!fi) diff --git a/drivers/gpu/drm/solomon/ssd13xx.h b/drivers/gpu/drm/solomon/ss= d13xx.h index 399b0c8b5680..58083c7e08c8 100644 --- a/drivers/gpu/drm/solomon/ssd13xx.h +++ b/drivers/gpu/drm/solomon/ssd13xx.h @@ -27,6 +27,7 @@ =20 enum ssd13xx_family_ids { SSD130X_FAMILY, + SSD132X_FAMILY, }; =20 enum ssd13xx_variants { @@ -36,6 +37,10 @@ enum ssd13xx_variants { SSD1306_ID, SSD1307_ID, SSD1309_ID, + /* ssd132x family */ + SSD1322_ID, + SSD1325_ID, + SSD1327_ID, NR_SSD13XX_VARIANTS }; =20 --=20 2.41.0 From nobody Fri Jan 2 17:25:33 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5C494CD611F for ; Mon, 9 Oct 2023 18:37:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1378170AbjJIShd (ORCPT ); Mon, 9 Oct 2023 14:37:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49684 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1378209AbjJIShP (ORCPT ); Mon, 9 Oct 2023 14:37:15 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 04151C6 for ; Mon, 9 Oct 2023 11:36:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1696876582; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=QVKQrPdUbZGc1wU+oO+Twkh3N/BNeBlGHNRWMhTu31k=; b=ZGdS2dKM/FSbizUYKYF0FsM70M33pd1lao1z+X1Qo88xNlV2WQ8MVdDS3q7t6ad0eAxZAv OrzI+Beqm7fSgw0DXPWpxREAQdr/1haUzAuT8iLAv5MKAfy72ucC8HMDSTcvmt5u8cEqPA rQoMUburAmDrSu+fEU5fygojyiYhTXU= Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-252--Jhv4srvMLWE1aNEW_63eA-1; Mon, 09 Oct 2023 14:36:11 -0400 X-MC-Unique: -Jhv4srvMLWE1aNEW_63eA-1 Received: by mail-wr1-f71.google.com with SMTP id ffacd0b85a97d-327ab41de6cso3517806f8f.2 for ; Mon, 09 Oct 2023 11:36:10 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1696876569; x=1697481369; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=QVKQrPdUbZGc1wU+oO+Twkh3N/BNeBlGHNRWMhTu31k=; b=YxR1QwYwzU+CexLQT0z0UGL+6Wahyyot1gJoZu/rRHbbuZvNYjvWefMnaTpIk3ktIz QWzFr1cS1REgwKjp1GLIdCE36y/s3yW62zcQZU085dVyPZHG+SNApGY65Tn5yzhwsE4B A0XsjcoWJVaUcb60/HKvJSd4LNqE0UqSNEM1eCVsiQMsVyAezIhJYbRNMxAvKGgpQd0E xyx4kpy6GfYo1voiItAofYOz/pIoyiCgzzX3IRKN+UcFpPF8NP5bpNt2W4shavePiq7Z tg1b1msvzew2atgMYGJalIvmCZxlJW2Nf4YNwVwEqaqFzWkpDGTeJJ9YTFEznBKOymzx OK2w== X-Gm-Message-State: AOJu0Yz7cjS62vLbVlZ6cTGo6xjkwefLoCqGNe9Mvp20rUmw9JcTI4bQ Ya7hCDO92y/j29ES2akmECTGq39YDRBswpnuLn1U2+wcZkq9POBJEaSt2LBp+UI2HlhvgbeqYxc CxusL5FxsvTnbPcy35BQXWjgOqE4N/4P53UjnObciQfJ+qgGzrdyVLMc/IF/htvYIRkaEr/JJNR y62eVgIiY= X-Received: by 2002:a05:6000:1008:b0:31a:ed75:75df with SMTP id a8-20020a056000100800b0031aed7575dfmr14391824wrx.15.1696876569561; Mon, 09 Oct 2023 11:36:09 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGHU9ipeYY5/67yz9rQUzhHMG8K4QZBRRRVgXLPaNfAyAaJFKTL902MD4ZsjPgkqmWa4uorcA== X-Received: by 2002:a05:6000:1008:b0:31a:ed75:75df with SMTP id a8-20020a056000100800b0031aed7575dfmr14391797wrx.15.1696876569304; Mon, 09 Oct 2023 11:36:09 -0700 (PDT) Received: from localhost (205.pool92-176-231.dynamic.orange.es. [92.176.231.205]) by smtp.gmail.com with ESMTPSA id b16-20020adfe650000000b003266ece0fe2sm10221874wrn.98.2023.10.09.11.36.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Oct 2023 11:36:09 -0700 (PDT) From: Javier Martinez Canillas To: linux-kernel@vger.kernel.org Cc: Maxime Ripard , Thomas Zimmermann , Geert Uytterhoeven , Javier Martinez Canillas , Conor Dooley , Daniel Vetter , David Airlie , Krzysztof Kozlowski , Maarten Lankhorst , Rob Herring , devicetree@vger.kernel.org, dri-devel@lists.freedesktop.org Subject: [PATCH 8/8] dt-bindings: display: Add SSD132x OLED controllers Date: Mon, 9 Oct 2023 20:34:22 +0200 Message-ID: <20231009183522.543918-9-javierm@redhat.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231009183522.543918-1-javierm@redhat.com> References: <20231009183522.543918-1-javierm@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add a Device Tree binding schema for the OLED panels based on the Solomon SSD132x family of controllers. Signed-off-by: Javier Martinez Canillas --- .../bindings/display/solomon,ssd132x.yaml | 116 ++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 Documentation/devicetree/bindings/display/solomon,ssd13= 2x.yaml diff --git a/Documentation/devicetree/bindings/display/solomon,ssd132x.yaml= b/Documentation/devicetree/bindings/display/solomon,ssd132x.yaml new file mode 100644 index 000000000000..b64904703a3a --- /dev/null +++ b/Documentation/devicetree/bindings/display/solomon,ssd132x.yaml @@ -0,0 +1,116 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/display/solomon,ssd132x.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Solomon SSD132x OLED Controllers + +maintainers: + - Javier Martinez Canillas + +properties: + compatible: + oneOf: + - enum: + - solomon,ssd1322 + - solomon,ssd1325 + - solomon,ssd1327 + + reg: + maxItems: 1 + + reset-gpios: + maxItems: 1 + + # Only required for SPI + dc-gpios: + description: + GPIO connected to the controller's D/C# (Data/Command) pin, + that is needed for 4-wire SPI to tell the controller if the + data sent is for a command register or the display data RAM + maxItems: 1 + + solomon,height: + $ref: /schemas/types.yaml#/definitions/uint32 + description: + Height in pixel of the screen driven by the controller. + The default value is controller-dependent. + + solomon,width: + $ref: /schemas/types.yaml#/definitions/uint32 + description: + Width in pixel of the screen driven by the controller. + The default value is controller-dependent. + +required: + - compatible + - reg + +allOf: + - $ref: /schemas/spi/spi-peripheral-props.yaml# + + - if: + properties: + compatible: + contains: + const: solomon,ssd1322 + then: + properties: + width: + default: 480 + height: + default: 128 + + - if: + properties: + compatible: + contains: + const: solomon,ssd1325 + then: + properties: + width: + default: 128 + height: + default: 80 + + - if: + properties: + compatible: + contains: + const: solomon,ssd1327 + then: + properties: + width: + default: 128 + height: + default: 128 + +unevaluatedProperties: false + +examples: + - | + i2c { + #address-cells =3D <1>; + #size-cells =3D <0>; + + ssd1327_i2c: oled@3c { + compatible =3D "solomon,ssd1327"; + reg =3D <0x3c>; + reset-gpios =3D <&gpio2 7>; + }; + + }; + - | + spi { + #address-cells =3D <1>; + #size-cells =3D <0>; + + ssd1327_spi: oled@0 { + compatible =3D "solomon,ssd1327"; + reg =3D <0x0>; + reset-gpios =3D <&gpio2 7>; + dc-gpios =3D <&gpio2 8>; + spi-max-frequency =3D <10000000>; + }; + }; --=20 2.41.0