On Thu, 2012-08-30 at 17:10 +0530, Archit Taneja wrote:
> The display sysfs attribute's store function needs to be changed with the
> introduction of outputs.
> 
> Providing a manager to the display isn't enough to create a link now, the
> manager needs and output to connect to. A manager's display store file only
> has the information of the manager and the desired display, it is not aware
> of which output should the manager connect to.
> 
> Because of this, a new constraint needs to be set up when setting a display 
> via
> this sysfs file. The constraint is that the desired display should already be
> connected to an output before calling this sysfs function.
> 
> This might break some existing user space stuff which uses sysfs directly. But
> in most cases dss_recheck_connections will connect displays to floating 
> outputs.
> DSS sysfs files are being planned to be remove anyway, so it's not much of a
> harm.
> 
> Signed-off-by: Archit Taneja <[email protected]>
> ---
>  drivers/video/omap2/dss/manager.c |   25 ++++++++++++++++++++-----
>  1 file changed, 20 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/video/omap2/dss/manager.c 
> b/drivers/video/omap2/dss/manager.c
> index fd39f66..d808ce2 100644
> --- a/drivers/video/omap2/dss/manager.c
> +++ b/drivers/video/omap2/dss/manager.c
> @@ -74,18 +74,33 @@ static ssize_t manager_display_store(struct 
> omap_overlay_manager *mgr,
>       if (dssdev)
>               DSSDBG("display %s found\n", dssdev->name);
>  
> -     if (mgr->get_device(mgr)) {
> -             r = mgr->unset_device(mgr);
> +     if (mgr->output) {
> +             if (mgr->output->device) {
> +                     r = mgr->output->unset_device(mgr->output);
> +                     if (r) {
> +                             goto put_device;
> +                             DSSERR("failed to unset device from output\n");
> +                     }
> +             }
> +
> +             r = mgr->unset_output(mgr);
>               if (r) {
> -                     DSSERR("failed to unset display\n");
> +                     DSSERR("failed to unset current output\n");
>                       goto put_device;
>               }
>       }
>  
>       if (dssdev) {
> -             r = mgr->set_device(mgr, dssdev);
> +             struct omap_dss_output *out = dssdev->output;
> +
> +             if (!out) {
> +                     DSSERR("no output connected to device\n");
> +                     goto put_device;
> +             }
> +
> +             r = mgr->set_output(mgr, out);
>               if (r) {
> -                     DSSERR("failed to set manager\n");
> +                     DSSERR("failed to set manager output\n");
>                       goto put_device;
>               }
>  

Hmm, I think this is a bit broken. If I read this right, the unlinking
removes both mgr-output link and the output-dssdev link. But the linking
part only sets up the mgr-output link.

So if there's a very simple configuration with one display, if you
unlink it via sysfs you can't link it back again.

The store function gets the mgr and the dssdev as arguments. I think
this could be changed so that the function would "guess" the needed
output. Well, not so much a guess, because a dssdev can only be
connected to one output, defined by the HW design. That is basically
what the recheck_connections does, we could use the same method here.

Then this sysfs file should work just like before.

 Tomi

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to