Re: [PATCH 2/3] drm/panel: add samsung s6e3fa7 panel driver

2024-03-04 Thread Caleb Connolly



On 04/03/2024 21:41, Caleb Connolly wrote:
> 
> 
> On 09/02/2024 00:16, Richard Acayan wrote:
>> The S6E3FA7 display controller is enabled in every Pixel 3a (non-XL)
>> variant. Add the driver for it, generated by
>> linux-mdss-dsi-panel-driver-generator.
>>
>> There are other panels connected to the same S6E3FA7 display controller,
>> such as the AMS604NL01 panel, which are incompatible with this driver.
>> Name the device tree compatible after the panel model according to
>> iFixit.
>>
>> Link: 
>> https://github.com/msm8916-mainline/linux-mdss-dsi-panel-driver-generator
>> Link: 
>> https://android.googlesource.com/kernel/msm/+/7fda1cd7b64710dafac5f34899611c6d35eb4cd2/arch/arm64/boot/dts/google/dsi-panel-s6e3fa7-1080p-cmd.dtsi
>> Link: 
>> https://github.com/msm8953-mainline/linux/blob/v6.6.12-r0/drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c
>> Link: https://www.ifixit.com/Guide/Image/meta/muyjtLQTHu6MDkhK
>> Signed-off-by: Richard Acayan 
>> ---
>>  drivers/gpu/drm/panel/Kconfig |   9 +
>>  drivers/gpu/drm/panel/Makefile|   1 +
>>  drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c | 285 ++
>>  3 files changed, 295 insertions(+)
>>  create mode 100644 drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c
>>
> 
>> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c 
>> b/drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c
>> new file mode 100644
>> index ..10bc8fb5f1f9
>> --- /dev/null
>> +++ b/drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c
>> @@ -0,0 +1,285 @@
> 
> [snip]
>> +
>> +static int s6e3fa7_panel_probe(struct mipi_dsi_device *dsi)
>> +{
>> +struct device *dev = >dev;
>> +struct s6e3fa7_panel *ctx;
>> +int ret;
>> +
>> +ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
>> +if (!ctx)
>> +return -ENOMEM;
>> +
>> +ctx->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
>> +if (IS_ERR(ctx->reset_gpio))
>> +return dev_err_probe(dev, PTR_ERR(ctx->reset_gpio),
>> + "Failed to get reset-gpios\n");
>> +
>> +ctx->dsi = dsi;
>> +mipi_dsi_set_drvdata(dsi, ctx);
>> +
>> +dsi->lanes = 4;
>> +dsi->format = MIPI_DSI_FMT_RGB888;
>> +dsi->mode_flags = MIPI_DSI_MODE_VIDEO_BURST |
> This flag is only used for video mode panels, you can drop it.

Nevermind, I should really check the dates before hitting reply :/
> 
> With that,
> 
> Reviewed-by: Caleb Connolly 
>> +  MIPI_DSI_CLOCK_NON_CONTINUOUS | MIPI_DSI_MODE_LPM;
>> +
>> +drm_panel_init(>panel, dev, _panel_funcs,
>> +   DRM_MODE_CONNECTOR_DSI);
>> +ctx->panel.prepare_prev_first = true;
>> +
>> +ctx->panel.backlight = s6e3fa7_panel_create_backlight(dsi);
>> +if (IS_ERR(ctx->panel.backlight))
>> +return dev_err_probe(dev, PTR_ERR(ctx->panel.backlight),
>> + "Failed to create backlight\n");
>> +
>> +drm_panel_add(>panel);
>> +
>> +ret = mipi_dsi_attach(dsi);
>> +if (ret < 0) {
>> +dev_err(dev, "Failed to attach to DSI host: %d\n", ret);
>> +drm_panel_remove(>panel);
>> +return ret;
>> +}
>> +
>> +return 0;
>> +}
>> +
>> +static void s6e3fa7_panel_remove(struct mipi_dsi_device *dsi)
>> +{
>> +struct s6e3fa7_panel *ctx = mipi_dsi_get_drvdata(dsi);
>> +int ret;
>> +
>> +ret = mipi_dsi_detach(dsi);
>> +if (ret < 0)
>> +dev_err(>dev, "Failed to detach from DSI host: %d\n", ret);
>> +
>> +drm_panel_remove(>panel);
>> +}
>> +
>> +static const struct of_device_id s6e3fa7_panel_of_match[] = {
>> +{ .compatible = "samsung,s6e3fa7-ams559nk06" },
>> +{ /* sentinel */ }
>> +};
>> +MODULE_DEVICE_TABLE(of, s6e3fa7_panel_of_match);
>> +
>> +static struct mipi_dsi_driver s6e3fa7_panel_driver = {
>> +.probe = s6e3fa7_panel_probe,
>> +.remove = s6e3fa7_panel_remove,
>> +.driver = {
>> +.name = "panel-samsung-s6e3fa7",
>> +.of_match_table = s6e3fa7_panel_of_match,
>> +},
>> +};
>> +module_mipi_dsi_driver(s6e3fa7_panel_driver);
>> +
>> +MODULE_AUTHOR("Richard Acayan ");
>> +MODULE_DESCRIPTION("DRM driver for Samsung S6E3FA7 command mode DSI panel");
>> +MODULE_LICENSE("GPL");
> 

