* [PATCH 1/1] OMAP: DSS2: RFBI driver update
@ 2009-10-09 21:08 Mikkel Christensen
2009-10-12 8:25 ` Tomi Valkeinen
2009-10-13 18:38 ` Kevin Hilman
0 siblings, 2 replies; 7+ messages in thread
From: Mikkel Christensen @ 2009-10-09 21:08 UTC (permalink / raw)
To: tomi.valkeinen; +Cc: linux-omap, Mikkel Christensen
This patch adds suspend / resume functionality to the RFBI driver along with missing callback functions needed by OMAP Frame buffer.
Signed-off-by: Mikkel Christensen <mlc@ti.com>
---
drivers/video/omap2/dss/rfbi.c | 76 ++++++++++++++++++++++++++++++++++++++++
1 files changed, 76 insertions(+), 0 deletions(-)
diff --git a/drivers/video/omap2/dss/rfbi.c b/drivers/video/omap2/dss/rfbi.c
index 9dd2349..ddfc472 100644
--- a/drivers/video/omap2/dss/rfbi.c
+++ b/drivers/video/omap2/dss/rfbi.c
@@ -1181,6 +1181,7 @@ int rfbi_init(void)
/* Enable autoidle and smart-idle */
l = rfbi_read_reg(RFBI_SYSCONFIG);
+ l &= ~((0x03 << 3)|(0x01 << 0));
l |= (1 << 0) | (2 << 3);
rfbi_write_reg(RFBI_SYSCONFIG, l);
@@ -1208,6 +1209,9 @@ static int rfbi_display_update(struct omap_dss_device *dssdev,
{
int rfbi_module;
+ if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
+ return 0;
+
if (w == 0 || h == 0)
return 0;
@@ -1239,6 +1243,18 @@ static int rfbi_display_enable_te(struct omap_dss_device *dssdev, bool enable)
return 0;
}
+static enum omap_dss_update_mode rfbi_display_get_update_mode(
+ struct omap_dss_device *dssdev)
+{
+ return OMAP_DSS_UPDATE_MANUAL;
+}
+
+static int rfbi_display_set_update_mode(struct omap_dss_device *dssdev,
+ enum omap_dss_update_mode mode)
+{
+ return 0;
+}
+
static int rfbi_display_enable(struct omap_dss_device *dssdev)
{
int r;
@@ -1269,6 +1285,7 @@ static int rfbi_display_enable(struct omap_dss_device *dssdev)
rfbi_set_timings(dssdev->phy.rfbi.channel,
&dssdev->ctrl.rfbi_timings);
+ dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
if (dssdev->driver->enable) {
r = dssdev->driver->enable(dssdev);
@@ -1288,12 +1305,67 @@ err0:
static void rfbi_display_disable(struct omap_dss_device *dssdev)
{
+ dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
+
dssdev->driver->disable(dssdev);
omap_dispc_unregister_isr(framedone_callback, NULL,
DISPC_IRQ_FRAMEDONE);
omap_dss_stop_device(dssdev);
}
+static int rfbi_display_suspend(struct omap_dss_device *dssdev)
+{
+ unsigned long l;
+
+ if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
+ return -EINVAL;
+
+ DSSDBG("rfbi_display_suspend\n");
+
+ if (dssdev->driver->suspend)
+ dssdev->driver->suspend(dssdev);
+
+ dispc_enable_lcd_out(0);
+
+ /* Force idle */
+ rfbi_enable_clocks(1);
+ l = rfbi_read_reg(RFBI_SYSCONFIG);
+ l &= ~(0x03 << 3);
+ rfbi_write_reg(RFBI_SYSCONFIG, l);
+ rfbi_enable_clocks(0);
+
+ dssdev->state = OMAP_DSS_DISPLAY_SUSPENDED;
+
+ return 0;
+}
+
+static int rfbi_display_resume(struct omap_dss_device *dssdev)
+{
+ unsigned long l;
+
+ if (dssdev->state != OMAP_DSS_DISPLAY_SUSPENDED)
+ return -EINVAL;
+
+ DSSDBG("rfbi_display_resume\n");
+
+ /* Re-enable autoidle */
+ rfbi_enable_clocks(1);
+ l = rfbi_read_reg(RFBI_SYSCONFIG);
+ l &= ~(0x03 << 3);
+ l |= (0x02 << 3);
+ rfbi_write_reg(RFBI_SYSCONFIG, l);
+ rfbi_enable_clocks(0);
+
+ dispc_enable_lcd_out(1);
+
+ if (dssdev->driver->resume)
+ dssdev->driver->resume(dssdev);
+
+ dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
+
+ return 0;
+}
+
int rfbi_init_display(struct omap_dss_device *dssdev)
{
dssdev->enable = rfbi_display_enable;
@@ -1301,6 +1373,10 @@ int rfbi_init_display(struct omap_dss_device *dssdev)
dssdev->update = rfbi_display_update;
dssdev->sync = rfbi_display_sync;
dssdev->enable_te = rfbi_display_enable_te;
+ dssdev->get_update_mode = rfbi_display_get_update_mode;
+ dssdev->set_update_mode = rfbi_display_set_update_mode;
+ dssdev->suspend = rfbi_display_suspend;
+ dssdev->resume = rfbi_display_resume;
rfbi.dssdev[dssdev->phy.rfbi.channel] = dssdev;
--
1.6.0.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 1/1] OMAP: DSS2: RFBI driver update
2009-10-09 21:08 [PATCH 1/1] OMAP: DSS2: RFBI driver update Mikkel Christensen
@ 2009-10-12 8:25 ` Tomi Valkeinen
2009-10-12 14:03 ` Christensen, Mikkel
2009-10-13 18:38 ` Kevin Hilman
1 sibling, 1 reply; 7+ messages in thread
From: Tomi Valkeinen @ 2009-10-12 8:25 UTC (permalink / raw)
To: ext Mikkel Christensen; +Cc: linux-omap@vger.kernel.org
On Fri, 2009-10-09 at 23:08 +0200, ext Mikkel Christensen wrote:
> This patch adds suspend / resume functionality to the RFBI driver along with missing callback functions needed by OMAP Frame buffer.
>
> Signed-off-by: Mikkel Christensen <mlc@ti.com>
> ---
> drivers/video/omap2/dss/rfbi.c | 76 ++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 76 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/video/omap2/dss/rfbi.c b/drivers/video/omap2/dss/rfbi.c
> index 9dd2349..ddfc472 100644
> --- a/drivers/video/omap2/dss/rfbi.c
> +++ b/drivers/video/omap2/dss/rfbi.c
> @@ -1181,6 +1181,7 @@ int rfbi_init(void)
>
> /* Enable autoidle and smart-idle */
> l = rfbi_read_reg(RFBI_SYSCONFIG);
> + l &= ~((0x03 << 3)|(0x01 << 0));
> l |= (1 << 0) | (2 << 3);
> rfbi_write_reg(RFBI_SYSCONFIG, l);
>
> @@ -1208,6 +1209,9 @@ static int rfbi_display_update(struct omap_dss_device *dssdev,
> {
> int rfbi_module;
>
> + if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
> + return 0;
> +
> if (w == 0 || h == 0)
> return 0;
>
> @@ -1239,6 +1243,18 @@ static int rfbi_display_enable_te(struct omap_dss_device *dssdev, bool enable)
> return 0;
> }
>
> +static enum omap_dss_update_mode rfbi_display_get_update_mode(
> + struct omap_dss_device *dssdev)
> +{
> + return OMAP_DSS_UPDATE_MANUAL;
> +}
> +
> +static int rfbi_display_set_update_mode(struct omap_dss_device *dssdev,
> + enum omap_dss_update_mode mode)
> +{
> + return 0;
> +}
> +
> static int rfbi_display_enable(struct omap_dss_device *dssdev)
> {
> int r;
> @@ -1269,6 +1285,7 @@ static int rfbi_display_enable(struct omap_dss_device *dssdev)
> rfbi_set_timings(dssdev->phy.rfbi.channel,
> &dssdev->ctrl.rfbi_timings);
>
> + dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
>
> if (dssdev->driver->enable) {
> r = dssdev->driver->enable(dssdev);
> @@ -1288,12 +1305,67 @@ err0:
>
> static void rfbi_display_disable(struct omap_dss_device *dssdev)
> {
> + dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
> +
> dssdev->driver->disable(dssdev);
> omap_dispc_unregister_isr(framedone_callback, NULL,
> DISPC_IRQ_FRAMEDONE);
> omap_dss_stop_device(dssdev);
> }
>
> +static int rfbi_display_suspend(struct omap_dss_device *dssdev)
> +{
> + unsigned long l;
> +
> + if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
> + return -EINVAL;
> +
> + DSSDBG("rfbi_display_suspend\n");
> +
> + if (dssdev->driver->suspend)
> + dssdev->driver->suspend(dssdev);
> +
> + dispc_enable_lcd_out(0);
I don't think this is needed. DSS hardware disables lcd_out when the
transfer has finished. Although for correct operation suspend() should
wait until the last transfer has been done before disabling clocks,
which is something it currently doesn't.
> +
> + /* Force idle */
> + rfbi_enable_clocks(1);
> + l = rfbi_read_reg(RFBI_SYSCONFIG);
> + l &= ~(0x03 << 3);
> + rfbi_write_reg(RFBI_SYSCONFIG, l);
> + rfbi_enable_clocks(0);
Why force idle?
> +
> + dssdev->state = OMAP_DSS_DISPLAY_SUSPENDED;
> +
> + return 0;
> +}
> +
> +static int rfbi_display_resume(struct omap_dss_device *dssdev)
> +{
> + unsigned long l;
> +
> + if (dssdev->state != OMAP_DSS_DISPLAY_SUSPENDED)
> + return -EINVAL;
> +
> + DSSDBG("rfbi_display_resume\n");
> +
> + /* Re-enable autoidle */
> + rfbi_enable_clocks(1);
> + l = rfbi_read_reg(RFBI_SYSCONFIG);
> + l &= ~(0x03 << 3);
> + l |= (0x02 << 3);
> + rfbi_write_reg(RFBI_SYSCONFIG, l);
> + rfbi_enable_clocks(0);
> +
> + dispc_enable_lcd_out(1);
This is not needed. lcd_out is enabled when the transfer is started.
> +
> + if (dssdev->driver->resume)
> + dssdev->driver->resume(dssdev);
> +
> + dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
> +
> + return 0;
> +}
> +
> int rfbi_init_display(struct omap_dss_device *dssdev)
> {
> dssdev->enable = rfbi_display_enable;
> @@ -1301,6 +1373,10 @@ int rfbi_init_display(struct omap_dss_device *dssdev)
> dssdev->update = rfbi_display_update;
> dssdev->sync = rfbi_display_sync;
> dssdev->enable_te = rfbi_display_enable_te;
> + dssdev->get_update_mode = rfbi_display_get_update_mode;
> + dssdev->set_update_mode = rfbi_display_set_update_mode;
> + dssdev->suspend = rfbi_display_suspend;
> + dssdev->resume = rfbi_display_resume;
>
> rfbi.dssdev[dssdev->phy.rfbi.channel] = dssdev;
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: [PATCH 1/1] OMAP: DSS2: RFBI driver update
2009-10-12 8:25 ` Tomi Valkeinen
@ 2009-10-12 14:03 ` Christensen, Mikkel
2009-10-12 14:17 ` Tomi Valkeinen
0 siblings, 1 reply; 7+ messages in thread
From: Christensen, Mikkel @ 2009-10-12 14:03 UTC (permalink / raw)
To: tomi.valkeinen@nokia.com; +Cc: linux-omap@vger.kernel.org
On Mon, Oct 12, 2009 at 03:25:27, Tomi Valkeinen wrote:
> Subject: Re: [PATCH 1/1] OMAP: DSS2: RFBI driver update
>
> On Fri, 2009-10-09 at 23:08 +0200, ext Mikkel Christensen wrote:
> > This patch adds suspend / resume functionality to the RFBI
> driver along with missing callback functions needed by OMAP Frame
> buffer.
> >
> > Signed-off-by: Mikkel Christensen <mlc@ti.com>
> > ---
> > drivers/video/omap2/dss/rfbi.c | 76
> ++++++++++++++++++++++++++++++++++++++++
> > 1 files changed, 76 insertions(+), 0 deletions(-)
> >
> > diff --git a/drivers/video/omap2/dss/rfbi.c
> > b/drivers/video/omap2/dss/rfbi.c index 9dd2349..ddfc472 100644
> > --- a/drivers/video/omap2/dss/rfbi.c
> > +++ b/drivers/video/omap2/dss/rfbi.c
> > @@ -1181,6 +1181,7 @@ int rfbi_init(void)
> >
> > /* Enable autoidle and smart-idle */
> > l = rfbi_read_reg(RFBI_SYSCONFIG);
> > + l &= ~((0x03 << 3)|(0x01 << 0));
> > l |= (1 << 0) | (2 << 3);
> > rfbi_write_reg(RFBI_SYSCONFIG, l);
> >
> > @@ -1208,6 +1209,9 @@ static int rfbi_display_update(struct
> > omap_dss_device *dssdev, {
> > int rfbi_module;
> >
> > + if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
> > + return 0;
> > +
> > if (w == 0 || h == 0)
> > return 0;
> >
> > @@ -1239,6 +1243,18 @@ static int
> rfbi_display_enable_te(struct omap_dss_device *dssdev, bool enable)
> > return 0;
> > }
> >
> > +static enum omap_dss_update_mode rfbi_display_get_update_mode(
> > + struct omap_dss_device *dssdev)
> > +{
> > + return OMAP_DSS_UPDATE_MANUAL;
> > +}
> > +
> > +static int rfbi_display_set_update_mode(struct
> omap_dss_device *dssdev,
> > + enum omap_dss_update_mode mode)
> > +{
> > + return 0;
> > +}
> > +
> > static int rfbi_display_enable(struct omap_dss_device *dssdev) {
> > int r;
> > @@ -1269,6 +1285,7 @@ static int rfbi_display_enable(struct
> omap_dss_device *dssdev)
> > rfbi_set_timings(dssdev->phy.rfbi.channel,
> > &dssdev->ctrl.rfbi_timings);
> >
> > + dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
> >
> > if (dssdev->driver->enable) {
> > r = dssdev->driver->enable(dssdev); @@ -1288,12
> +1305,67 @@ err0:
> >
> > static void rfbi_display_disable(struct omap_dss_device *dssdev) {
> > + dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
> > +
> > dssdev->driver->disable(dssdev);
> > omap_dispc_unregister_isr(framedone_callback, NULL,
> > DISPC_IRQ_FRAMEDONE);
> > omap_dss_stop_device(dssdev);
> > }
> >
> > +static int rfbi_display_suspend(struct omap_dss_device *dssdev) {
> > + unsigned long l;
> > +
> > + if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
> > + return -EINVAL;
> > +
> > + DSSDBG("rfbi_display_suspend\n");
> > +
> > + if (dssdev->driver->suspend)
> > + dssdev->driver->suspend(dssdev);
> > +
> > + dispc_enable_lcd_out(0);
>
> I don't think this is needed. DSS hardware disables lcd_out when the
> transfer has finished. Although for correct operation suspend() should
> wait until the last transfer has been done before disabling clocks,
> which is something it currently doesn't.
This was done with reference to the DPI and SDI files that do the same thing. It can be removed if not necessary.
> > +
> > + /* Force idle */
> > + rfbi_enable_clocks(1);
> > + l = rfbi_read_reg(RFBI_SYSCONFIG);
> > + l &= ~(0x03 << 3);
> > + rfbi_write_reg(RFBI_SYSCONFIG, l);
> > + rfbi_enable_clocks(0);
>
> Why force idle?
The RFBI module must be forced to idle on suspend to allow for the DSS module to idle. The CM_CLKSTST_DSS[CLKACTIVITY_DSS] bit does not change if the RFBI module was configured to autoidle, preventing DSS from entering retention or off.
> > +
> > + dssdev->state = OMAP_DSS_DISPLAY_SUSPENDED;
> > +
> > + return 0;
> > +}
> > +
> > +static int rfbi_display_resume(struct omap_dss_device *dssdev) {
> > + unsigned long l;
> > +
> > + if (dssdev->state != OMAP_DSS_DISPLAY_SUSPENDED)
> > + return -EINVAL;
> > +
> > + DSSDBG("rfbi_display_resume\n");
> > +
> > + /* Re-enable autoidle */
> > + rfbi_enable_clocks(1);
> > + l = rfbi_read_reg(RFBI_SYSCONFIG);
> > + l &= ~(0x03 << 3);
> > + l |= (0x02 << 3);
> > + rfbi_write_reg(RFBI_SYSCONFIG, l);
> > + rfbi_enable_clocks(0);
> > +
> > + dispc_enable_lcd_out(1);
>
> This is not needed. lcd_out is enabled when the transfer is started.
This was done with reference to the DPI and SDI files that do the same thing. It can be removed if not necessary.
> > +
> > + if (dssdev->driver->resume)
> > + dssdev->driver->resume(dssdev);
> > +
> > + dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
> > +
> > + return 0;
> > +}
> > +
> > int rfbi_init_display(struct omap_dss_device *dssdev) {
> > dssdev->enable = rfbi_display_enable; @@ -1301,6
> +1373,10 @@ int
> > rfbi_init_display(struct omap_dss_device *dssdev)
> > dssdev->update = rfbi_display_update;
> > dssdev->sync = rfbi_display_sync;
> > dssdev->enable_te = rfbi_display_enable_te;
> > + dssdev->get_update_mode = rfbi_display_get_update_mode;
> > + dssdev->set_update_mode = rfbi_display_set_update_mode;
> > + dssdev->suspend = rfbi_display_suspend;
> > + dssdev->resume = rfbi_display_resume;
> >
> > rfbi.dssdev[dssdev->phy.rfbi.channel] = dssdev;
> >
>
>
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: [PATCH 1/1] OMAP: DSS2: RFBI driver update
2009-10-12 14:03 ` Christensen, Mikkel
@ 2009-10-12 14:17 ` Tomi Valkeinen
2009-10-12 15:25 ` Christensen, Mikkel
0 siblings, 1 reply; 7+ messages in thread
From: Tomi Valkeinen @ 2009-10-12 14:17 UTC (permalink / raw)
To: ext Christensen, Mikkel; +Cc: linux-omap@vger.kernel.org
On Mon, 2009-10-12 at 16:03 +0200, ext Christensen, Mikkel wrote:
> On Mon, Oct 12, 2009 at 03:25:27, Tomi Valkeinen wrote:
> > Subject: Re: [PATCH 1/1] OMAP: DSS2: RFBI driver update
> >
> > On Fri, 2009-10-09 at 23:08 +0200, ext Mikkel Christensen wrote:
> > > This patch adds suspend / resume functionality to the RFBI
> > driver along with missing callback functions needed by OMAP Frame
> > buffer.
> > >
> > > Signed-off-by: Mikkel Christensen <mlc@ti.com>
> > > ---
> > > drivers/video/omap2/dss/rfbi.c | 76
> > ++++++++++++++++++++++++++++++++++++++++
> > > 1 files changed, 76 insertions(+), 0 deletions(-)
> > >
snip
> > > +static int rfbi_display_suspend(struct omap_dss_device *dssdev) {
> > > + unsigned long l;
> > > +
> > > + if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
> > > + return -EINVAL;
> > > +
> > > + DSSDBG("rfbi_display_suspend\n");
> > > +
> > > + if (dssdev->driver->suspend)
> > > + dssdev->driver->suspend(dssdev);
> > > +
> > > + dispc_enable_lcd_out(0);
> >
> > I don't think this is needed. DSS hardware disables lcd_out when the
> > transfer has finished. Although for correct operation suspend() should
> > wait until the last transfer has been done before disabling clocks,
> > which is something it currently doesn't.
>
> This was done with reference to the DPI and SDI files that do the same thing. It can be removed if not necessary.
DPI and SDI work quite differently than RFBI, you can't just copy their
functionality =).
It is more correct without disable/enable_lcd_out, but it's not correct
as there may be a transfer ongoing when suspend call comes. That's why
there should be some mechanism to wait until the transfer has been done.
DSI tries to do this (and hopefully correctly does =).
>
> > > +
> > > + /* Force idle */
> > > + rfbi_enable_clocks(1);
> > > + l = rfbi_read_reg(RFBI_SYSCONFIG);
> > > + l &= ~(0x03 << 3);
> > > + rfbi_write_reg(RFBI_SYSCONFIG, l);
> > > + rfbi_enable_clocks(0);
> >
> > Why force idle?
>
> The RFBI module must be forced to idle on suspend to allow for the DSS module to idle. The CM_CLKSTST_DSS[CLKACTIVITY_DSS] bit does not change if the RFBI module was configured to autoidle, preventing DSS from entering retention or off.
Why must it? Is there a hardware bug (what errata number?)?
Tomi
^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: [PATCH 1/1] OMAP: DSS2: RFBI driver update
2009-10-12 14:17 ` Tomi Valkeinen
@ 2009-10-12 15:25 ` Christensen, Mikkel
2009-10-13 7:56 ` Tomi Valkeinen
0 siblings, 1 reply; 7+ messages in thread
From: Christensen, Mikkel @ 2009-10-12 15:25 UTC (permalink / raw)
To: tomi.valkeinen@nokia.com; +Cc: linux-omap@vger.kernel.org
On Mon, Oct 12, 2009 at 09:17:27, Tomi Valkeinen wrote:
> Subject: RE: [PATCH 1/1] OMAP: DSS2: RFBI driver update
>
> On Mon, 2009-10-12 at 16:03 +0200, ext Christensen, Mikkel wrote:
> > On Mon, Oct 12, 2009 at 03:25:27, Tomi Valkeinen wrote:
> > > Subject: Re: [PATCH 1/1] OMAP: DSS2: RFBI driver update
> > >
> > > On Fri, 2009-10-09 at 23:08 +0200, ext Mikkel Christensen wrote:
> > > > This patch adds suspend / resume functionality to the RFBI
> > > driver along with missing callback functions needed by OMAP Frame
> > > buffer.
> > > >
> > > > Signed-off-by: Mikkel Christensen <mlc@ti.com>
> > > > ---
> > > > drivers/video/omap2/dss/rfbi.c | 76
> > > ++++++++++++++++++++++++++++++++++++++++
> > > > 1 files changed, 76 insertions(+), 0 deletions(-)
> > > >
>
> snip
>
> > > > +static int rfbi_display_suspend(struct omap_dss_device
> *dssdev) {
> > > > + unsigned long l;
> > > > +
> > > > + if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
> > > > + return -EINVAL;
> > > > +
> > > > + DSSDBG("rfbi_display_suspend\n");
> > > > +
> > > > + if (dssdev->driver->suspend)
> > > > + dssdev->driver->suspend(dssdev);
> > > > +
> > > > + dispc_enable_lcd_out(0);
> > >
> > > I don't think this is needed. DSS hardware disables
> lcd_out when the
> > > transfer has finished. Although for correct operation suspend()
> > > should wait until the last transfer has been done before
> disabling
> > > clocks, which is something it currently doesn't.
> >
> > This was done with reference to the DPI and SDI files that
> do the same thing. It can be removed if not necessary.
>
> DPI and SDI work quite differently than RFBI, you can't just copy
> their functionality =).
>
> It is more correct without disable/enable_lcd_out, but it's not
> correct as there may be a transfer ongoing when suspend call comes.
> That's why there should be some mechanism to wait until the transfer
> has been done.
> DSI tries to do this (and hopefully correctly does =).
OK. Thanks I will try to incorporate this. Where in the DSI driver is this mechanism implemented?
> >
> > > > +
> > > > + /* Force idle */
> > > > + rfbi_enable_clocks(1);
> > > > + l = rfbi_read_reg(RFBI_SYSCONFIG);
> > > > + l &= ~(0x03 << 3);
> > > > + rfbi_write_reg(RFBI_SYSCONFIG, l);
> > > > + rfbi_enable_clocks(0);
> > >
> > > Why force idle?
> >
> > The RFBI module must be forced to idle on suspend to allow
> for the DSS module to idle. The
> CM_CLKSTST_DSS[CLKACTIVITY_DSS] bit does not change if the RFBI module
> was configured to autoidle, preventing DSS from entering retention or
> off.
>
> Why must it? Is there a hardware bug (what errata number?)?
>
> Tomi
>
>
>
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: [PATCH 1/1] OMAP: DSS2: RFBI driver update
2009-10-12 15:25 ` Christensen, Mikkel
@ 2009-10-13 7:56 ` Tomi Valkeinen
0 siblings, 0 replies; 7+ messages in thread
From: Tomi Valkeinen @ 2009-10-13 7:56 UTC (permalink / raw)
To: ext Christensen, Mikkel; +Cc: linux-omap@vger.kernel.org
On Mon, 2009-10-12 at 17:25 +0200, ext Christensen, Mikkel wrote:
> On Mon, Oct 12, 2009 at 09:17:27, Tomi Valkeinen wrote:
> > Subject: RE: [PATCH 1/1] OMAP: DSS2: RFBI driver update
> >
> > On Mon, 2009-10-12 at 16:03 +0200, ext Christensen, Mikkel wrote:
> > > On Mon, Oct 12, 2009 at 03:25:27, Tomi Valkeinen wrote:
> > > > Subject: Re: [PATCH 1/1] OMAP: DSS2: RFBI driver update
> > > >
> > > > On Fri, 2009-10-09 at 23:08 +0200, ext Mikkel Christensen wrote:
> > > > > This patch adds suspend / resume functionality to the RFBI
> > > > driver along with missing callback functions needed by OMAP Frame
> > > > buffer.
> > > > >
> > > > > Signed-off-by: Mikkel Christensen <mlc@ti.com>
> > > > > ---
> > > > > drivers/video/omap2/dss/rfbi.c | 76
> > > > ++++++++++++++++++++++++++++++++++++++++
> > > > > 1 files changed, 76 insertions(+), 0 deletions(-)
> > > > >
> >
> > snip
> >
> > > > > +static int rfbi_display_suspend(struct omap_dss_device
> > *dssdev) {
> > > > > + unsigned long l;
> > > > > +
> > > > > + if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
> > > > > + return -EINVAL;
> > > > > +
> > > > > + DSSDBG("rfbi_display_suspend\n");
> > > > > +
> > > > > + if (dssdev->driver->suspend)
> > > > > + dssdev->driver->suspend(dssdev);
> > > > > +
> > > > > + dispc_enable_lcd_out(0);
> > > >
> > > > I don't think this is needed. DSS hardware disables
> > lcd_out when the
> > > > transfer has finished. Although for correct operation suspend()
> > > > should wait until the last transfer has been done before
> > disabling
> > > > clocks, which is something it currently doesn't.
> > >
> > > This was done with reference to the DPI and SDI files that
> > do the same thing. It can be removed if not necessary.
> >
> > DPI and SDI work quite differently than RFBI, you can't just copy
> > their functionality =).
> >
> > It is more correct without disable/enable_lcd_out, but it's not
> > correct as there may be a transfer ongoing when suspend call comes.
> > That's why there should be some mechanism to wait until the transfer
> > has been done.
> > DSI tries to do this (and hopefully correctly does =).
>
> OK. Thanks I will try to incorporate this. Where in the DSI driver is this mechanism implemented?
It's the dsi_bus_lock mechanism. But it doesn't work as such for RFBI,
because the DSI uses a bit different mechanism for updates. But somehow
the suspend function needs to wait until the transfer has been
completed, and suspend only after that (and also make sure that no new
transfer starts before the suspend).
Tomi
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/1] OMAP: DSS2: RFBI driver update
2009-10-09 21:08 [PATCH 1/1] OMAP: DSS2: RFBI driver update Mikkel Christensen
2009-10-12 8:25 ` Tomi Valkeinen
@ 2009-10-13 18:38 ` Kevin Hilman
1 sibling, 0 replies; 7+ messages in thread
From: Kevin Hilman @ 2009-10-13 18:38 UTC (permalink / raw)
To: Mikkel Christensen; +Cc: tomi.valkeinen, linux-omap
Mikkel Christensen <mlc@ti.com> writes:
> This patch adds suspend / resume functionality to the RFBI driver along with missing callback functions needed by OMAP Frame buffer.
>
> Signed-off-by: Mikkel Christensen <mlc@ti.com>
> ---
> drivers/video/omap2/dss/rfbi.c | 76 ++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 76 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/video/omap2/dss/rfbi.c b/drivers/video/omap2/dss/rfbi.c
> index 9dd2349..ddfc472 100644
> --- a/drivers/video/omap2/dss/rfbi.c
> +++ b/drivers/video/omap2/dss/rfbi.c
> @@ -1181,6 +1181,7 @@ int rfbi_init(void)
>
> /* Enable autoidle and smart-idle */
> l = rfbi_read_reg(RFBI_SYSCONFIG);
> + l &= ~((0x03 << 3)|(0x01 << 0));
Please use symbolic names for these SYSCONFIG values. I realize you inherited
this from other drivers, but it should be fixed.
While you're at it, fixing the others would be nice too. You could do
a cleanup patch before your actual driver update.
Ideally, DSS needs to create an omap_hwmod, but in the meantime you could
use the defines from <mach/omap_hwmod.h>
> l |= (1 << 0) | (2 << 3);
> rfbi_write_reg(RFBI_SYSCONFIG, l);
>
> @@ -1208,6 +1209,9 @@ static int rfbi_display_update(struct omap_dss_device *dssdev,
> {
> int rfbi_module;
>
> + if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
> + return 0;
> +
> if (w == 0 || h == 0)
> return 0;
>
> @@ -1239,6 +1243,18 @@ static int rfbi_display_enable_te(struct omap_dss_device *dssdev, bool enable)
> return 0;
> }
>
> +static enum omap_dss_update_mode rfbi_display_get_update_mode(
> + struct omap_dss_device *dssdev)
> +{
> + return OMAP_DSS_UPDATE_MANUAL;
> +}
> +
> +static int rfbi_display_set_update_mode(struct omap_dss_device *dssdev,
> + enum omap_dss_update_mode mode)
> +{
> + return 0;
> +}
> +
> static int rfbi_display_enable(struct omap_dss_device *dssdev)
> {
> int r;
> @@ -1269,6 +1285,7 @@ static int rfbi_display_enable(struct omap_dss_device *dssdev)
> rfbi_set_timings(dssdev->phy.rfbi.channel,
> &dssdev->ctrl.rfbi_timings);
>
> + dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
>
> if (dssdev->driver->enable) {
> r = dssdev->driver->enable(dssdev);
> @@ -1288,12 +1305,67 @@ err0:
>
> static void rfbi_display_disable(struct omap_dss_device *dssdev)
> {
> + dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
> +
> dssdev->driver->disable(dssdev);
> omap_dispc_unregister_isr(framedone_callback, NULL,
> DISPC_IRQ_FRAMEDONE);
> omap_dss_stop_device(dssdev);
> }
>
> +static int rfbi_display_suspend(struct omap_dss_device *dssdev)
> +{
> + unsigned long l;
> +
> + if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
> + return -EINVAL;
> +
> + DSSDBG("rfbi_display_suspend\n");
> +
> + if (dssdev->driver->suspend)
> + dssdev->driver->suspend(dssdev);
> +
> + dispc_enable_lcd_out(0);
> +
> + /* Force idle */
> + rfbi_enable_clocks(1);
> + l = rfbi_read_reg(RFBI_SYSCONFIG);
> + l &= ~(0x03 << 3);
Again, use SYSC_SIDLEMODE_SHIFT, SYSC_SIDLEMODE_MASK.
More of these follow.
Kevin
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2009-10-13 18:38 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-10-09 21:08 [PATCH 1/1] OMAP: DSS2: RFBI driver update Mikkel Christensen
2009-10-12 8:25 ` Tomi Valkeinen
2009-10-12 14:03 ` Christensen, Mikkel
2009-10-12 14:17 ` Tomi Valkeinen
2009-10-12 15:25 ` Christensen, Mikkel
2009-10-13 7:56 ` Tomi Valkeinen
2009-10-13 18:38 ` Kevin Hilman
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox