All of lore.kernel.org
 help / color / mirror / Atom feed
From: wmb@firmworks.com (Mitch Bradley)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH] ARM: vexpress: initial device tree support
Date: Tue, 10 Jan 2012 20:43:28 -1000	[thread overview]
Message-ID: <4F0D2F90.8020801@firmworks.com> (raw)
In-Reply-To: <4F0CD7BC.7080409@freescale.com>

On 1/10/2012 2:28 PM, Timur Tabi wrote:
> Mitch Bradley wrote:
>> It seems to me that having the framebuffer driver handle the EDID
>> "driver" function is exactly the right thing.  The framebuffer driver is
>> the only thing that cares about EDID information.  Given a phandle
>> reference to an I2C interface, the "driver" is just "call the I2C read
>> routine" - plus, in your case, toggling the GPIO pin.
>
> Do you think I should have the I2C probe function read the EDID data, and then store it in some global variable?

I think that would not be a good design.  Presence and location of EDID 
data is not something that a generic I2C driver should know.  It's the 
video controller that knows that EDID exists, where it is located 
(device ID 0x50 and addresses within that device), and what it means.

>  That won't work if I have multiple video controllers, since I won't know which EDID data goes with which video controller.  I tried adding a call to i2c_add_driver() in my framebuffer driver, but the I2C probe function was called *after* the framebuffer's probe function, so that doesn't help me.

Then there needs to be some sort of ordering or dependency to ensure 
that the I2C driver is activated before the framebuffer driver tries to 
use it.

>
>> That GPIO pin thing is annoying, but not sufficiently complex or common
>> that it warrants having a separate EDID driver.  You could define a
>> platform-specific property to tell your framebuffer driver that it needs
>> to do that GPIO thing.  It's a hack, but the GPIO thing is inherently a
>> hack, so there will be some ugliness somewhere as a result.
>
> I have two platform-specific functions, "enabled_edid" and "disable_edid", that I call before/after calling fb_ddc_read().  This seems to work well, and I already have a mechanism for calling platform-specific functions from the framebuffer driver.
>
> However, Stephen Warren said I should be using the I2C mux feature instead.
>

I2C mux is a plausible solution, as is your enable/disable thing.  At 
some level they are equivalent.  I2C mux is a formalization of your 
solution, in which the mux device's select method must be written to 
perform the function of your enable/disable edid functions.

Either way, you need platform-dependent functions to do the switching, 
and you need to select the appropriate channel.  Personally, I don't see 
the advantage of using the mux device in this case.  It's just adding 
complexity with no payback.  If there were several channels that needed 
to be accessed in an interspersed fashion, the mux device would  be much 
cleaner.  But in this case, there is a single "back channel" that only 
needs to be accessed once and can subsequently be ignored.  The video 
driver can grab a lock, call enable_edid(), read out the EDID data into 
an array, call disable_edid(), release the lock, and that is it.  The 
other users of that I2C bus can ignore the hidden EDID.

But, as I said, either way is okay.  They are pretty much equivalent at 
a fundamental level.  You must have the platform-dependent function to 
do the switching, and you must have a reference to an underlying I2C 
bus.  If you go the mux route, every other user of that I2C bus must 
also use the mux device, selecting the other channel.  That propagates 
the knowledge of this "hidden" EDID ROM farther than it would otherwise 
have to go.  It probably also means you would want a device node to 
represent the fact that the I2C bus is muxed, to instantiate the i2c_mux 
driver.  I think that doing a binding for i2c_mux is a can of worms, 
because of the need to represent the platform-dependent "how to select" 
functionality.

WARNING: multiple messages have this Message-ID (diff)
From: Mitch Bradley <wmb-D5eQfiDGL7eakBO8gow8eQ@public.gmane.org>
To: Timur Tabi <timur-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
Cc: "Paweł Moll" <Pawel.Moll-5wv7dgnIgG8@public.gmane.org>,
	"patches-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org"
	<patches-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>,
	"devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org"
	<devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org>,
	"Jamie Lokier" <jamie-yetKDKU6eevNLxjTenLetw@public.gmane.org>,
	"Rob Herring"
	<rob.herring-CfjtxxwdHycX+EX/Zwu52A@public.gmane.org>,
	"linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org"
	<linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org>
