From: carlis <zhangxuezhi3@gmail.com>
To: Dan Carpenter <dan.carpenter@oracle.com>
Cc: gregkh@linuxfoundation.org, devel@driverdev.osuosl.org,
linux-fbdev@vger.kernel.org, mh12gx2825@gmail.com,
oliver.graute@kococonnector.com, linux-kernel@vger.kernel.org,
dri-devel@lists.freedesktop.org, sbrivio@redhat.com,
colin.king@canonical.com, zhangxuezhi1@yulong.com
Subject: Re: [PATCH] fbtft: add tearing signal detect
Date: Tue, 26 Jan 2021 20:43:16 +0800 [thread overview]
Message-ID: <20210126204316.00004cff@gmail.com> (raw)
In-Reply-To: <20210126075441.GW2696@kadam>
On Tue, 26 Jan 2021 10:54:41 +0300
Dan Carpenter <dan.carpenter@oracle.com> wrote:
> On Sun, Jan 24, 2021 at 11:35:37PM +0800, Carlis wrote:
> > +static irqreturn_t spi_panel_te_handler(int irq, void *data)
> > +{
> > + complete(&spi_panel_te);
> > + return IRQ_HANDLED;
> > +}
> > +
> > +static void enable_spi_panel_te_irq(struct fbtft_par *par, bool
> > enable)
>
> It quite confused me that enable actually disables. I always feel
> like it's clearer to write these as two separate functions.
>
> > +{
> > + static int te_irq_count;
> > +
> > + if (!par->gpio.te) {
>
> This is always checked in the caller. And it's when it's NULL that
> means it's deliberate so don't print a message.
>
> > + pr_err("%s:%d,SPI panel TE GPIO not configured\n",
> > + __func__, __LINE__);
> > + return;
> > + }
> > +
> > + mutex_lock(&te_mutex);
> > +
> > + if (enable) {
> > + if (++te_irq_count == 1)
> > + enable_irq(gpiod_to_irq(par->gpio.te));
> > + } else {
> > + if (--te_irq_count == 0)
> > + disable_irq(gpiod_to_irq(par->gpio.te));
> > + }
> > + mutex_unlock(&te_mutex);
> > +}
> > +
> > /**
> > * init_display() - initialize the display controller
> > *
> > @@ -82,6 +117,28 @@ enum st7789v_command {
> > */
> > static int init_display(struct fbtft_par *par)
> > {
> > + int rc;
> > + struct device *dev = par->info->device;
> > +
> > + par->gpio.te = devm_gpiod_get_index_optional(dev, "te", 0,
> > GPIOD_IN);
> > + if (par->gpio.te) {
>
> devm_gpiod_get_index_optional() can return NULL or error pointers. If
> it returns NULL then don't print an error message. NULL reports are
> deliberate.
>
> par->gpio.te = devm_gpiod_get_index_optional(dev, "te", 0,
> GPIOD_IN); if (IS_ERR(par->gpio.te)) {
> pr_err("%s:%d, TE gpio not specified\n", __func__,
> __LINE__); return PTR_ERR(par->gpio.te);
> }
>
> if (par->gpio.te) {
>
>
> > + init_completion(&spi_panel_te);
> > + mutex_init(&te_mutex);
> > + rc = devm_request_irq(dev,
> > + gpiod_to_irq(par->gpio.te),
> > + spi_panel_te_handler,
> > IRQF_TRIGGER_RISING,
> > + "TE_GPIO", par);
> > + if (rc) {
> > + pr_err("TE request_irq failed.\n");
> > + par->gpio.te = NULL;
> > + } else {
> > +
> > disable_irq_nosync(gpiod_to_irq(par->gpio.te));
> > + pr_err("TE request_irq completion.\n");
>
> Why is this printing an error message if devm_request_irq() succeeds?
>
> > + }
> > + } else {
> > + pr_err("%s:%d, TE gpio not specified\n",
> > + __func__, __LINE__);
> > + }
> > /* turn off sleep mode */
> > write_reg(par, MIPI_DCS_EXIT_SLEEP_MODE);
> > mdelay(120);
> > @@ -137,6 +194,9 @@ static int init_display(struct fbtft_par *par)
> > */
> > write_reg(par, PWCTRL1, 0xA4, 0xA1);
> >
> > + /*Tearing Effect Line On*/
> > + if (par->gpio.te)
> > + write_reg(par, 0x35, 0x00);
> > write_reg(par, MIPI_DCS_SET_DISPLAY_ON);
> >
> > if (HSD20_IPS)
> > @@ -145,6 +205,76 @@ static int init_display(struct fbtft_par *par)
> > return 0;
> > }
> >
> > +/*****************************************************************************
> > + *
> > + * int (*write_vmem)(struct fbtft_par *par);
> > + *
> > +
> > *****************************************************************************/
> > + +/* 16 bit pixel over 8-bit databus */
> > +int st7789v_write_vmem16_bus8(struct fbtft_par *par, size_t
> > offset, size_t len) +{
> > + u16 *vmem16;
> > + __be16 *txbuf16 = par->txbuf.buf;
> > + size_t remain;
> > + size_t to_copy;
> > + size_t tx_array_size;
> > + int i;
> > + int rc, ret = 0;
>
> Delete one of these "rc" or "rec" variables.
>
> > + size_t startbyte_size = 0;
> > +
> > + fbtft_par_dbg(DEBUG_WRITE_VMEM, par, "st7789v
> > ---%s(offset=%zu, len=%zu)\n",
> > + __func__, offset, len);
> > +
> > + remain = len / 2;
> > + vmem16 = (u16 *)(par->info->screen_buffer + offset);
> > +
> > + if (par->gpio.dc)
> > + gpiod_set_value(par->gpio.dc, 1);
> > +
> > + /* non buffered write */
> > + if (!par->txbuf.buf)
> > + return par->fbtftops.write(par, vmem16, len);
> > +
> > + /* buffered write */
> > + tx_array_size = par->txbuf.len / 2;
> > +
> > + if (par->startbyte) {
> > + txbuf16 = par->txbuf.buf + 1;
> > + tx_array_size -= 2;
> > + *(u8 *)(par->txbuf.buf) = par->startbyte | 0x2;
> > + startbyte_size = 1;
> > + }
> > +
> > + while (remain) {
> > + to_copy = min(tx_array_size, remain);
> > + dev_dbg(par->info->device, " to_copy=%zu,
> > remain=%zu\n",
> > + to_copy, remain - to_copy);
> > +
> > + for (i = 0; i < to_copy; i++)
> > + txbuf16[i] = cpu_to_be16(vmem16[i]);
> > +
> > + vmem16 = vmem16 + to_copy;
> > + if (par->gpio.te) {
> > + enable_spi_panel_te_irq(par, true);
> > + reinit_completion(&spi_panel_te);
> > + rc =
> > wait_for_completion_timeout(&spi_panel_te,
> > +
> > msecs_to_jiffies(SPI_PANEL_TE_TIMEOUT));
> > + if (rc == 0)
> > + pr_err("wait panel TE time out\n");
> > + }
> > + ret = par->fbtftops.write(par, par->txbuf.buf,
> > +
> > startbyte_size + to_copy * 2);
>
> Line break is whacky.
>
> > + if (par->gpio.te)
> > + enable_spi_panel_te_irq(par, false);
> > + if (ret < 0)
> > + return ret;
> > + remain -= to_copy;
> > + }
> > +
> > + return ret;
>
> Shouldn't this be "return len;" or something?
>
> > +}
> > +
>
> regards,
> dan carpenter
>
OK,i will fix in patch v4
regards,
zhangxuezhi
WARNING: multiple messages have this Message-ID (diff)
From: carlis <zhangxuezhi3@gmail.com>
To: Dan Carpenter <dan.carpenter@oracle.com>
Cc: devel@driverdev.osuosl.org, linux-fbdev@vger.kernel.org,
mh12gx2825@gmail.com, gregkh@linuxfoundation.org,
oliver.graute@kococonnector.com, linux-kernel@vger.kernel.org,
dri-devel@lists.freedesktop.org, sbrivio@redhat.com,
colin.king@canonical.com, zhangxuezhi1@yulong.com
Subject: Re: [PATCH] fbtft: add tearing signal detect
Date: Tue, 26 Jan 2021 20:43:16 +0800 [thread overview]
Message-ID: <20210126204316.00004cff@gmail.com> (raw)
In-Reply-To: <20210126075441.GW2696@kadam>
On Tue, 26 Jan 2021 10:54:41 +0300
Dan Carpenter <dan.carpenter@oracle.com> wrote:
> On Sun, Jan 24, 2021 at 11:35:37PM +0800, Carlis wrote:
> > +static irqreturn_t spi_panel_te_handler(int irq, void *data)
> > +{
> > + complete(&spi_panel_te);
> > + return IRQ_HANDLED;
> > +}
> > +
> > +static void enable_spi_panel_te_irq(struct fbtft_par *par, bool
> > enable)
>
> It quite confused me that enable actually disables. I always feel
> like it's clearer to write these as two separate functions.
>
> > +{
> > + static int te_irq_count;
> > +
> > + if (!par->gpio.te) {
>
> This is always checked in the caller. And it's when it's NULL that
> means it's deliberate so don't print a message.
>
> > + pr_err("%s:%d,SPI panel TE GPIO not configured\n",
> > + __func__, __LINE__);
> > + return;
> > + }
> > +
> > + mutex_lock(&te_mutex);
> > +
> > + if (enable) {
> > + if (++te_irq_count == 1)
> > + enable_irq(gpiod_to_irq(par->gpio.te));
> > + } else {
> > + if (--te_irq_count == 0)
> > + disable_irq(gpiod_to_irq(par->gpio.te));
> > + }
> > + mutex_unlock(&te_mutex);
> > +}
> > +
> > /**
> > * init_display() - initialize the display controller
> > *
> > @@ -82,6 +117,28 @@ enum st7789v_command {
> > */
> > static int init_display(struct fbtft_par *par)
> > {
> > + int rc;
> > + struct device *dev = par->info->device;
> > +
> > + par->gpio.te = devm_gpiod_get_index_optional(dev, "te", 0,
> > GPIOD_IN);
> > + if (par->gpio.te) {
>
> devm_gpiod_get_index_optional() can return NULL or error pointers. If
> it returns NULL then don't print an error message. NULL reports are
> deliberate.
>
> par->gpio.te = devm_gpiod_get_index_optional(dev, "te", 0,
> GPIOD_IN); if (IS_ERR(par->gpio.te)) {
> pr_err("%s:%d, TE gpio not specified\n", __func__,
> __LINE__); return PTR_ERR(par->gpio.te);
> }
>
> if (par->gpio.te) {
>
>
> > + init_completion(&spi_panel_te);
> > + mutex_init(&te_mutex);
> > + rc = devm_request_irq(dev,
> > + gpiod_to_irq(par->gpio.te),
> > + spi_panel_te_handler,
> > IRQF_TRIGGER_RISING,
> > + "TE_GPIO", par);
> > + if (rc) {
> > + pr_err("TE request_irq failed.\n");
> > + par->gpio.te = NULL;
> > + } else {
> > +
> > disable_irq_nosync(gpiod_to_irq(par->gpio.te));
> > + pr_err("TE request_irq completion.\n");
>
> Why is this printing an error message if devm_request_irq() succeeds?
>
> > + }
> > + } else {
> > + pr_err("%s:%d, TE gpio not specified\n",
> > + __func__, __LINE__);
> > + }
> > /* turn off sleep mode */
> > write_reg(par, MIPI_DCS_EXIT_SLEEP_MODE);
> > mdelay(120);
> > @@ -137,6 +194,9 @@ static int init_display(struct fbtft_par *par)
> > */
> > write_reg(par, PWCTRL1, 0xA4, 0xA1);
> >
> > + /*Tearing Effect Line On*/
> > + if (par->gpio.te)
> > + write_reg(par, 0x35, 0x00);
> > write_reg(par, MIPI_DCS_SET_DISPLAY_ON);
> >
> > if (HSD20_IPS)
> > @@ -145,6 +205,76 @@ static int init_display(struct fbtft_par *par)
> > return 0;
> > }
> >
> > +/*****************************************************************************
> > + *
> > + * int (*write_vmem)(struct fbtft_par *par);
> > + *
> > +
> > *****************************************************************************/
> > + +/* 16 bit pixel over 8-bit databus */
> > +int st7789v_write_vmem16_bus8(struct fbtft_par *par, size_t
> > offset, size_t len) +{
> > + u16 *vmem16;
> > + __be16 *txbuf16 = par->txbuf.buf;
> > + size_t remain;
> > + size_t to_copy;
> > + size_t tx_array_size;
> > + int i;
> > + int rc, ret = 0;
>
> Delete one of these "rc" or "rec" variables.
>
> > + size_t startbyte_size = 0;
> > +
> > + fbtft_par_dbg(DEBUG_WRITE_VMEM, par, "st7789v
> > ---%s(offset=%zu, len=%zu)\n",
> > + __func__, offset, len);
> > +
> > + remain = len / 2;
> > + vmem16 = (u16 *)(par->info->screen_buffer + offset);
> > +
> > + if (par->gpio.dc)
> > + gpiod_set_value(par->gpio.dc, 1);
> > +
> > + /* non buffered write */
> > + if (!par->txbuf.buf)
> > + return par->fbtftops.write(par, vmem16, len);
> > +
> > + /* buffered write */
> > + tx_array_size = par->txbuf.len / 2;
> > +
> > + if (par->startbyte) {
> > + txbuf16 = par->txbuf.buf + 1;
> > + tx_array_size -= 2;
> > + *(u8 *)(par->txbuf.buf) = par->startbyte | 0x2;
> > + startbyte_size = 1;
> > + }
> > +
> > + while (remain) {
> > + to_copy = min(tx_array_size, remain);
> > + dev_dbg(par->info->device, " to_copy=%zu,
> > remain=%zu\n",
> > + to_copy, remain - to_copy);
> > +
> > + for (i = 0; i < to_copy; i++)
> > + txbuf16[i] = cpu_to_be16(vmem16[i]);
> > +
> > + vmem16 = vmem16 + to_copy;
> > + if (par->gpio.te) {
> > + enable_spi_panel_te_irq(par, true);
> > + reinit_completion(&spi_panel_te);
> > + rc =
> > wait_for_completion_timeout(&spi_panel_te,
> > +
> > msecs_to_jiffies(SPI_PANEL_TE_TIMEOUT));
> > + if (rc == 0)
> > + pr_err("wait panel TE time out\n");
> > + }
> > + ret = par->fbtftops.write(par, par->txbuf.buf,
> > +
> > startbyte_size + to_copy * 2);
>
> Line break is whacky.
>
> > + if (par->gpio.te)
> > + enable_spi_panel_te_irq(par, false);
> > + if (ret < 0)
> > + return ret;
> > + remain -= to_copy;
> > + }
> > +
> > + return ret;
>
> Shouldn't this be "return len;" or something?
>
> > +}
> > +
>
> regards,
> dan carpenter
>
OK,i will fix in patch v4
regards,
zhangxuezhi
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
next prev parent reply other threads:[~2021-01-26 12:45 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-24 15:35 [PATCH] fbtft: add tearing signal detect Carlis
2021-01-24 15:35 ` Carlis
2021-01-26 7:54 ` Dan Carpenter
2021-01-26 7:54 ` Dan Carpenter
2021-01-26 12:43 ` carlis [this message]
2021-01-26 12:43 ` carlis
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210126204316.00004cff@gmail.com \
--to=zhangxuezhi3@gmail.com \
--cc=colin.king@canonical.com \
--cc=dan.carpenter@oracle.com \
--cc=devel@driverdev.osuosl.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=gregkh@linuxfoundation.org \
--cc=linux-fbdev@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mh12gx2825@gmail.com \
--cc=oliver.graute@kococonnector.com \
--cc=sbrivio@redhat.com \
--cc=zhangxuezhi1@yulong.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.