-- 
// Caleb (they/them)


Re: [PATCH 2/3] drm/panel: add samsung s6e3fa7 panel driver

2024-03-04 Thread Caleb Connolly



On 09/02/2024 00:16, Richard Acayan wrote:
> The S6E3FA7 display controller is enabled in every Pixel 3a (non-XL)
> variant. Add the driver for it, generated by
> linux-mdss-dsi-panel-driver-generator.
> 
> There are other panels connected to the same S6E3FA7 display controller,
> such as the AMS604NL01 panel, which are incompatible with this driver.
> Name the device tree compatible after the panel model according to
> iFixit.
> 
> Link: 
> https://github.com/msm8916-mainline/linux-mdss-dsi-panel-driver-generator
> Link: 
> https://android.googlesource.com/kernel/msm/+/7fda1cd7b64710dafac5f34899611c6d35eb4cd2/arch/arm64/boot/dts/google/dsi-panel-s6e3fa7-1080p-cmd.dtsi
> Link: 
> https://github.com/msm8953-mainline/linux/blob/v6.6.12-r0/drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c
> Link: https://www.ifixit.com/Guide/Image/meta/muyjtLQTHu6MDkhK
> Signed-off-by: Richard Acayan 
> ---
>  drivers/gpu/drm/panel/Kconfig |   9 +
>  drivers/gpu/drm/panel/Makefile|   1 +
>  drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c | 285 ++
>  3 files changed, 295 insertions(+)
>  create mode 100644 drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c
> 

> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c 
> b/drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c
> new file mode 100644
> index ..10bc8fb5f1f9
> --- /dev/null
> +++ b/drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c
> @@ -0,0 +1,285 @@

[snip]
> +
> +static int s6e3fa7_panel_probe(struct mipi_dsi_device *dsi)
> +{
> + struct device *dev = >dev;
> + struct s6e3fa7_panel *ctx;
> + int ret;
> +
> + ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
> + if (!ctx)
> + return -ENOMEM;
> +
> + ctx->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
> + if (IS_ERR(ctx->reset_gpio))
> + return dev_err_probe(dev, PTR_ERR(ctx->reset_gpio),
> +  "Failed to get reset-gpios\n");
> +
> + ctx->dsi = dsi;
> + mipi_dsi_set_drvdata(dsi, ctx);
> +
> + dsi->lanes = 4;
> + dsi->format = MIPI_DSI_FMT_RGB888;
> + dsi->mode_flags = MIPI_DSI_MODE_VIDEO_BURST |
This flag is only used for video mode panels, you can drop it.

With that,

Reviewed-by: Caleb Connolly 
> +   MIPI_DSI_CLOCK_NON_CONTINUOUS | MIPI_DSI_MODE_LPM;
> +
> + drm_panel_init(>panel, dev, _panel_funcs,
> +DRM_MODE_CONNECTOR_DSI);
> + ctx->panel.prepare_prev_first = true;
> +
> + ctx->panel.backlight = s6e3fa7_panel_create_backlight(dsi);
> + if (IS_ERR(ctx->panel.backlight))
> + return dev_err_probe(dev, PTR_ERR(ctx->panel.backlight),
> +  "Failed to create backlight\n");
> +
> + drm_panel_add(>panel);
> +
> + ret = mipi_dsi_attach(dsi);
> + if (ret < 0) {
> + dev_err(dev, "Failed to attach to DSI host: %d\n", ret);
> + drm_panel_remove(>panel);
> + return ret;
> + }
> +
> + return 0;
> +}
> +
> +static void s6e3fa7_panel_remove(struct mipi_dsi_device *dsi)
> +{
> + struct s6e3fa7_panel *ctx = mipi_dsi_get_drvdata(dsi);
> + int ret;
> +
> + ret = mipi_dsi_detach(dsi);
> + if (ret < 0)
> + dev_err(>dev, "Failed to detach from DSI host: %d\n", ret);
> +
> + drm_panel_remove(>panel);
> +}
> +
> +static const struct of_device_id s6e3fa7_panel_of_match[] = {
> + { .compatible = "samsung,s6e3fa7-ams559nk06" },
> + { /* sentinel */ }
> +};
> +MODULE_DEVICE_TABLE(of, s6e3fa7_panel_of_match);
> +
> +static struct mipi_dsi_driver s6e3fa7_panel_driver = {
> + .probe = s6e3fa7_panel_probe,
> + .remove = s6e3fa7_panel_remove,
> + .driver = {
> + .name = "panel-samsung-s6e3fa7",
> + .of_match_table = s6e3fa7_panel_of_match,
> + },
> +};
> +module_mipi_dsi_driver(s6e3fa7_panel_driver);
> +
> +MODULE_AUTHOR("Richard Acayan ");
> +MODULE_DESCRIPTION("DRM driver for Samsung S6E3FA7 command mode DSI panel");
> +MODULE_LICENSE("GPL");

-- 
// Caleb (they/them)


Re: [PATCH 2/3] drm/panel: add samsung s6e3fa7 panel driver

2024-02-28 Thread Jessica Zhang




On 2/9/2024 3:17 PM, Richard Acayan wrote:

On Thu, Feb 08, 2024 at 05:34:57PM -0800, Jessica Zhang wrote:

On 2/8/2024 4:16 PM, Richard Acayan wrote:

The S6E3FA7 display controller is enabled in every Pixel 3a (non-XL)
variant. Add the driver for it, generated by
linux-mdss-dsi-panel-driver-generator.

There are other panels connected to the same S6E3FA7 display controller,
such as the AMS604NL01 panel, which are incompatible with this driver.
Name the device tree compatible after the panel model according to
iFixit.

Link: https://github.com/msm8916-mainline/linux-mdss-dsi-panel-driver-generator
Link: 
https://android.googlesource.com/kernel/msm/+/7fda1cd7b64710dafac5f34899611c6d35eb4cd2/arch/arm64/boot/dts/google/dsi-panel-s6e3fa7-1080p-cmd.dtsi
Link: 
https://github.com/msm8953-mainline/linux/blob/v6.6.12-r0/drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c
Link: https://www.ifixit.com/Guide/Image/meta/muyjtLQTHu6MDkhK
Signed-off-by: Richard Acayan 
---
   drivers/gpu/drm/panel/Kconfig |   9 +
   drivers/gpu/drm/panel/Makefile|   1 +
   drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c | 285 ++
   3 files changed, 295 insertions(+)
   create mode 100644 drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c

diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig
index 8f3783742208..a693b03f680e 100644
--- a/drivers/gpu/drm/panel/Kconfig
+++ b/drivers/gpu/drm/panel/Kconfig
@@ -577,6 +577,15 @@ config DRM_PANEL_SAMSUNG_DB7430
  DB7430 DPI display controller used in such devices as the
  LMS397KF04 480x800 DPI panel.
+config DRM_PANEL_SAMSUNG_S6E3FA7
+   tristate "Samsung S6E3FA7 panel driver"
+   depends on OF
+   depends on DRM_MIPI_DSI
+   depends on BACKLIGHT_CLASS_DEVICE
+   help
+ Say Y here if you want to enable support for the Samsung S6E3FA7
+ 1920x2220 panel.
+
   config DRM_PANEL_SAMSUNG_S6D16D0
tristate "Samsung S6D16D0 DSI video mode panel"
depends on OF
diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile
index d94a644d0a6c..560b62129f68 100644
--- a/drivers/gpu/drm/panel/Makefile
+++ b/drivers/gpu/drm/panel/Makefile
@@ -59,6 +59,7 @@ obj-$(CONFIG_DRM_PANEL_SAMSUNG_LD9040) += 
panel-samsung-ld9040.o
   obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6D16D0) += panel-samsung-s6d16d0.o
   obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6D27A1) += panel-samsung-s6d27a1.o
   obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6D7AA0) += panel-samsung-s6d7aa0.o
+obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E3FA7) += panel-samsung-s6e3fa7.o
   obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2) += panel-samsung-s6e3ha2.o
   obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03) += panel-samsung-s6e63j0x03.o
   obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E63M0) += panel-samsung-s6e63m0.o
diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c 
b/drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c
new file mode 100644
index ..10bc8fb5f1f9
--- /dev/null
+++ b/drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c
@@ -0,0 +1,285 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Driver for the Samsung S6E3FA7 panel.
+ *
+ * Copyright (c) 2022-2024, The Linux Foundation. All rights reserved.



Hi Richard,

Not really sure about the copyright dates -- since this is a completely new
file to this tree, wouldn't the year be just 2024?


That would be more concise, but the original driver was generated and
added to a kernel fork [1] in 2022 and amendments have been made since then.


Ah, got it. Sounds good.

In that case

Reviewed-by: Jessica Zhang 

Thanks,

Jessica Zhang



[1] 
https://gitlab.com/sdm670-mainline/linux/-/blob/sdm670-v6.2.6/drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c?ref_type=tags



The rest LGTM.

Thanks,

Jessica Zhang


+ * Generated with linux-mdss-dsi-panel-driver-generator from vendor device 
tree:
+ * Copyright (c) 2013, The Linux Foundation. All rights reserved.
+ */ > +
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+
+#include 
+#include 
+#include 
+
+struct s6e3fa7_panel {
+   struct drm_panel panel;
+   struct mipi_dsi_device *dsi;
+   struct gpio_desc *reset_gpio;
+};
+
+static inline struct s6e3fa7_panel *to_s6e3fa7_panel(struct drm_panel *panel)
+{
+   return container_of(panel, struct s6e3fa7_panel, panel);
+}
+
+static void s6e3fa7_panel_reset(struct s6e3fa7_panel *ctx)
+{
+   gpiod_set_value_cansleep(ctx->reset_gpio, 1);
+   usleep_range(1000, 2000);
+   gpiod_set_value_cansleep(ctx->reset_gpio, 0);
+   usleep_range(1, 11000);
+}
+
+static int s6e3fa7_panel_on(struct s6e3fa7_panel *ctx)
+{
+   struct mipi_dsi_device *dsi = ctx->dsi;
+   struct device *dev = >dev;
+   int ret;
+
+   ret = mipi_dsi_dcs_exit_sleep_mode(dsi);
+   if (ret < 0) {
+   dev_err(dev, "Failed to exit sleep mode: %d\n", ret);
+   return ret;
+   }
+   msleep(120);
+
+   ret = mipi_dsi_dcs_set_tear_on(dsi, 

Re: [PATCH 2/3] drm/panel: add samsung s6e3fa7 panel driver

2024-02-09 Thread Richard Acayan
On Thu, Feb 08, 2024 at 05:34:57PM -0800, Jessica Zhang wrote:
> On 2/8/2024 4:16 PM, Richard Acayan wrote:
>> The S6E3FA7 display controller is enabled in every Pixel 3a (non-XL)
>> variant. Add the driver for it, generated by
>> linux-mdss-dsi-panel-driver-generator.
>> 
>> There are other panels connected to the same S6E3FA7 display controller,
>> such as the AMS604NL01 panel, which are incompatible with this driver.
>> Name the device tree compatible after the panel model according to
>> iFixit.
>> 
>> Link: 
>> https://github.com/msm8916-mainline/linux-mdss-dsi-panel-driver-generator
>> Link: 
>> https://android.googlesource.com/kernel/msm/+/7fda1cd7b64710dafac5f34899611c6d35eb4cd2/arch/arm64/boot/dts/google/dsi-panel-s6e3fa7-1080p-cmd.dtsi
>> Link: 
>> https://github.com/msm8953-mainline/linux/blob/v6.6.12-r0/drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c
>> Link: https://www.ifixit.com/Guide/Image/meta/muyjtLQTHu6MDkhK
>> Signed-off-by: Richard Acayan 
>> ---
>>   drivers/gpu/drm/panel/Kconfig |   9 +
>>   drivers/gpu/drm/panel/Makefile|   1 +
>>   drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c | 285 ++
>>   3 files changed, 295 insertions(+)
>>   create mode 100644 drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c
>> 
>> diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig
>> index 8f3783742208..a693b03f680e 100644
>> --- a/drivers/gpu/drm/panel/Kconfig
>> +++ b/drivers/gpu/drm/panel/Kconfig
>> @@ -577,6 +577,15 @@ config DRM_PANEL_SAMSUNG_DB7430
>>DB7430 DPI display controller used in such devices as the
>>LMS397KF04 480x800 DPI panel.
>> +config DRM_PANEL_SAMSUNG_S6E3FA7
>> +tristate "Samsung S6E3FA7 panel driver"
>> +depends on OF
>> +depends on DRM_MIPI_DSI
>> +depends on BACKLIGHT_CLASS_DEVICE
>> +help
>> +  Say Y here if you want to enable support for the Samsung S6E3FA7
>> +  1920x2220 panel.
>> +
>>   config DRM_PANEL_SAMSUNG_S6D16D0
>>  tristate "Samsung S6D16D0 DSI video mode panel"
>>  depends on OF
>> diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile
>> index d94a644d0a6c..560b62129f68 100644
>> --- a/drivers/gpu/drm/panel/Makefile
>> +++ b/drivers/gpu/drm/panel/Makefile
>> @@ -59,6 +59,7 @@ obj-$(CONFIG_DRM_PANEL_SAMSUNG_LD9040) += 
>> panel-samsung-ld9040.o
>>   obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6D16D0) += panel-samsung-s6d16d0.o
>>   obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6D27A1) += panel-samsung-s6d27a1.o
>>   obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6D7AA0) += panel-samsung-s6d7aa0.o
>> +obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E3FA7) += panel-samsung-s6e3fa7.o
>>   obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2) += panel-samsung-s6e3ha2.o
>>   obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03) += panel-samsung-s6e63j0x03.o
>>   obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E63M0) += panel-samsung-s6e63m0.o
>> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c 
>> b/drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c
>> new file mode 100644
>> index ..10bc8fb5f1f9
>> --- /dev/null
>> +++ b/drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c
>> @@ -0,0 +1,285 @@
>> +// SPDX-License-Identifier: GPL-2.0-only
>> +/*
>> + * Driver for the Samsung S6E3FA7 panel.
>> + *
>> + * Copyright (c) 2022-2024, The Linux Foundation. All rights reserved.
>
>
> Hi Richard,
>
> Not really sure about the copyright dates -- since this is a completely new
> file to this tree, wouldn't the year be just 2024?

That would be more concise, but the original driver was generated and
added to a kernel fork [1] in 2022 and amendments have been made since then.

[1] 
https://gitlab.com/sdm670-mainline/linux/-/blob/sdm670-v6.2.6/drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c?ref_type=tags

>
> The rest LGTM.
>
> Thanks,
>
> Jessica Zhang
>
>> + * Generated with linux-mdss-dsi-panel-driver-generator from vendor device 
>> tree:
>> + * Copyright (c) 2013, The Linux Foundation. All rights reserved.
>> + */ > +
>> +#include 
>> +#include 
>> +#include 
>> +#include 
>> +#include 
>> +
>> +#include 
>> +
>> +#include 
>> +#include 
>> +#include 
>> +
>> +struct s6e3fa7_panel {
>> +struct drm_panel panel;
>> +struct mipi_dsi_device *dsi;
>> +struct gpio_desc *reset_gpio;
>> +};
>> +
>> +static inline struct s6e3fa7_panel *to_s6e3fa7_panel(struct drm_panel 
>> *panel)
>> +{
>> +return container_of(panel, struct s6e3fa7_panel, panel);
>> +}
>> +
>> +static void s6e3fa7_panel_reset(struct s6e3fa7_panel *ctx)
>> +{
>> +gpiod_set_value_cansleep(ctx->reset_gpio, 1);
>> +usleep_range(1000, 2000);
>> +gpiod_set_value_cansleep(ctx->reset_gpio, 0);
>> +usleep_range(1, 11000);
>> +}
>> +
>> +static int s6e3fa7_panel_on(struct s6e3fa7_panel *ctx)
>> +{
>> +struct mipi_dsi_device *dsi = ctx->dsi;
>> +struct device *dev = >dev;
>> +int ret;
>> +
>> +ret = mipi_dsi_dcs_exit_sleep_mode(dsi);
>> +if (ret < 0) {
>> +dev_err(dev, "Failed to exit sleep mode: %d\n", ret);
>> +

Re: [PATCH 2/3] drm/panel: add samsung s6e3fa7 panel driver

2024-02-08 Thread Jessica Zhang




On 2/8/2024 4:16 PM, Richard Acayan wrote:

The S6E3FA7 display controller is enabled in every Pixel 3a (non-XL)
variant. Add the driver for it, generated by
linux-mdss-dsi-panel-driver-generator.

There are other panels connected to the same S6E3FA7 display controller,
such as the AMS604NL01 panel, which are incompatible with this driver.
Name the device tree compatible after the panel model according to
iFixit.

Link: https://github.com/msm8916-mainline/linux-mdss-dsi-panel-driver-generator
Link: 
https://android.googlesource.com/kernel/msm/+/7fda1cd7b64710dafac5f34899611c6d35eb4cd2/arch/arm64/boot/dts/google/dsi-panel-s6e3fa7-1080p-cmd.dtsi
Link: 
https://github.com/msm8953-mainline/linux/blob/v6.6.12-r0/drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c
Link: https://www.ifixit.com/Guide/Image/meta/muyjtLQTHu6MDkhK
Signed-off-by: Richard Acayan 
---
  drivers/gpu/drm/panel/Kconfig |   9 +
  drivers/gpu/drm/panel/Makefile|   1 +
  drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c | 285 ++
  3 files changed, 295 insertions(+)
  create mode 100644 drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c

diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig
index 8f3783742208..a693b03f680e 100644
--- a/drivers/gpu/drm/panel/Kconfig
+++ b/drivers/gpu/drm/panel/Kconfig
@@ -577,6 +577,15 @@ config DRM_PANEL_SAMSUNG_DB7430
  DB7430 DPI display controller used in such devices as the
  LMS397KF04 480x800 DPI panel.
  
+config DRM_PANEL_SAMSUNG_S6E3FA7

+   tristate "Samsung S6E3FA7 panel driver"
+   depends on OF
+   depends on DRM_MIPI_DSI
+   depends on BACKLIGHT_CLASS_DEVICE
+   help
+ Say Y here if you want to enable support for the Samsung S6E3FA7
+ 1920x2220 panel.
+
  config DRM_PANEL_SAMSUNG_S6D16D0
tristate "Samsung S6D16D0 DSI video mode panel"
depends on OF
diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile
index d94a644d0a6c..560b62129f68 100644
--- a/drivers/gpu/drm/panel/Makefile
+++ b/drivers/gpu/drm/panel/Makefile
@@ -59,6 +59,7 @@ obj-$(CONFIG_DRM_PANEL_SAMSUNG_LD9040) += 
panel-samsung-ld9040.o
  obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6D16D0) += panel-samsung-s6d16d0.o
  obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6D27A1) += panel-samsung-s6d27a1.o
  obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6D7AA0) += panel-samsung-s6d7aa0.o
+obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E3FA7) += panel-samsung-s6e3fa7.o
  obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2) += panel-samsung-s6e3ha2.o
  obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03) += panel-samsung-s6e63j0x03.o
  obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E63M0) += panel-samsung-s6e63m0.o
diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c 
b/drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c
new file mode 100644
index ..10bc8fb5f1f9
--- /dev/null
+++ b/drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c
@@ -0,0 +1,285 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Driver for the Samsung S6E3FA7 panel.
+ *
+ * Copyright (c) 2022-2024, The Linux Foundation. All rights reserved.



Hi Richard,

Not really sure about the copyright dates -- since this is a completely 
new file to this tree, wouldn't the year be just 2024?


The rest LGTM.

Thanks,

Jessica Zhang


+ * Generated with linux-mdss-dsi-panel-driver-generator from vendor device 
tree:
+ * Copyright (c) 2013, The Linux Foundation. All rights reserved.
+ */ > +
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+
+#include 
+#include 
+#include 
+
+struct s6e3fa7_panel {
+   struct drm_panel panel;
+   struct mipi_dsi_device *dsi;
+   struct gpio_desc *reset_gpio;
+};
+
+static inline struct s6e3fa7_panel *to_s6e3fa7_panel(struct drm_panel *panel)
+{
+   return container_of(panel, struct s6e3fa7_panel, panel);
+}
+
+static void s6e3fa7_panel_reset(struct s6e3fa7_panel *ctx)
+{
+   gpiod_set_value_cansleep(ctx->reset_gpio, 1);
+   usleep_range(1000, 2000);
+   gpiod_set_value_cansleep(ctx->reset_gpio, 0);
+   usleep_range(1, 11000);
+}
+
+static int s6e3fa7_panel_on(struct s6e3fa7_panel *ctx)
+{
+   struct mipi_dsi_device *dsi = ctx->dsi;
+   struct device *dev = >dev;
+   int ret;
+
+   ret = mipi_dsi_dcs_exit_sleep_mode(dsi);
+   if (ret < 0) {
+   dev_err(dev, "Failed to exit sleep mode: %d\n", ret);
+   return ret;
+   }
+   msleep(120);
+
+   ret = mipi_dsi_dcs_set_tear_on(dsi, MIPI_DSI_DCS_TEAR_MODE_VBLANK);
+   if (ret < 0) {
+   dev_err(dev, "Failed to set tear on: %d\n", ret);
+   return ret;
+   }
+
+   mipi_dsi_dcs_write_seq(dsi, 0xf0, 0x5a, 0x5a);
+   mipi_dsi_dcs_write_seq(dsi, 0xf4,
+  0xbb, 0x23, 0x19, 0x3a, 0x9f, 0x0f, 0x09, 0xc0,
+  0x00, 0xb4, 0x37, 0x70, 0x79, 0x69);
+   mipi_dsi_dcs_write_seq(dsi, 0xf0, 0xa5, 0xa5);
+   mipi_dsi_dcs_write_seq(dsi,