Subject: Re: [PATCH] ARM: vexpress: initial device tree support
Date: Tue, 10 Jan 2012 20:43:28 -1000	[thread overview]
Message-ID: <4F0D2F90.8020801@firmworks.com> (raw)
In-Reply-To: <4F0CD7BC.7080409-KZfg59tc24xl57MIdRCFDg@public.gmane.org>

On 1/10/2012 2:28 PM, Timur Tabi wrote:
> Mitch Bradley wrote:
>> It seems to me that having the framebuffer driver handle the EDID
>> "driver" function is exactly the right thing.  The framebuffer driver is
>> the only thing that cares about EDID information.  Given a phandle
>> reference to an I2C interface, the "driver" is just "call the I2C read
>> routine" - plus, in your case, toggling the GPIO pin.
>
> Do you think I should have the I2C probe function read the EDID data, and then store it in some global variable?

I think that would not be a good design.  Presence and location of EDID 
data is not something that a generic I2C driver should know.  It's the 
video controller that knows that EDID exists, where it is located 
(device ID 0x50 and addresses within that device), and what it means.

>  That won't work if I have multiple video controllers, since I won't know which EDID data goes with which video controller.  I tried adding a call to i2c_add_driver() in my framebuffer driver, but the I2C probe function was called *after* the framebuffer's probe function, so that doesn't help me.

Then there needs to be some sort of ordering or dependency to ensure 
that the I2C driver is activated before the framebuffer driver tries to 
use it.

>
>> That GPIO pin thing is annoying, but not sufficiently complex or common
>> that it warrants having a separate EDID driver.  You could define a
>> platform-specific property to tell your framebuffer driver that it needs
>> to do that GPIO thing.  It's a hack, but the GPIO thing is inherently a
>> hack, so there will be some ugliness somewhere as a result.
>
> I have two platform-specific functions, "enabled_edid" and "disable_edid", that I call before/after calling fb_ddc_read().  This seems to work well, and I already have a mechanism for calling platform-specific functions from the framebuffer driver.
>
> However, Stephen Warren said I should be using the I2C mux feature instead.
>

I2C mux is a plausible solution, as is your enable/disable thing.  At 
some level they are equivalent.  I2C mux is a formalization of your 
solution, in which the mux device's select method must be written to 
perform the function of your enable/disable edid functions.

Either way, you need platform-dependent functions to do the switching, 
and you need to select the appropriate channel.  Personally, I don't see 
the advantage of using the mux device in this case.  It's just adding 
complexity with no payback.  If there were several channels that needed 
to be accessed in an interspersed fashion, the mux device would  be much 
cleaner.  But in this case, there is a single "back channel" that only 
needs to be accessed once and can subsequently be ignored.  The video 
driver can grab a lock, call enable_edid(), read out the EDID data into 
an array, call disable_edid(), release the lock, and that is it.  The 
other users of that I2C bus can ignore the hidden EDID.

But, as I said, either way is okay.  They are pretty much equivalent at 
a fundamental level.  You must have the platform-dependent function to 
do the switching, and you must have a reference to an underlying I2C 
bus.  If you go the mux route, every other user of that I2C bus must 
also use the mux device, selecting the other channel.  That propagates 
the knowledge of this "hidden" EDID ROM farther than it would otherwise 
have to go.  It probably also means you would want a device node to 
represent the fact that the I2C bus is muxed, to instantiate the i2c_mux 
driver.  I think that doing a binding for i2c_mux is a can of worms, 
because of the need to represent the platform-dependent "how to select" 
functionality.

  reply	other threads:[~2012-01-11  6:43 UTC|newest]

Thread overview: 82+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-09-21  9:19 [PATCH] ARM: vexpress: initial device tree support Dave Martin
2011-09-21  9:19 ` Dave Martin
2011-09-21 13:24 ` Rob Herring
2011-09-21 13:24   ` Rob Herring
2011-09-21 14:24   ` Dave Martin
2011-09-21 14:24     ` Dave Martin
2011-09-21 14:33     ` Pawel Moll
2011-09-21 14:33       ` Pawel Moll
2011-09-21 15:49       ` Dave Martin
2011-09-21 15:49         ` Dave Martin
2011-09-21 14:57   ` Grant Likely
2011-09-21 14:57     ` Grant Likely
2011-09-21 16:01     ` Pawel Moll
2011-09-21 16:01       ` Pawel Moll
2011-09-21 16:17       ` Dave Martin
2011-09-21 16:17         ` Dave Martin
2011-09-21 16:28         ` Pawel Moll
2011-09-21 16:28           ` Pawel Moll
2011-09-21 16:37     ` Rob Herring
2011-09-21 16:37       ` Rob Herring
2011-09-21 17:15       ` Dave Martin
2011-09-21 17:15         ` Dave Martin
2011-09-21 17:47         ` Mitch Bradley
2011-09-21 17:47           ` Mitch Bradley
2011-09-22 12:19           ` Dave Martin
2011-09-22 12:19             ` Dave Martin
2012-01-09 23:26 ` Tabi Timur-B04825
2012-01-09 23:26   ` Tabi Timur-B04825
2012-01-10  0:42   ` Mitch Bradley
2012-01-10  0:42     ` Mitch Bradley
2012-01-10  2:24     ` Tabi Timur-B04825
2012-01-10  2:24       ` Tabi Timur-B04825
2012-01-10 12:22     ` Jamie Lokier
2012-01-10 12:22       ` Jamie Lokier
2012-01-10 21:58       ` Timur Tabi
2012-01-10 21:58         ` Timur Tabi
2012-01-10 22:35         ` Mitch Bradley
2012-01-10 22:35           ` Mitch Bradley
2012-01-10 23:55           ` Stephen Warren
2012-01-10 23:55             ` Stephen Warren
2012-01-11  0:02             ` Timur Tabi
2012-01-11  0:02               ` Timur Tabi
2012-01-11  0:28           ` Timur Tabi
2012-01-11  0:28             ` Timur Tabi
2012-01-11  6:43             ` Mitch Bradley [this message]
2012-01-11  6:43               ` Mitch Bradley
2012-01-11 20:17               ` Timur Tabi
2012-01-11 20:17                 ` Timur Tabi
2012-01-11 23:20                 ` Mitch Bradley
2012-01-11 23:20                   ` Mitch Bradley
2012-01-11 23:32                   ` Timur Tabi
2012-01-11 23:32                     ` Timur Tabi
2012-01-11 20:29               ` Stephen Warren
2012-01-11 20:29                 ` Stephen Warren
2012-01-11 20:32                 ` Timur Tabi
2012-01-11 20:32                   ` Timur Tabi
2012-01-11 20:36                   ` Stephen Warren
2012-01-11 20:36                     ` Stephen Warren
2012-01-11 21:37                     ` Timur Tabi
2012-01-11 21:37                       ` Timur Tabi
2012-01-11 21:57                       ` Stephen Warren
2012-01-11 21:57                         ` Stephen Warren
2012-01-12 12:24                     ` Jamie Lokier
2012-01-12 12:24                       ` Jamie Lokier
2012-01-12 16:49                       ` Stephen Warren
2012-01-12 16:49                         ` Stephen Warren
2012-01-11 23:16                 ` Mitch Bradley
2012-01-11 23:16                   ` Mitch Bradley
2012-01-12  0:15                   ` Stephen Warren
2012-01-12  0:15                     ` Stephen Warren
2012-01-12  0:38                     ` Mitch Bradley
2012-01-12  0:38                       ` Mitch Bradley
2012-01-12  0:47                       ` Mitch Bradley
2012-01-12  0:47                         ` Mitch Bradley
2012-01-12 16:45                       ` Stephen Warren
2012-01-12 16:45                         ` Stephen Warren
2012-01-12 12:09                     ` Jamie Lokier
2012-01-12 12:09                       ` Jamie Lokier
2012-01-12 16:52                       ` Stephen Warren
2012-01-12 16:52                         ` Stephen Warren
2012-01-10 11:04   ` Dave Martin
2012-01-10 11:04     ` Dave Martin

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=4F0D2F90.8020801@firmworks.com \
    --to=wmb@firmworks.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /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.