All of lore.kernel.org
 help / color / mirror / Atom feed
* Non-enumerable devices on USB and other enumerable buses
@ 2013-08-11 19:08 Mark Brown
  2013-08-11 22:08 ` Grant Likely
                   ` (2 more replies)
  0 siblings, 3 replies; 54+ messages in thread
From: Mark Brown @ 2013-08-11 19:08 UTC (permalink / raw)
  To: Rob Herring, Pawel Moll, Mark Rutland, Stephen Warren,
	Ian Campbell, Felipe Balbi, Greg Kroah-Hartman, Grant Likely
  Cc: devicetree, linux-usb, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 1665 bytes --]

Looking at the enumerable buses in the kernel I don't see any which have
real support for any kind of registration of devices prior to their
enumeration.  Similarly currently all the DT bindings in the kernel I've
been able to notice cover only non-enumerable buses.  This generally
makes sense where enumerable buses are used in standard fashions since
the binding would be at best redundant and at worst inaccurate.  However
there are often corner cases in embedded systems where hardware has been
hooked up outside of the normal enumeration mechanisms, for example with
software power control or extra signals wired.

One example that's bugging me right now is that on the Insignal Arndale
platform there's a USB hub connected to one of the USB ports on the SoC
(not as a PHY, it seems we also need the internal PHY running to talk to
the device).  The hub needs to be "plugged" into the SoC after the SoC
USB controller has started with some GPIOs so we need to tell the system
that the hub exists and needs to be synchronised with the USB controller.

Another case that's going to be problematic once it's in mainline is
Slimbus - this is a bus used in some embedded audio subsystems which is
enumerable in a similar manner to USB but where the devices on the bus
are normally powered up only on demand (causing them to hotplug when
used and unplug when idle) and have at least interrupt lines wired to
the SoC using a normal interrupt outside the enumerable bus.

I know there's been some discussion of this topic but do we have any
general consensus on how to handle such things both from a Linux driver
model point of view and from a DT/ACPI point of view?

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-11 19:08 Non-enumerable devices on USB and other enumerable buses Mark Brown
@ 2013-08-11 22:08 ` Grant Likely
  2013-08-12 14:41   ` Mark Brown
  2013-08-12  1:53 ` Alan Stern
  2013-08-12  2:02 ` Greg Kroah-Hartman
  2 siblings, 1 reply; 54+ messages in thread
From: Grant Likely @ 2013-08-11 22:08 UTC (permalink / raw)
  To: Mark Brown
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Stephen Warren,
	Ian Campbell, Felipe Balbi, Greg Kroah-Hartman, devicetree,
	Linux USB list, Linux Kernel Mailing List

On Sun, Aug 11, 2013 at 8:08 PM, Mark Brown <broonie@kernel.org> wrote:
> I know there's been some discussion of this topic but do we have any
> general consensus on how to handle such things both from a Linux driver
> model point of view and from a DT/ACPI point of view?

There is precedence for describing enumerated device in the device
tree. Real OpenFirmware platforms can and will enumerate the PCI and
USB busses and pass a full tree to the OS. I don't think we want to
full enumerating like that with either ACPI or FDT, but we could allow
for sparse population of devices when something is fixed like a
soldered down USB hub or USB Ethernet MAC.

To make it work would probably require a hook in the USB enumeration
path to look for matching nodes in DT/ACPI and attach it to the struct
device.

g.

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-11 19:08 Non-enumerable devices on USB and other enumerable buses Mark Brown
  2013-08-11 22:08 ` Grant Likely
@ 2013-08-12  1:53 ` Alan Stern
  2013-08-12  9:51   ` Mark Brown
  2013-08-12  2:02 ` Greg Kroah-Hartman
  2 siblings, 1 reply; 54+ messages in thread
From: Alan Stern @ 2013-08-12  1:53 UTC (permalink / raw)
  To: Mark Brown
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Stephen Warren,
	Ian Campbell, Felipe Balbi, Greg Kroah-Hartman, Grant Likely,
	devicetree, linux-usb, linux-kernel

On Sun, 11 Aug 2013, Mark Brown wrote:

> Looking at the enumerable buses in the kernel I don't see any which have
> real support for any kind of registration of devices prior to their
> enumeration.  Similarly currently all the DT bindings in the kernel I've
> been able to notice cover only non-enumerable buses.  This generally
> makes sense where enumerable buses are used in standard fashions since
> the binding would be at best redundant and at worst inaccurate.  However
> there are often corner cases in embedded systems where hardware has been
> hooked up outside of the normal enumeration mechanisms, for example with
> software power control or extra signals wired.
> 
> One example that's bugging me right now is that on the Insignal Arndale
> platform there's a USB hub connected to one of the USB ports on the SoC
> (not as a PHY, it seems we also need the internal PHY running to talk to
> the device).  The hub needs to be "plugged" into the SoC after the SoC
> USB controller has started with some GPIOs so we need to tell the system
> that the hub exists and needs to be synchronised with the USB controller.

On the surface, this seems like a particularly simple case.  Why wait 
until the SoC's USB controller has started?  Why not "plug in" the hub 
via the GPIOs right from the beginning?

> Another case that's going to be problematic once it's in mainline is
> Slimbus - this is a bus used in some embedded audio subsystems which is
> enumerable in a similar manner to USB but where the devices on the bus
> are normally powered up only on demand (causing them to hotplug when
> used and unplug when idle) and have at least interrupt lines wired to
> the SoC using a normal interrupt outside the enumerable bus.

That is indeed more difficult, because it requires geniune cooperation 
between the bus and platform subsystems.

> I know there's been some discussion of this topic but do we have any
> general consensus on how to handle such things both from a Linux driver
> model point of view and from a DT/ACPI point of view?

The discussion involved some sort of pattern matching based on the
device name and the bus, but nothing was ever settled.

Alan Stern


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-11 19:08 Non-enumerable devices on USB and other enumerable buses Mark Brown
  2013-08-11 22:08 ` Grant Likely
  2013-08-12  1:53 ` Alan Stern
@ 2013-08-12  2:02 ` Greg Kroah-Hartman
  2013-08-12 11:23   ` Mark Brown
  2 siblings, 1 reply; 54+ messages in thread
From: Greg Kroah-Hartman @ 2013-08-12  2:02 UTC (permalink / raw)
  To: Mark Brown
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Stephen Warren,
	Ian Campbell, Felipe Balbi, Grant Likely, devicetree, linux-usb,
	linux-kernel

On Sun, Aug 11, 2013 at 08:08:26PM +0100, Mark Brown wrote:
> Looking at the enumerable buses in the kernel I don't see any which have
> real support for any kind of registration of devices prior to their
> enumeration.  Similarly currently all the DT bindings in the kernel I've
> been able to notice cover only non-enumerable buses.  This generally
> makes sense where enumerable buses are used in standard fashions since
> the binding would be at best redundant and at worst inaccurate.  However
> there are often corner cases in embedded systems where hardware has been
> hooked up outside of the normal enumeration mechanisms, for example with
> software power control or extra signals wired.

Not just "embedded", the Macbooks have this same issue as well I'm
pretty sure, it's just that we don't know where those GPIOs are in order
to be able to use them...

> One example that's bugging me right now is that on the Insignal Arndale
> platform there's a USB hub connected to one of the USB ports on the SoC
> (not as a PHY, it seems we also need the internal PHY running to talk to
> the device).  The hub needs to be "plugged" into the SoC after the SoC
> USB controller has started with some GPIOs so we need to tell the system
> that the hub exists and needs to be synchronised with the USB controller.
> 
> Another case that's going to be problematic once it's in mainline is
> Slimbus - this is a bus used in some embedded audio subsystems which is
> enumerable in a similar manner to USB but where the devices on the bus
> are normally powered up only on demand (causing them to hotplug when
> used and unplug when idle) and have at least interrupt lines wired to
> the SoC using a normal interrupt outside the enumerable bus.
> 
> I know there's been some discussion of this topic but do we have any
> general consensus on how to handle such things both from a Linux driver
> model point of view and from a DT/ACPI point of view?

As these are usually bus-specific things, and really, platform-specific
things, I'd fall back and just recommend a "platform driver" that
"knows" about where these gpios are, and how/when to enable them, which
will cause the discoverable bus logic to kick in now that it notices a
device is present/removed.

Perhaps a semi-generic "platform" driver could be created, that knows
how to handle these settings in the DT, but odds are, that might be
difficult to make generic enough to cover a wide range of boards, but
without specifics, it's hard to tell.

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-12  1:53 ` Alan Stern
@ 2013-08-12  9:51   ` Mark Brown
  2013-08-12 11:07     ` Mark Rutland
  0 siblings, 1 reply; 54+ messages in thread
From: Mark Brown @ 2013-08-12  9:51 UTC (permalink / raw)
  To: Alan Stern
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Stephen Warren,
	Ian Campbell, Felipe Balbi, Greg Kroah-Hartman, Grant Likely,
	devicetree, linux-usb, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 1836 bytes --]

On Sun, Aug 11, 2013 at 09:53:01PM -0400, Alan Stern wrote:
> On Sun, 11 Aug 2013, Mark Brown wrote:

> > One example that's bugging me right now is that on the Insignal Arndale
> > platform there's a USB hub connected to one of the USB ports on the SoC
> > (not as a PHY, it seems we also need the internal PHY running to talk to
> > the device).  The hub needs to be "plugged" into the SoC after the SoC
> > USB controller has started with some GPIOs so we need to tell the system
> > that the hub exists and needs to be synchronised with the USB controller.

> On the surface, this seems like a particularly simple case.  Why wait 
> until the SoC's USB controller has started?  Why not "plug in" the hub 
> via the GPIOs right from the beginning?

I tried that, it doesn't seem to work - for some reason it seems that
the hub is only successfully enumerated if it starts after its parent is
running.  I don't know enough about USB to speculate on why that might
be, the GPIOs are brining the device out of reset not applying power or
anything.

> > Another case that's going to be problematic once it's in mainline is
> > Slimbus - this is a bus used in some embedded audio subsystems which is
> > enumerable in a similar manner to USB but where the devices on the bus
> > are normally powered up only on demand (causing them to hotplug when
> > used and unplug when idle) and have at least interrupt lines wired to
> > the SoC using a normal interrupt outside the enumerable bus.

> That is indeed more difficult, because it requires geniune cooperation 
> between the bus and platform subsystems.

Yeah.  You might want to do the same with for example a USB network
controller when you're in flight only mode, that seems to be one of the
more common reasons for doing this sort of thing with USB.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-12  9:51   ` Mark Brown
@ 2013-08-12 11:07     ` Mark Rutland
  2013-08-12 11:32       ` Mark Brown
  2013-08-12 18:08       ` Stephen Warren
  0 siblings, 2 replies; 54+ messages in thread
From: Mark Rutland @ 2013-08-12 11:07 UTC (permalink / raw)
  To: Mark Brown, Olof Johansson
  Cc: Alan Stern, rob.herring, Pawel Moll, Stephen Warren,
	Ian Campbell, Felipe Balbi, Greg Kroah-Hartman, grant.likely,
	devicetree, linux-usb, linux-kernel

[Adding Olof]

On Mon, Aug 12, 2013 at 10:51:36AM +0100, Mark Brown wrote:
> On Sun, Aug 11, 2013 at 09:53:01PM -0400, Alan Stern wrote:
> > On Sun, 11 Aug 2013, Mark Brown wrote:
> 
> > > One example that's bugging me right now is that on the Insignal Arndale
> > > platform there's a USB hub connected to one of the USB ports on the SoC
> > > (not as a PHY, it seems we also need the internal PHY running to talk to
> > > the device).  The hub needs to be "plugged" into the SoC after the SoC
> > > USB controller has started with some GPIOs so we need to tell the system
> > > that the hub exists and needs to be synchronised with the USB controller.
> 
> > On the surface, this seems like a particularly simple case.  Why wait 
> > until the SoC's USB controller has started?  Why not "plug in" the hub 
> > via the GPIOs right from the beginning?
> 
> I tried that, it doesn't seem to work - for some reason it seems that
> the hub is only successfully enumerated if it starts after its parent is
> running.  I don't know enough about USB to speculate on why that might
> be, the GPIOs are brining the device out of reset not applying power or
> anything.
> 
> > > Another case that's going to be problematic once it's in mainline is
> > > Slimbus - this is a bus used in some embedded audio subsystems which is
> > > enumerable in a similar manner to USB but where the devices on the bus
> > > are normally powered up only on demand (causing them to hotplug when
> > > used and unplug when idle) and have at least interrupt lines wired to
> > > the SoC using a normal interrupt outside the enumerable bus.
> 
> > That is indeed more difficult, because it requires geniune cooperation 
> > between the bus and platform subsystems.
> 
> Yeah.  You might want to do the same with for example a USB network
> controller when you're in flight only mode, that seems to be one of the
> more common reasons for doing this sort of thing with USB.

As I understand it, the wifi chip on the Snow Chromebook has a similar
issue -- it hangs off of a probeable SDIO bus, but needs a regulator
poked for it to turn on and become probeable (see
exynos_wifi_bt_set_power in [1]).

Thanks,
Mark.

[1] http://git.chromium.org/gitweb/?p=chromiumos/third_party/kernel.git;a=blob;f=arch/arm/mach-exynos/mach-exynos5-dt.c;h=d131241ea78b7d89df21e676e284ddfd369b4da0;hb=refs/heads/chromeos-3.4

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-12  2:02 ` Greg Kroah-Hartman
@ 2013-08-12 11:23   ` Mark Brown
  2013-08-12 20:50     ` Greg Kroah-Hartman
  0 siblings, 1 reply; 54+ messages in thread
From: Mark Brown @ 2013-08-12 11:23 UTC (permalink / raw)
  To: Greg Kroah-Hartman
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Stephen Warren,
	Ian Campbell, Felipe Balbi, Grant Likely, devicetree, linux-usb,
	linux-kernel

[-- Attachment #1: Type: text/plain, Size: 2343 bytes --]

On Sun, Aug 11, 2013 at 07:02:57PM -0700, Greg Kroah-Hartman wrote:
> On Sun, Aug 11, 2013 at 08:08:26PM +0100, Mark Brown wrote:

> > I know there's been some discussion of this topic but do we have any
> > general consensus on how to handle such things both from a Linux driver
> > model point of view and from a DT/ACPI point of view?

> As these are usually bus-specific things, and really, platform-specific

I don't think they're bus specific - the main issue with a lot of this
is that they're outside the infrastructure that the bus standardises so
we should have a general way of understanding this.  There will be bits
where the bus needs to get involved but the overall pattern is generic.

> things, I'd fall back and just recommend a "platform driver" that
> "knows" about where these gpios are, and how/when to enable them, which
> will cause the discoverable bus logic to kick in now that it notices a
> device is present/removed.

This doesn't work in general.  These things aren't really platform
specific at all, they're features of the devices that apply to any
system using them and while for some use cases (like WiFi and BT power)
an external thing that just manually applies power will be enough in
other cases we want to know about the device even while it's off and the
driver might be able to do extra things at runtime if it knows about for
example having some control over signals to the device.

For example in the Slimbus case we're normally talking about audio
CODECs.  In order to preserve the userspace API the device has to appear
to be present at all times, the driver will remember the settings the
user is making to be applied when it actually powers up and indeed the
powering up should be kicked off as a result of userspac acting on the
apparently present device.

Another example here (including USB devices) is interrupt signals wired
directly back to the processor, completely outside of the bus.

> Perhaps a semi-generic "platform" driver could be created, that knows
> how to handle these settings in the DT, but odds are, that might be
> difficult to make generic enough to cover a wide range of boards, but
> without specifics, it's hard to tell.

There's things like the rfkill stuff already, and the reset controller
on the way, but again this only covers a fairly small subset of the
issues.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-12 11:07     ` Mark Rutland
@ 2013-08-12 11:32       ` Mark Brown
  2013-08-12 18:08       ` Stephen Warren
  1 sibling, 0 replies; 54+ messages in thread
From: Mark Brown @ 2013-08-12 11:32 UTC (permalink / raw)
  To: Mark Rutland
  Cc: Olof Johansson, Alan Stern, rob.herring, Pawel Moll,
	Stephen Warren, Ian Campbell, Felipe Balbi, Greg Kroah-Hartman,
	grant.likely, devicetree, linux-usb, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 475 bytes --]

On Mon, Aug 12, 2013 at 12:07:14PM +0100, Mark Rutland wrote:

> As I understand it, the wifi chip on the Snow Chromebook has a similar
> issue -- it hangs off of a probeable SDIO bus, but needs a regulator
> poked for it to turn on and become probeable (see
> exynos_wifi_bt_set_power in [1]).

Yes, that's another example - this stuff is really common in practical
systems, especially the power control for radios since that's how rfkill
tends to end up being implemented.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-11 22:08 ` Grant Likely
@ 2013-08-12 14:41   ` Mark Brown
  0 siblings, 0 replies; 54+ messages in thread
From: Mark Brown @ 2013-08-12 14:41 UTC (permalink / raw)
  To: Grant Likely
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Stephen Warren,
	Ian Campbell, Felipe Balbi, Greg Kroah-Hartman, devicetree,
	Linux USB list, Linux Kernel Mailing List

[-- Attachment #1: Type: text/plain, Size: 876 bytes --]

On Sun, Aug 11, 2013 at 11:08:37PM +0100, Grant Likely wrote:

> full enumerating like that with either ACPI or FDT, but we could allow
> for sparse population of devices when something is fixed like a
> soldered down USB hub or USB Ethernet MAC.

I agree, there's no point in listing things that can be done
automatically - it's just introducing potential for error.

> To make it work would probably require a hook in the USB enumeration
> path to look for matching nodes in DT/ACPI and attach it to the struct
> device.

Yes, that was where I was heading too.  Have a mechanism for matching up
hotplugged devices with pre-registered ones which appear from firmware
or wherever if their IDs match.  It'd need some mechanism for drivers to
opt into being bound to devices that aren't physically there I think so
that normal drivers for enumerated devices don't get confused.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-12 11:07     ` Mark Rutland
  2013-08-12 11:32       ` Mark Brown
@ 2013-08-12 18:08       ` Stephen Warren
  2013-08-12 20:38         ` Mark Brown
  1 sibling, 1 reply; 54+ messages in thread
From: Stephen Warren @ 2013-08-12 18:08 UTC (permalink / raw)
  To: Mark Rutland
  Cc: Mark Brown, Olof Johansson, Alan Stern, rob.herring, Pawel Moll,
	Ian Campbell, Felipe Balbi, Greg Kroah-Hartman, grant.likely,
	devicetree, linux-usb, linux-kernel

On 08/12/2013 05:07 AM, Mark Rutland wrote:
> [Adding Olof]
> 
> On Mon, Aug 12, 2013 at 10:51:36AM +0100, Mark Brown wrote:
>> On Sun, Aug 11, 2013 at 09:53:01PM -0400, Alan Stern wrote:
>>> On Sun, 11 Aug 2013, Mark Brown wrote:
>>
>>>> One example that's bugging me right now is that on the Insignal Arndale
>>>> platform there's a USB hub connected to one of the USB ports on the SoC
>>>> (not as a PHY, it seems we also need the internal PHY running to talk to
>>>> the device).  The hub needs to be "plugged" into the SoC after the SoC
>>>> USB controller has started with some GPIOs so we need to tell the system
>>>> that the hub exists and needs to be synchronised with the USB controller.
...
> As I understand it, the wifi chip on the Snow Chromebook has a similar
> issue -- it hangs off of a probeable SDIO bus, but needs a regulator
> poked for it to turn on and become probeable (see
> exynos_wifi_bt_set_power in [1]).

In this case, I wonder if it makes sense to model the extra requirements
as part of the bus/socket/... itself rather than as part of the device
that's attached to the bus.

It seems quite common for SDIO-based WiFi devices to need a few things:
* Regulator
* 32KHz clock
* Enable GPIO (-> rfkill?)
* Perhaps a reset GPIO

Physically, these are provided to the socket into which the WiFi device
plugs in. Perhaps we should try to explicitly model the socket (which I
guess is really the SDIO bus in a way) rather than attaching these new
resources to the controller or the device itself.

In a similar way, I wonder if the USB case can be considered the same
way? This seems less like a good fit since I don't expect the resources
are always so similar there, and also there's the case of the bus being
potentially behind a few levels of USB hub.

And of course it all gets a little more messy when you get
board-specific logic that needs setup, rather than something more common
across multiple devices.

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-12 18:08       ` Stephen Warren
@ 2013-08-12 20:38         ` Mark Brown
  0 siblings, 0 replies; 54+ messages in thread
From: Mark Brown @ 2013-08-12 20:38 UTC (permalink / raw)
  To: Stephen Warren
  Cc: Mark Rutland, Olof Johansson, Alan Stern, rob.herring,
	Pawel Moll, Ian Campbell, Felipe Balbi, Greg Kroah-Hartman,
	grant.likely, devicetree@kernel.org, linux-usb, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 1123 bytes --]

On Mon, Aug 12, 2013 at 12:08:17PM -0600, Stephen Warren wrote:

> In a similar way, I wonder if the USB case can be considered the same
> way? This seems less like a good fit since I don't expect the resources
> are always so similar there, and also there's the case of the bus being
> potentially behind a few levels of USB hub.

That won't work for the hub on Arndale in a system where it's fully
wired up - it's got an I2C interface for control and the idea is that
you bring it out of reset, write the configuration out via I2C and then
you can complete startup using a GPIO or another I2C command.

> And of course it all gets a little more messy when you get
> board-specific logic that needs setup, rather than something more common
> across multiple devices.

I think we could probably cover many cases by putting common things onto
the bus but we still need to confront the cases where the device driver
really does need to get involved in what's going on.  Things like the
SDIO WiFi cards seem very interchangable as you say and would probably
benefit a lot but there's other applications that are less regular.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-12 11:23   ` Mark Brown
@ 2013-08-12 20:50     ` Greg Kroah-Hartman
  2013-08-12 21:40       ` Mark Brown
  0 siblings, 1 reply; 54+ messages in thread
From: Greg Kroah-Hartman @ 2013-08-12 20:50 UTC (permalink / raw)
  To: Mark Brown
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Stephen Warren,
	Ian Campbell, Felipe Balbi, Grant Likely, devicetree, linux-usb,
	linux-kernel

On Mon, Aug 12, 2013 at 12:23:44PM +0100, Mark Brown wrote:
> On Sun, Aug 11, 2013 at 07:02:57PM -0700, Greg Kroah-Hartman wrote:
> > On Sun, Aug 11, 2013 at 08:08:26PM +0100, Mark Brown wrote:
> 
> > > I know there's been some discussion of this topic but do we have any
> > > general consensus on how to handle such things both from a Linux driver
> > > model point of view and from a DT/ACPI point of view?
> 
> > As these are usually bus-specific things, and really, platform-specific
> 
> I don't think they're bus specific - the main issue with a lot of this
> is that they're outside the infrastructure that the bus standardises so
> we should have a general way of understanding this.  There will be bits
> where the bus needs to get involved but the overall pattern is generic.

The "pattern" is generic, yes, we've been dealing with that for well
over a decade now (pci hotplug controllers are "out of line" and control
when/if a PCI is device is added/removed.)

I'd argue that each bus needs special logic to handle this, just like
PCI hotplug did it with their hotplug controller logic.  Due to the
nature of this type of thing, it's all out-of-line hardware that is
custom to each device type / bus.

> > things, I'd fall back and just recommend a "platform driver" that
> > "knows" about where these gpios are, and how/when to enable them, which
> > will cause the discoverable bus logic to kick in now that it notices a
> > device is present/removed.
> 
> This doesn't work in general.  These things aren't really platform
> specific at all, they're features of the devices that apply to any
> system using them and while for some use cases (like WiFi and BT power)
> an external thing that just manually applies power will be enough in
> other cases we want to know about the device even while it's off and the
> driver might be able to do extra things at runtime if it knows about for
> example having some control over signals to the device.

No, the device isn't platform specific, but the logic needed to turn
on/off is platform specific, otherwise the device would "just work"
properly as the bus is self-discoverable.

Much like rfkill is, as you point out.  Those are all platform specific.

> For example in the Slimbus case we're normally talking about audio
> CODECs.  In order to preserve the userspace API the device has to appear
> to be present at all times, the driver will remember the settings the
> user is making to be applied when it actually powers up and indeed the
> powering up should be kicked off as a result of userspac acting on the
> apparently present device.

That's some horrible hardware, who thought of that?

> Another example here (including USB devices) is interrupt signals wired
> directly back to the processor, completely outside of the bus.

Like rfkill switches that just power on/off a USB device built onto the
laptop motherboard :)

> > Perhaps a semi-generic "platform" driver could be created, that knows
> > how to handle these settings in the DT, but odds are, that might be
> > difficult to make generic enough to cover a wide range of boards, but
> > without specifics, it's hard to tell.
> 
> There's things like the rfkill stuff already, and the reset controller
> on the way, but again this only covers a fairly small subset of the
> issues.

"small subset"?  How common is this type of thing?

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-12 20:50     ` Greg Kroah-Hartman
@ 2013-08-12 21:40       ` Mark Brown
  2013-08-13  1:04         ` Alan Stern
  0 siblings, 1 reply; 54+ messages in thread
From: Mark Brown @ 2013-08-12 21:40 UTC (permalink / raw)
  To: Greg Kroah-Hartman
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Stephen Warren,
	Ian Campbell, Felipe Balbi, Grant Likely, devicetree, linux-usb,
	linux-kernel

[-- Attachment #1: Type: text/plain, Size: 4256 bytes --]

On Mon, Aug 12, 2013 at 01:50:07PM -0700, Greg Kroah-Hartman wrote:
> On Mon, Aug 12, 2013 at 12:23:44PM +0100, Mark Brown wrote:

> > I don't think they're bus specific - the main issue with a lot of this
> > is that they're outside the infrastructure that the bus standardises so
> > we should have a general way of understanding this.  There will be bits
> > where the bus needs to get involved but the overall pattern is generic.

> The "pattern" is generic, yes, we've been dealing with that for well
> over a decade now (pci hotplug controllers are "out of line" and control
> when/if a PCI is device is added/removed.)

> I'd argue that each bus needs special logic to handle this, just like
> PCI hotplug did it with their hotplug controller logic.  Due to the
> nature of this type of thing, it's all out-of-line hardware that is
> custom to each device type / bus.

I agree that the bus will need some logic to handle this and I also
think Stephen is right that there are going to be some common patterns
for some device classes.  However I do think that this is a common
problem for pretty much all buses so we should be factoring out as much
as possible from the buses so they only have to deal with their bit of
things.  Most of the stuff that's worrying me is not anything the bus
should have any idea about beyond tunnelling the data to the device.

> > This doesn't work in general.  These things aren't really platform
> > specific at all, they're features of the devices that apply to any
> > system using them and while for some use cases (like WiFi and BT power)
> > an external thing that just manually applies power will be enough in
> > other cases we want to know about the device even while it's off and the
> > driver might be able to do extra things at runtime if it knows about for
> > example having some control over signals to the device.

> No, the device isn't platform specific, but the logic needed to turn
> on/off is platform specific, otherwise the device would "just work"
> properly as the bus is self-discoverable.

> Much like rfkill is, as you point out.  Those are all platform specific.

This is not just about power control - that's one of the simpler
applications but you're talking about essentially anything that might be
handled by platform data (or by the configuration SEPROMs on a
freestanding device for that matter, why would you put down an extra
part to configure the device when you can just load things from the AP).

> > For example in the Slimbus case we're normally talking about audio
> > CODECs.  In order to preserve the userspace API the device has to appear
> > to be present at all times, the driver will remember the settings the
> > user is making to be applied when it actually powers up and indeed the
> > powering up should be kicked off as a result of userspac acting on the
> > apparently present device.

> That's some horrible hardware, who thought of that?

It's actually pretty nice hardware in many regards; the bus is a bit
underspecified for maximum bandwidth in modern systems but it gives you
standardised multi-drop data streaming over two wires muxed with control
which helps with the pin counts and with simplifying the system hardware
design.

The disappearing from the bus thing is because you're aiming to hit low
power idle (but still functioning) states consuming very small numbers
of microamps, even having a clock running is measurable.

> > > Perhaps a semi-generic "platform" driver could be created, that knows
> > > how to handle these settings in the DT, but odds are, that might be
> > > difficult to make generic enough to cover a wide range of boards, but
> > > without specifics, it's hard to tell.

> > There's things like the rfkill stuff already, and the reset controller
> > on the way, but again this only covers a fairly small subset of the
> > issues.

> "small subset"?  How common is this type of thing?

Well, for Slimbus it's absolutely the norm, I've never seen a Slimbus
device that didn't have a need for platform data.  The small subset
there is of the problems rather than the devices - you'll cover a large
set of devices with a common helper like rfkill but trying to handle
everything with that pattern doesn't seem like it'll work.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-12 21:40       ` Mark Brown
@ 2013-08-13  1:04         ` Alan Stern
  2013-08-14 11:38           ` Mark Brown
  0 siblings, 1 reply; 54+ messages in thread
From: Alan Stern @ 2013-08-13  1:04 UTC (permalink / raw)
  To: Mark Brown
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

On Mon, 12 Aug 2013, Mark Brown wrote:

> On Mon, Aug 12, 2013 at 01:50:07PM -0700, Greg Kroah-Hartman wrote:
> > On Mon, Aug 12, 2013 at 12:23:44PM +0100, Mark Brown wrote:
> 
> > > I don't think they're bus specific - the main issue with a lot of this
> > > is that they're outside the infrastructure that the bus standardises so
> > > we should have a general way of understanding this.  There will be bits
> > > where the bus needs to get involved but the overall pattern is generic.
> 
> > The "pattern" is generic, yes, we've been dealing with that for well
> > over a decade now (pci hotplug controllers are "out of line" and control
> > when/if a PCI is device is added/removed.)
> 
> > I'd argue that each bus needs special logic to handle this, just like
> > PCI hotplug did it with their hotplug controller logic.  Due to the
> > nature of this type of thing, it's all out-of-line hardware that is
> > custom to each device type / bus.
> 
> I agree that the bus will need some logic to handle this and I also
> think Stephen is right that there are going to be some common patterns
> for some device classes.  However I do think that this is a common
> problem for pretty much all buses so we should be factoring out as much
> as possible from the buses so they only have to deal with their bit of
> things.  Most of the stuff that's worrying me is not anything the bus
> should have any idea about beyond tunnelling the data to the device.

In theory, the matching of device IDs can be done in the driver core, 
provided the IDs are assigned based on the bus topology (as is the 
case for USB).  But what should happen when there's a match?

The bus code would need hooks installed wherever the platform wants to 
do something extra.  This could end up growing to a lot of hooks.  How 
can the whole thing be done in a reasonable fashion?

Alan Stern


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-13  1:04         ` Alan Stern
@ 2013-08-14 11:38           ` Mark Brown
  2013-08-14 14:27               ` Alan Stern
  0 siblings, 1 reply; 54+ messages in thread
From: Mark Brown @ 2013-08-14 11:38 UTC (permalink / raw)
  To: Alan Stern
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 444 bytes --]

On Mon, Aug 12, 2013 at 09:04:00PM -0400, Alan Stern wrote:

> The bus code would need hooks installed wherever the platform wants to 
> do something extra.  This could end up growing to a lot of hooks.  How 
> can the whole thing be done in a reasonable fashion?

I'd expect that we're just looking at hooks around connection and
disconnection here here - if we're looking at much more it seems like we
must be doing something wrong.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-14 11:38           ` Mark Brown
@ 2013-08-14 14:27               ` Alan Stern
  0 siblings, 0 replies; 54+ messages in thread
From: Alan Stern @ 2013-08-14 14:27 UTC (permalink / raw)
  To: Mark Brown
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

On Wed, 14 Aug 2013, Mark Brown wrote:

> On Mon, Aug 12, 2013 at 09:04:00PM -0400, Alan Stern wrote:
> 
> > The bus code would need hooks installed wherever the platform wants to 
> > do something extra.  This could end up growing to a lot of hooks.  How 
> > can the whole thing be done in a reasonable fashion?
> 
> I'd expect that we're just looking at hooks around connection and
> disconnection here here - if we're looking at much more it seems like we
> must be doing something wrong.

Connection and disconnection of what?

In the example mentioned earlier, the GPIOs to power an on-board USB
hub would have to be initialized when the host controller was started.  
You wouldn't want to wait for the on-board hub to be detected, because
without those GPIOs set properly, it never would be discovered on the
USB bus.  Right?

Perhaps the platform-level code would need to hook into the places
where the discoverable bus is registered and unregistered.

Alan Stern


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
@ 2013-08-14 14:27               ` Alan Stern
  0 siblings, 0 replies; 54+ messages in thread
From: Alan Stern @ 2013-08-14 14:27 UTC (permalink / raw)
  To: Mark Brown
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

On Wed, 14 Aug 2013, Mark Brown wrote:

> On Mon, Aug 12, 2013 at 09:04:00PM -0400, Alan Stern wrote:
> 
> > The bus code would need hooks installed wherever the platform wants to 
> > do something extra.  This could end up growing to a lot of hooks.  How 
> > can the whole thing be done in a reasonable fashion?
> 
> I'd expect that we're just looking at hooks around connection and
> disconnection here here - if we're looking at much more it seems like we
> must be doing something wrong.

Connection and disconnection of what?

In the example mentioned earlier, the GPIOs to power an on-board USB
hub would have to be initialized when the host controller was started.  
You wouldn't want to wait for the on-board hub to be detected, because
without those GPIOs set properly, it never would be discovered on the
USB bus.  Right?

Perhaps the platform-level code would need to hook into the places
where the discoverable bus is registered and unregistered.

Alan Stern


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-14 14:27               ` Alan Stern
  (?)
@ 2013-08-14 15:39               ` Mark Brown
  2013-08-14 16:14                   ` Alan Stern
  -1 siblings, 1 reply; 54+ messages in thread
From: Mark Brown @ 2013-08-14 15:39 UTC (permalink / raw)
  To: Alan Stern
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 1014 bytes --]

On Wed, Aug 14, 2013 at 10:27:26AM -0400, Alan Stern wrote:
> On Wed, 14 Aug 2013, Mark Brown wrote:

> > I'd expect that we're just looking at hooks around connection and
> > disconnection here here - if we're looking at much more it seems like we
> > must be doing something wrong.

> Connection and disconnection of what?

The device on the bus.

> In the example mentioned earlier, the GPIOs to power an on-board USB
> hub would have to be initialized when the host controller was started.  
> You wouldn't want to wait for the on-board hub to be detected, because
> without those GPIOs set properly, it never would be discovered on the
> USB bus.  Right?

Yes, so you'd want callbacks when the device actually appears and
disappears.

> Perhaps the platform-level code would need to hook into the places
> where the discoverable bus is registered and unregistered.

We'd need some way to get information to the drivers still, and to
handle drivers that want to stop and start things.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-14 15:39               ` Mark Brown
@ 2013-08-14 16:14                   ` Alan Stern
  0 siblings, 0 replies; 54+ messages in thread
From: Alan Stern @ 2013-08-14 16:14 UTC (permalink / raw)
  To: Mark Brown
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

On Wed, 14 Aug 2013, Mark Brown wrote:

> On Wed, Aug 14, 2013 at 10:27:26AM -0400, Alan Stern wrote:
> > On Wed, 14 Aug 2013, Mark Brown wrote:
> 
> > > I'd expect that we're just looking at hooks around connection and
> > > disconnection here here - if we're looking at much more it seems like we
> > > must be doing something wrong.
> 
> > Connection and disconnection of what?
> 
> The device on the bus.
> 
> > In the example mentioned earlier, the GPIOs to power an on-board USB
> > hub would have to be initialized when the host controller was started.  
> > You wouldn't want to wait for the on-board hub to be detected, because
> > without those GPIOs set properly, it never would be discovered on the
> > USB bus.  Right?
> 
> Yes, so you'd want callbacks when the device actually appears and
> disappears.

No, no -- this is exactly the point I was trying to make.  The on-board
hub _won't_ appear on the USB bus until the GPIOs are set.  Therefore
the callback to set the GPIOs needs to be at a different place, not
when the device appears.

> > Perhaps the platform-level code would need to hook into the places
> > where the discoverable bus is registered and unregistered.
> 
> We'd need some way to get information to the drivers still, and to
> handle drivers that want to stop and start things.

Um...  What exactly does this mean?  It's so generic, it could apply to
anything under drivers/.  After all, what driver doesn't want to stop
and start things?

Alan Stern


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
@ 2013-08-14 16:14                   ` Alan Stern
  0 siblings, 0 replies; 54+ messages in thread
From: Alan Stern @ 2013-08-14 16:14 UTC (permalink / raw)
  To: Mark Brown
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

On Wed, 14 Aug 2013, Mark Brown wrote:

> On Wed, Aug 14, 2013 at 10:27:26AM -0400, Alan Stern wrote:
> > On Wed, 14 Aug 2013, Mark Brown wrote:
> 
> > > I'd expect that we're just looking at hooks around connection and
> > > disconnection here here - if we're looking at much more it seems like we
> > > must be doing something wrong.
> 
> > Connection and disconnection of what?
> 
> The device on the bus.
> 
> > In the example mentioned earlier, the GPIOs to power an on-board USB
> > hub would have to be initialized when the host controller was started.  
> > You wouldn't want to wait for the on-board hub to be detected, because
> > without those GPIOs set properly, it never would be discovered on the
> > USB bus.  Right?
> 
> Yes, so you'd want callbacks when the device actually appears and
> disappears.

No, no -- this is exactly the point I was trying to make.  The on-board
hub _won't_ appear on the USB bus until the GPIOs are set.  Therefore
the callback to set the GPIOs needs to be at a different place, not
when the device appears.

> > Perhaps the platform-level code would need to hook into the places
> > where the discoverable bus is registered and unregistered.
> 
> We'd need some way to get information to the drivers still, and to
> handle drivers that want to stop and start things.

Um...  What exactly does this mean?  It's so generic, it could apply to
anything under drivers/.  After all, what driver doesn't want to stop
and start things?

Alan Stern


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-14 16:14                   ` Alan Stern
  (?)
@ 2013-08-14 16:30                   ` Stephen Warren
  2013-08-14 18:49                     ` Mark Brown
  -1 siblings, 1 reply; 54+ messages in thread
From: Stephen Warren @ 2013-08-14 16:30 UTC (permalink / raw)
  To: Alan Stern
  Cc: Mark Brown, Greg Kroah-Hartman, Rob Herring, Pawel Moll,
	Mark Rutland, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

On 08/14/2013 10:14 AM, Alan Stern wrote:
> On Wed, 14 Aug 2013, Mark Brown wrote:
> 
>> On Wed, Aug 14, 2013 at 10:27:26AM -0400, Alan Stern wrote:
>>> On Wed, 14 Aug 2013, Mark Brown wrote:
>>
>>>> I'd expect that we're just looking at hooks around connection and
>>>> disconnection here here - if we're looking at much more it seems like we
>>>> must be doing something wrong.
>>
>>> Connection and disconnection of what?
>>
>> The device on the bus.
>>
>>> In the example mentioned earlier, the GPIOs to power an on-board USB
>>> hub would have to be initialized when the host controller was started.  
>>> You wouldn't want to wait for the on-board hub to be detected, because
>>> without those GPIOs set properly, it never would be discovered on the
>>> USB bus.  Right?
>>
>> Yes, so you'd want callbacks when the device actually appears and
>> disappears.
> 
> No, no -- this is exactly the point I was trying to make.  The on-board
> hub _won't_ appear on the USB bus until the GPIOs are set.  Therefore
> the callback to set the GPIOs needs to be at a different place, not
> when the device appears.

The device Mark was talking about is the controller end of the bus (EHCI
controller, or hub's downstream port) not the device end of the bus (any
USB device's upstream port).

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-14 16:14                   ` Alan Stern
  (?)
  (?)
@ 2013-08-14 17:30                   ` Mark Brown
  2013-08-14 18:35                       ` Alan Stern
  -1 siblings, 1 reply; 54+ messages in thread
From: Mark Brown @ 2013-08-14 17:30 UTC (permalink / raw)
  To: Alan Stern
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 1448 bytes --]

On Wed, Aug 14, 2013 at 12:14:06PM -0400, Alan Stern wrote:
> On Wed, 14 Aug 2013, Mark Brown wrote:

> > Yes, so you'd want callbacks when the device actually appears and
> > disappears.

> No, no -- this is exactly the point I was trying to make.  The on-board
> hub _won't_ appear on the USB bus until the GPIOs are set.  Therefore
> the callback to set the GPIOs needs to be at a different place, not
> when the device appears.

What I'm proposing is that we have a way of telling buses that devices
exist via a mechanism other than their actually being visible on the bus
at the current time.  If you're doing that the driver can be running
prior to the hardware being there, just like it does with all the
non-enumerable buses.

> > > Perhaps the platform-level code would need to hook into the places
> > > where the discoverable bus is registered and unregistered.

> > We'd need some way to get information to the drivers still, and to
> > handle drivers that want to stop and start things.

> Um...  What exactly does this mean?  It's so generic, it could apply to
> anything under drivers/.  After all, what driver doesn't want to stop
> and start things?

It means that there are situations where a driver wants to take the
hardware offline but still offer services to userspace which will
require the hardware to be brought on line again.  The fact that this is
a very generic thing is exactly why I'm raising this as a generic issue.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-14 17:30                   ` Mark Brown
@ 2013-08-14 18:35                       ` Alan Stern
  0 siblings, 0 replies; 54+ messages in thread
From: Alan Stern @ 2013-08-14 18:35 UTC (permalink / raw)
  To: Mark Brown
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

On Wed, 14 Aug 2013, Mark Brown wrote:

> On Wed, Aug 14, 2013 at 12:14:06PM -0400, Alan Stern wrote:
> > On Wed, 14 Aug 2013, Mark Brown wrote:
> 
> > > Yes, so you'd want callbacks when the device actually appears and
> > > disappears.
> 
> > No, no -- this is exactly the point I was trying to make.  The on-board
> > hub _won't_ appear on the USB bus until the GPIOs are set.  Therefore
> > the callback to set the GPIOs needs to be at a different place, not
> > when the device appears.
> 
> What I'm proposing is that we have a way of telling buses that devices
> exist via a mechanism other than their actually being visible on the bus
> at the current time.  If you're doing that the driver can be running
> prior to the hardware being there, just like it does with all the
> non-enumerable buses.

This may work for other buses, but it isn't feasible for USB.  Not only
do many of the drivers need to communicate with their device during
their probe routine, the subsystem itself needs to communicate with the
device before many of the important data structures can be constructed.  
Without these structures, the device can't be bound to a driver.  We 
wouldn't even know which driver to bind it to!

My impression is that much of what you want could be handled by a
platform callback invoked when a particular bus -- i.e., one whose
upstream controller is a particular platform device -- is registered.  
Is that correct?  For example, in the USB case, the on-board hub's
GPIOs could be set when the USB bus is registered (or perhaps when the
bus's root hub is registered).

> It means that there are situations where a driver wants to take the
> hardware offline but still offer services to userspace which will
> require the hardware to be brought on line again.  The fact that this is
> a very generic thing is exactly why I'm raising this as a generic issue.

This is a separate issue, more or less independent of whether the
platform needs to carry out special actions for the device in question.  
If you're suggesting these off-line/on-line transitions are appropriate
places for a platform hook, then yes, that makes sense.

Alan Stern


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
@ 2013-08-14 18:35                       ` Alan Stern
  0 siblings, 0 replies; 54+ messages in thread
From: Alan Stern @ 2013-08-14 18:35 UTC (permalink / raw)
  To: Mark Brown
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

On Wed, 14 Aug 2013, Mark Brown wrote:

> On Wed, Aug 14, 2013 at 12:14:06PM -0400, Alan Stern wrote:
> > On Wed, 14 Aug 2013, Mark Brown wrote:
> 
> > > Yes, so you'd want callbacks when the device actually appears and
> > > disappears.
> 
> > No, no -- this is exactly the point I was trying to make.  The on-board
> > hub _won't_ appear on the USB bus until the GPIOs are set.  Therefore
> > the callback to set the GPIOs needs to be at a different place, not
> > when the device appears.
> 
> What I'm proposing is that we have a way of telling buses that devices
> exist via a mechanism other than their actually being visible on the bus
> at the current time.  If you're doing that the driver can be running
> prior to the hardware being there, just like it does with all the
> non-enumerable buses.

This may work for other buses, but it isn't feasible for USB.  Not only
do many of the drivers need to communicate with their device during
their probe routine, the subsystem itself needs to communicate with the
device before many of the important data structures can be constructed.  
Without these structures, the device can't be bound to a driver.  We 
wouldn't even know which driver to bind it to!

My impression is that much of what you want could be handled by a
platform callback invoked when a particular bus -- i.e., one whose
upstream controller is a particular platform device -- is registered.  
Is that correct?  For example, in the USB case, the on-board hub's
GPIOs could be set when the USB bus is registered (or perhaps when the
bus's root hub is registered).

> It means that there are situations where a driver wants to take the
> hardware offline but still offer services to userspace which will
> require the hardware to be brought on line again.  The fact that this is
> a very generic thing is exactly why I'm raising this as a generic issue.

This is a separate issue, more or less independent of whether the
platform needs to carry out special actions for the device in question.  
If you're suggesting these off-line/on-line transitions are appropriate
places for a platform hook, then yes, that makes sense.

Alan Stern


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-14 18:35                       ` Alan Stern
  (?)
@ 2013-08-14 18:46                       ` Mark Brown
  2013-08-14 19:39                           ` Alan Stern
  -1 siblings, 1 reply; 54+ messages in thread
From: Mark Brown @ 2013-08-14 18:46 UTC (permalink / raw)
  To: Alan Stern
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 2673 bytes --]

On Wed, Aug 14, 2013 at 02:35:07PM -0400, Alan Stern wrote:
> On Wed, 14 Aug 2013, Mark Brown wrote:

> > What I'm proposing is that we have a way of telling buses that devices
> > exist via a mechanism other than their actually being visible on the bus
> > at the current time.  If you're doing that the driver can be running
> > prior to the hardware being there, just like it does with all the
> > non-enumerable buses.

> This may work for other buses, but it isn't feasible for USB.  Not only
> do many of the drivers need to communicate with their device during
> their probe routine, the subsystem itself needs to communicate with the
> device before many of the important data structures can be constructed.  
> Without these structures, the device can't be bound to a driver.  We 
> wouldn't even know which driver to bind it to!

The identification information for the device would of course have to be
provided as part of registering that the device was going to appear -
I'd expect to provide the same information that's read out of the
hardware during enumeration, with enumeration checking to see if it
knows about the device already.

> My impression is that much of what you want could be handled by a
> platform callback invoked when a particular bus -- i.e., one whose
> upstream controller is a particular platform device -- is registered.  
> Is that correct?  For example, in the USB case, the on-board hub's
> GPIOs could be set when the USB bus is registered (or perhaps when the
> bus's root hub is registered).

That sort of bodge is probably adequate for basic "power this on" stuff
but it's not going to scale to a general solution, especially where the
driver wants to use some of the information at runtime.  Currently
systems are doing things like bodging callbacks into controller drivers
which is basically what you're talking about here.

> > It means that there are situations where a driver wants to take the
> > hardware offline but still offer services to userspace which will
> > require the hardware to be brought on line again.  The fact that this is
> > a very generic thing is exactly why I'm raising this as a generic issue.

> This is a separate issue, more or less independent of whether the
> platform needs to carry out special actions for the device in question.  
> If you're suggesting these off-line/on-line transitions are appropriate
> places for a platform hook, then yes, that makes sense.

I think in the general case it's the same issue - grab all the resources
and enable them at probe time is the simplest implementation but it's
not the only one by a long stretch.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-14 16:30                   ` Stephen Warren
@ 2013-08-14 18:49                     ` Mark Brown
  0 siblings, 0 replies; 54+ messages in thread
From: Mark Brown @ 2013-08-14 18:49 UTC (permalink / raw)
  To: Stephen Warren
  Cc: Alan Stern, Greg Kroah-Hartman, Rob Herring, Pawel Moll,
	Mark Rutland, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 748 bytes --]

On Wed, Aug 14, 2013 at 10:30:44AM -0600, Stephen Warren wrote:
> On 08/14/2013 10:14 AM, Alan Stern wrote:

> > No, no -- this is exactly the point I was trying to make.  The on-board
> > hub _won't_ appear on the USB bus until the GPIOs are set.  Therefore
> > the callback to set the GPIOs needs to be at a different place, not
> > when the device appears.

> The device Mark was talking about is the controller end of the bus (EHCI
> controller, or hub's downstream port) not the device end of the bus (any
> USB device's upstream port).

Actually it genuinely is a hub - it's not part of the controller, though
the startup does need to be synchronised with the controller.  It ends
up parenting some other devices but that's not suchan issue.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-14 18:46                       ` Mark Brown
@ 2013-08-14 19:39                           ` Alan Stern
  0 siblings, 0 replies; 54+ messages in thread
From: Alan Stern @ 2013-08-14 19:39 UTC (permalink / raw)
  To: Mark Brown
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

On Wed, 14 Aug 2013, Mark Brown wrote:

> On Wed, Aug 14, 2013 at 02:35:07PM -0400, Alan Stern wrote:
> > On Wed, 14 Aug 2013, Mark Brown wrote:
> 
> > > What I'm proposing is that we have a way of telling buses that devices
> > > exist via a mechanism other than their actually being visible on the bus
> > > at the current time.  If you're doing that the driver can be running
> > > prior to the hardware being there, just like it does with all the
> > > non-enumerable buses.
> 
> > This may work for other buses, but it isn't feasible for USB.  Not only
> > do many of the drivers need to communicate with their device during
> > their probe routine, the subsystem itself needs to communicate with the
> > device before many of the important data structures can be constructed.  
> > Without these structures, the device can't be bound to a driver.  We 
> > wouldn't even know which driver to bind it to!
> 
> The identification information for the device would of course have to be
> provided as part of registering that the device was going to appear -
> I'd expect to provide the same information that's read out of the
> hardware during enumeration, with enumeration checking to see if it
> knows about the device already.

I don't see the point of all this.  Obviously the device can't be used
until it physically appears on the bus.  What benefit do you get from
registering it and making it available to userspace before that?

> > My impression is that much of what you want could be handled by a
> > platform callback invoked when a particular bus -- i.e., one whose
> > upstream controller is a particular platform device -- is registered.  
> > Is that correct?  For example, in the USB case, the on-board hub's
> > GPIOs could be set when the USB bus is registered (or perhaps when the
> > bus's root hub is registered).
> 
> That sort of bodge is probably adequate for basic "power this on" stuff
> but it's not going to scale to a general solution, especially where the
> driver wants to use some of the information at runtime.  Currently
> systems are doing things like bodging callbacks into controller drivers
> which is basically what you're talking about here.

Well, basic "power this on" stuff is pretty much all we have discussed 
in this thread so far.  What other sorts of things are going to be 
needed for a general solution?

> > > It means that there are situations where a driver wants to take the
> > > hardware offline but still offer services to userspace which will
> > > require the hardware to be brought on line again.  The fact that this is
> > > a very generic thing is exactly why I'm raising this as a generic issue.
> 
> > This is a separate issue, more or less independent of whether the
> > platform needs to carry out special actions for the device in question.  
> > If you're suggesting these off-line/on-line transitions are appropriate
> > places for a platform hook, then yes, that makes sense.
> 
> I think in the general case it's the same issue - grab all the resources
> and enable them at probe time is the simplest implementation but it's
> not the only one by a long stretch.

Now I'm getting confused.  It seems we're talking about at least three
very different things here:

     A: Devising a mechanism for platform code to do things involving
	devices that are dynamically registered on discoverable buses.

     B: Telling the subsystem and driver code for a discoverable bus
	that a particular device is present before it has been 
	detected.

     C: Implementing a mechanism whereby drivers can take a device
	off-line while still pretending to userspace that the device
	is still present, by bringing it back on-line as needed.

I don't see much connection between these things.  Perhaps you can
explain in more detail.

(BTW, it's worth mentioning that C has already been done, in the form
of runtime PM.  The difference may be that you propose to take the
device so far off-line that it disappears from the bus.  AFAICS, this
would be purely a private matter to be arranged between the subsystem
and the driver; it does not need to be handled at the level of the
device-model or PM core.)

Alan Stern


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
@ 2013-08-14 19:39                           ` Alan Stern
  0 siblings, 0 replies; 54+ messages in thread
From: Alan Stern @ 2013-08-14 19:39 UTC (permalink / raw)
  To: Mark Brown
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

On Wed, 14 Aug 2013, Mark Brown wrote:

> On Wed, Aug 14, 2013 at 02:35:07PM -0400, Alan Stern wrote:
> > On Wed, 14 Aug 2013, Mark Brown wrote:
> 
> > > What I'm proposing is that we have a way of telling buses that devices
> > > exist via a mechanism other than their actually being visible on the bus
> > > at the current time.  If you're doing that the driver can be running
> > > prior to the hardware being there, just like it does with all the
> > > non-enumerable buses.
> 
> > This may work for other buses, but it isn't feasible for USB.  Not only
> > do many of the drivers need to communicate with their device during
> > their probe routine, the subsystem itself needs to communicate with the
> > device before many of the important data structures can be constructed.  
> > Without these structures, the device can't be bound to a driver.  We 
> > wouldn't even know which driver to bind it to!
> 
> The identification information for the device would of course have to be
> provided as part of registering that the device was going to appear -
> I'd expect to provide the same information that's read out of the
> hardware during enumeration, with enumeration checking to see if it
> knows about the device already.

I don't see the point of all this.  Obviously the device can't be used
until it physically appears on the bus.  What benefit do you get from
registering it and making it available to userspace before that?

> > My impression is that much of what you want could be handled by a
> > platform callback invoked when a particular bus -- i.e., one whose
> > upstream controller is a particular platform device -- is registered.  
> > Is that correct?  For example, in the USB case, the on-board hub's
> > GPIOs could be set when the USB bus is registered (or perhaps when the
> > bus's root hub is registered).
> 
> That sort of bodge is probably adequate for basic "power this on" stuff
> but it's not going to scale to a general solution, especially where the
> driver wants to use some of the information at runtime.  Currently
> systems are doing things like bodging callbacks into controller drivers
> which is basically what you're talking about here.

Well, basic "power this on" stuff is pretty much all we have discussed 
in this thread so far.  What other sorts of things are going to be 
needed for a general solution?

> > > It means that there are situations where a driver wants to take the
> > > hardware offline but still offer services to userspace which will
> > > require the hardware to be brought on line again.  The fact that this is
> > > a very generic thing is exactly why I'm raising this as a generic issue.
> 
> > This is a separate issue, more or less independent of whether the
> > platform needs to carry out special actions for the device in question.  
> > If you're suggesting these off-line/on-line transitions are appropriate
> > places for a platform hook, then yes, that makes sense.
> 
> I think in the general case it's the same issue - grab all the resources
> and enable them at probe time is the simplest implementation but it's
> not the only one by a long stretch.

Now I'm getting confused.  It seems we're talking about at least three
very different things here:

     A: Devising a mechanism for platform code to do things involving
	devices that are dynamically registered on discoverable buses.

     B: Telling the subsystem and driver code for a discoverable bus
	that a particular device is present before it has been 
	detected.

     C: Implementing a mechanism whereby drivers can take a device
	off-line while still pretending to userspace that the device
	is still present, by bringing it back on-line as needed.

I don't see much connection between these things.  Perhaps you can
explain in more detail.

(BTW, it's worth mentioning that C has already been done, in the form
of runtime PM.  The difference may be that you propose to take the
device so far off-line that it disappears from the bus.  AFAICS, this
would be purely a private matter to be arranged between the subsystem
and the driver; it does not need to be handled at the level of the
device-model or PM core.)

Alan Stern


^ permalink raw reply	[flat|nested] 54+ messages in thread

* RE: Non-enumerable devices on USB and other enumerable buses
  2013-08-14 19:39                           ` Alan Stern
  (?)
@ 2013-08-14 20:16                           ` Paul Zimmerman
  2013-08-14 23:59                             ` Mark Brown
  -1 siblings, 1 reply; 54+ messages in thread
From: Paul Zimmerman @ 2013-08-14 20:16 UTC (permalink / raw)
  To: Alan Stern, Mark Brown
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

> From: Alan Stern
> Sent: Wednesday, August 14, 2013 12:39 PM

> Now I'm getting confused.  It seems we're talking about at least three
> very different things here:
> 
>      A: Devising a mechanism for platform code to do things involving
> 	devices that are dynamically registered on discoverable buses.
> 
>      B: Telling the subsystem and driver code for a discoverable bus
> 	that a particular device is present before it has been
> 	detected.
> 
>      C: Implementing a mechanism whereby drivers can take a device
> 	off-line while still pretending to userspace that the device
> 	is still present, by bringing it back on-line as needed.
> 
> I don't see much connection between these things.  Perhaps you can
> explain in more detail.
> 
> (BTW, it's worth mentioning that C has already been done, in the form
> of runtime PM.  The difference may be that you propose to take the
> device so far off-line that it disappears from the bus.  AFAICS, this
> would be purely a private matter to be arranged between the subsystem
> and the driver; it does not need to be handled at the level of the
> device-model or PM core.)

Mark's original complaint about USB was this:

> One example that's bugging me right now is that on the Insignal Arndale
> platform there's a USB hub connected to one of the USB ports on the SoC
> (not as a PHY, it seems we also need the internal PHY running to talk to
> the device).  The hub needs to be "plugged" into the SoC after the SoC
> USB controller has started with some GPIOs so we need to tell the system
> that the hub exists and needs to be synchronised with the USB controller.

This sounds to me like the normal discovery mechanism for USB isn't getting
kicked off because no Connect Status Change is being triggered on the root
port when the hub is brought online using the GPIOs. Maybe the port has
been runtime suspended because no device was attached originally?

So maybe the only thing needed for USB is a way to tell the parent port to
frob its port control bits to try to determine if a device is now present.
(set Wake on Connect Enable? Do a Port Reset? Cycle the Port Power bit if
possible?)

-- 
Paul


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-14 19:39                           ` Alan Stern
  (?)
  (?)
@ 2013-08-14 23:55                           ` Mark Brown
  2013-08-15 14:42                               ` Alan Stern
  -1 siblings, 1 reply; 54+ messages in thread
From: Mark Brown @ 2013-08-14 23:55 UTC (permalink / raw)
  To: Alan Stern
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 4126 bytes --]

On Wed, Aug 14, 2013 at 03:39:20PM -0400, Alan Stern wrote:

> I don't see the point of all this.  Obviously the device can't be used
> until it physically appears on the bus.  What benefit do you get from
> registering it and making it available to userspace before that?

Two things.  One is that some devices have the ability to perform useful
functions when powered down sufficiently that they can't run a complex
bus, providing notification when they need to wake up (or being woken up
if the power on comes from userspace).  The other is that then userspace
can just see the device and start using it when it needs it without
having to have a mechanism to discover that there's something there with
manual power control.

This can also be an issue in cases where we compose multiple physical
devices into composite ones for userspace (embedded audio and video do
this a lot for example).  A given bit of hardware may only be useful in
some circumstances.

> Well, basic "power this on" stuff is pretty much all we have discussed 
> in this thread so far.  What other sorts of things are going to be 
> needed for a general solution?

If you look elsewhere at the stuff I've been saying about Slimbus that's
the nastiest case I'm aware of in terms of the bus itself - that's got
the devices with low power modes that do useful things with the device
(and bus) mostly powered off and things like that.  Things like activity
detection of various kinds where the device is monitoring for activity
in a low power state.

I've also mentioned the devices that need platform data which is a part
of this too; one reason for knowing that the device is there before it
appears is so that we can pass platform data/DT/whatever to it.

> Now I'm getting confused.  It seems we're talking about at least three
> very different things here:

>      A: Devising a mechanism for platform code to do things involving
> 	devices that are dynamically registered on discoverable buses.

If we need random platform code then we're failing, half the point of
things like DT and ACPI is to avoid writing random board code.  we do
want to pass data to devices for their drivers to use but having to have
random bits of per board code would be really sad.

>      B: Telling the subsystem and driver code for a discoverable bus
> 	that a particular device is present before it has been 
> 	detected.

>      C: Implementing a mechanism whereby drivers can take a device
> 	off-line while still pretending to userspace that the device
> 	is still present, by bringing it back on-line as needed.

> I don't see much connection between these things.  Perhaps you can
> explain in more detail.

I think the solutions for these overlap so much they're the same thing.
The situation we're in in in your case B is just the idle case for
condition C - if we know about the device before it's been detected then
if it's been removed we just go back into the situation where we know
about it but it isn't powered.

> (BTW, it's worth mentioning that C has already been done, in the form
> of runtime PM.  The difference may be that you propose to take the
> device so far off-line that it disappears from the bus.  AFAICS, this
> would be purely a private matter to be arranged between the subsystem
> and the driver; it does not need to be handled at the level of the
> device-model or PM core.)

Actually runtime PM is actually already used for completely offlining
devices on buses that are too blind to notice - it's only an issue on
buses that can notice insertion and removal and want to do something
about it.  The use cases I'm describing already happen in mainline today
for devices on the dumber buses.

I think if we've got something which the hardware engineers can do on
multiple buses then they probably will so we should have at least a
pattern for how it's going to work over multiple buses rather than
having to handle different models for different buses.  I'll try to have
a think about what that pattern might be at some point (in my copious
free time).

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-14 20:16                           ` Paul Zimmerman
@ 2013-08-14 23:59                             ` Mark Brown
  0 siblings, 0 replies; 54+ messages in thread
From: Mark Brown @ 2013-08-14 23:59 UTC (permalink / raw)
  To: Paul Zimmerman
  Cc: Alan Stern, Greg Kroah-Hartman, Rob Herring, Pawel Moll,
	Mark Rutland, Stephen Warren, Ian Campbell, Felipe Balbi,
	Grant Likely, devicetree, linux-usb, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 1193 bytes --]

On Wed, Aug 14, 2013 at 08:16:56PM +0000, Paul Zimmerman wrote:

> Mark's original complaint about USB was this:
> 
> > the device).  The hub needs to be "plugged" into the SoC after the SoC
> > USB controller has started with some GPIOs so we need to tell the system
> > that the hub exists and needs to be synchronised with the USB controller.

> This sounds to me like the normal discovery mechanism for USB isn't getting
> kicked off because no Connect Status Change is being triggered on the root
> port when the hub is brought online using the GPIOs. Maybe the port has
> been runtime suspended because no device was attached originally?

> So maybe the only thing needed for USB is a way to tell the parent port to
> frob its port control bits to try to determine if a device is now present.
> (set Wake on Connect Enable? Do a Port Reset? Cycle the Port Power bit if
> possible?)

No, that's not required in this case - the case is the opposite one to
the one you describe.  Host starting first then hub works fine, if the
host does go into a low power mode it seems to notice the hub appearing
just fine.  Hub then host fails for some reason which I don't know.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-14 23:55                           ` Mark Brown
@ 2013-08-15 14:42                               ` Alan Stern
  0 siblings, 0 replies; 54+ messages in thread
From: Alan Stern @ 2013-08-15 14:42 UTC (permalink / raw)
  To: Mark Brown
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

On Thu, 15 Aug 2013, Mark Brown wrote:

> On Wed, Aug 14, 2013 at 03:39:20PM -0400, Alan Stern wrote:
> 
> > I don't see the point of all this.  Obviously the device can't be used
> > until it physically appears on the bus.  What benefit do you get from
> > registering it and making it available to userspace before that?
> 
> Two things.  One is that some devices have the ability to perform useful
> functions when powered down sufficiently that they can't run a complex
> bus, providing notification when they need to wake up (or being woken up
> if the power on comes from userspace).  The other is that then userspace
> can just see the device and start using it when it needs it without
> having to have a mechanism to discover that there's something there with
> manual power control.
> 
> This can also be an issue in cases where we compose multiple physical
> devices into composite ones for userspace (embedded audio and video do
> this a lot for example).  A given bit of hardware may only be useful in
> some circumstances.
> 
> > Well, basic "power this on" stuff is pretty much all we have discussed 
> > in this thread so far.  What other sorts of things are going to be 
> > needed for a general solution?
> 
> If you look elsewhere at the stuff I've been saying about Slimbus that's
> the nastiest case I'm aware of in terms of the bus itself - that's got
> the devices with low power modes that do useful things with the device
> (and bus) mostly powered off and things like that.  Things like activity
> detection of various kinds where the device is monitoring for activity
> in a low power state.

Okay.  Previously we agreed that a device on one of these buses could
remain off-line except when the system needs to bring it to full power.  
To me, discovery and enumeration on the bus seem like a legitimate 
need.

So why not bring the device to full power as soon as possible during
boot, and have it registered on the bus in the usual way?  Once that's
done, the ordinary runtime PM mechanism will allow the device to go
back off-line.

> I've also mentioned the devices that need platform data which is a part
> of this too; one reason for knowing that the device is there before it
> appears is so that we can pass platform data/DT/whatever to it.

Can you pass this "whatever" data to the device as part of the initial 
bring-it-to-full-power procedure?

By the way, you mentioned something earlier that some of this platform
data might duplicate information that could be discovered through the
usual bus probing mechanisms (for example, USB descriptors).  IMO
that's a bad idea.  Not only is it wasteful, it also has the potential
for causing confusion if the two sets of data should disagree for any
reason.  When possible, it's always better to get info about the 
hardware from the hardware itself.

> > Now I'm getting confused.  It seems we're talking about at least three
> > very different things here:
> 
> >      A: Devising a mechanism for platform code to do things involving
> > 	devices that are dynamically registered on discoverable buses.
> 
> If we need random platform code then we're failing, half the point of
> things like DT and ACPI is to avoid writing random board code.  we do
> want to pass data to devices for their drivers to use but having to have
> random bits of per board code would be really sad.

At the level of abstraction in this discussion, there's no need to 
discriminate between code and data.  Just imagine that I simply wrote 
"platform", meaning platform code and/or data.

> >      B: Telling the subsystem and driver code for a discoverable bus
> > 	that a particular device is present before it has been 
> > 	detected.
> 
> >      C: Implementing a mechanism whereby drivers can take a device
> > 	off-line while still pretending to userspace that the device
> > 	is still present, by bringing it back on-line as needed.
> 
> > I don't see much connection between these things.  Perhaps you can
> > explain in more detail.
> 
> I think the solutions for these overlap so much they're the same thing.
> The situation we're in in in your case B is just the idle case for
> condition C - if we know about the device before it's been detected then
> if it's been removed we just go back into the situation where we know
> about it but it isn't powered.

I imagine that teaching a subsystem to know about a device before it 
has been detected would require significant changes.  My suggestion -- 
powering up the device, detecting it, and then powering it back down -- 
fits in very cleanly with existing designs and would require 
comparatively little work.  Case B then becomes unnecessary; all the 
important stuff will be handled under Case C.

> > (BTW, it's worth mentioning that C has already been done, in the form
> > of runtime PM.  The difference may be that you propose to take the
> > device so far off-line that it disappears from the bus.  AFAICS, this
> > would be purely a private matter to be arranged between the subsystem
> > and the driver; it does not need to be handled at the level of the
> > device-model or PM core.)
> 
> Actually runtime PM is actually already used for completely offlining
> devices on buses that are too blind to notice - it's only an issue on
> buses that can notice insertion and removal and want to do something
> about it.  The use cases I'm describing already happen in mainline today
> for devices on the dumber buses.

Which means eliminating case B will be all that much easier for these 
buses.

> I think if we've got something which the hardware engineers can do on
> multiple buses then they probably will so we should have at least a
> pattern for how it's going to work over multiple buses rather than
> having to handle different models for different buses.  I'll try to have
> a think about what that pattern might be at some point (in my copious
> free time).

There's one important factor to keep in mind: Are devices on the bus
physically removable?  If not, the situation is pretty straightforward.  
You just remember that the device used to be present, and reuse the old
data structures when it reappears.

If devices are removable then things are a lot more complicated.  The 
usb-storage driver used to do what you are talking about, back in the 
days of the 2.4 kernels.  When a mass-storage device was unplugged, 
the driver would remember it and reuse the data structures when the 
device was plugged back in and reprobed.  Linus himself told us this 
was a mistake, so we removed the feature.

The USB subsystem now supports this feature in a very limited form.  
If the hardware session gets dropped while the computer is suspended,
then at resume time the system will try to verify that the device
present at that bus address is the same device that was there before
the suspend.  If it is, we will continue to use it as if the connection
had never dropped.

Alan Stern


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
@ 2013-08-15 14:42                               ` Alan Stern
  0 siblings, 0 replies; 54+ messages in thread
From: Alan Stern @ 2013-08-15 14:42 UTC (permalink / raw)
  To: Mark Brown
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

On Thu, 15 Aug 2013, Mark Brown wrote:

> On Wed, Aug 14, 2013 at 03:39:20PM -0400, Alan Stern wrote:
> 
> > I don't see the point of all this.  Obviously the device can't be used
> > until it physically appears on the bus.  What benefit do you get from
> > registering it and making it available to userspace before that?
> 
> Two things.  One is that some devices have the ability to perform useful
> functions when powered down sufficiently that they can't run a complex
> bus, providing notification when they need to wake up (or being woken up
> if the power on comes from userspace).  The other is that then userspace
> can just see the device and start using it when it needs it without
> having to have a mechanism to discover that there's something there with
> manual power control.
> 
> This can also be an issue in cases where we compose multiple physical
> devices into composite ones for userspace (embedded audio and video do
> this a lot for example).  A given bit of hardware may only be useful in
> some circumstances.
> 
> > Well, basic "power this on" stuff is pretty much all we have discussed 
> > in this thread so far.  What other sorts of things are going to be 
> > needed for a general solution?
> 
> If you look elsewhere at the stuff I've been saying about Slimbus that's
> the nastiest case I'm aware of in terms of the bus itself - that's got
> the devices with low power modes that do useful things with the device
> (and bus) mostly powered off and things like that.  Things like activity
> detection of various kinds where the device is monitoring for activity
> in a low power state.

Okay.  Previously we agreed that a device on one of these buses could
remain off-line except when the system needs to bring it to full power.  
To me, discovery and enumeration on the bus seem like a legitimate 
need.

So why not bring the device to full power as soon as possible during
boot, and have it registered on the bus in the usual way?  Once that's
done, the ordinary runtime PM mechanism will allow the device to go
back off-line.

> I've also mentioned the devices that need platform data which is a part
> of this too; one reason for knowing that the device is there before it
> appears is so that we can pass platform data/DT/whatever to it.

Can you pass this "whatever" data to the device as part of the initial 
bring-it-to-full-power procedure?

By the way, you mentioned something earlier that some of this platform
data might duplicate information that could be discovered through the
usual bus probing mechanisms (for example, USB descriptors).  IMO
that's a bad idea.  Not only is it wasteful, it also has the potential
for causing confusion if the two sets of data should disagree for any
reason.  When possible, it's always better to get info about the 
hardware from the hardware itself.

> > Now I'm getting confused.  It seems we're talking about at least three
> > very different things here:
> 
> >      A: Devising a mechanism for platform code to do things involving
> > 	devices that are dynamically registered on discoverable buses.
> 
> If we need random platform code then we're failing, half the point of
> things like DT and ACPI is to avoid writing random board code.  we do
> want to pass data to devices for their drivers to use but having to have
> random bits of per board code would be really sad.

At the level of abstraction in this discussion, there's no need to 
discriminate between code and data.  Just imagine that I simply wrote 
"platform", meaning platform code and/or data.

> >      B: Telling the subsystem and driver code for a discoverable bus
> > 	that a particular device is present before it has been 
> > 	detected.
> 
> >      C: Implementing a mechanism whereby drivers can take a device
> > 	off-line while still pretending to userspace that the device
> > 	is still present, by bringing it back on-line as needed.
> 
> > I don't see much connection between these things.  Perhaps you can
> > explain in more detail.
> 
> I think the solutions for these overlap so much they're the same thing.
> The situation we're in in in your case B is just the idle case for
> condition C - if we know about the device before it's been detected then
> if it's been removed we just go back into the situation where we know
> about it but it isn't powered.

I imagine that teaching a subsystem to know about a device before it 
has been detected would require significant changes.  My suggestion -- 
powering up the device, detecting it, and then powering it back down -- 
fits in very cleanly with existing designs and would require 
comparatively little work.  Case B then becomes unnecessary; all the 
important stuff will be handled under Case C.

> > (BTW, it's worth mentioning that C has already been done, in the form
> > of runtime PM.  The difference may be that you propose to take the
> > device so far off-line that it disappears from the bus.  AFAICS, this
> > would be purely a private matter to be arranged between the subsystem
> > and the driver; it does not need to be handled at the level of the
> > device-model or PM core.)
> 
> Actually runtime PM is actually already used for completely offlining
> devices on buses that are too blind to notice - it's only an issue on
> buses that can notice insertion and removal and want to do something
> about it.  The use cases I'm describing already happen in mainline today
> for devices on the dumber buses.

Which means eliminating case B will be all that much easier for these 
buses.

> I think if we've got something which the hardware engineers can do on
> multiple buses then they probably will so we should have at least a
> pattern for how it's going to work over multiple buses rather than
> having to handle different models for different buses.  I'll try to have
> a think about what that pattern might be at some point (in my copious
> free time).

There's one important factor to keep in mind: Are devices on the bus
physically removable?  If not, the situation is pretty straightforward.  
You just remember that the device used to be present, and reuse the old
data structures when it reappears.

If devices are removable then things are a lot more complicated.  The 
usb-storage driver used to do what you are talking about, back in the 
days of the 2.4 kernels.  When a mass-storage device was unplugged, 
the driver would remember it and reuse the data structures when the 
device was plugged back in and reprobed.  Linus himself told us this 
was a mistake, so we removed the feature.

The USB subsystem now supports this feature in a very limited form.  
If the hardware session gets dropped while the computer is suspended,
then at resume time the system will try to verify that the device
present at that bus address is the same device that was there before
the suspend.  If it is, we will continue to use it as if the connection
had never dropped.

Alan Stern


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-15 14:42                               ` Alan Stern
  (?)
@ 2013-08-15 17:10                               ` Mark Brown
  2013-08-15 17:55                                   ` Alan Stern
  -1 siblings, 1 reply; 54+ messages in thread
From: Mark Brown @ 2013-08-15 17:10 UTC (permalink / raw)
  To: Alan Stern
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 4107 bytes --]

On Thu, Aug 15, 2013 at 10:42:00AM -0400, Alan Stern wrote:
> On Thu, 15 Aug 2013, Mark Brown wrote:

> So why not bring the device to full power as soon as possible during
> boot, and have it registered on the bus in the usual way?  Once that's
> done, the ordinary runtime PM mechanism will allow the device to go
> back off-line.

That could be done, and is likely to happen anyway as a result of device
initialisation.  I'm not sure it buys much to force it to happen
immediately, though.

> > I've also mentioned the devices that need platform data which is a part
> > of this too; one reason for knowing that the device is there before it
> > appears is so that we can pass platform data/DT/whatever to it.

> Can you pass this "whatever" data to the device as part of the initial 
> bring-it-to-full-power procedure?

It is often going to be required as part of the bring it to full power
procedure.

> By the way, you mentioned something earlier that some of this platform
> data might duplicate information that could be discovered through the
> usual bus probing mechanisms (for example, USB descriptors).  IMO
> that's a bad idea.  Not only is it wasteful, it also has the potential

If you check the discussion it pretty much consisted of everyone saying
that duplicating enumerable information was a terrible idea.

> > >      A: Devising a mechanism for platform code to do things involving
> > > 	devices that are dynamically registered on discoverable buses.

> > If we need random platform code then we're failing, half the point of
> > things like DT and ACPI is to avoid writing random board code.  we do
> > want to pass data to devices for their drivers to use but having to have
> > random bits of per board code would be really sad.

> At the level of abstraction in this discussion, there's no need to 
> discriminate between code and data.  Just imagine that I simply wrote 
> "platform", meaning platform code and/or data.

There's a big difference between random glue outside the drivers and
something the drivers know about themselves, it's important to be clear
on this.  Bodges for this often involve writing a bit of board code that
the drivers don't know anything about.

> > >      B: Telling the subsystem and driver code for a discoverable bus
> > > 	that a particular device is present before it has been 
> > > 	detected.

> > I think the solutions for these overlap so much they're the same thing.
> > The situation we're in in in your case B is just the idle case for
> > condition C - if we know about the device before it's been detected then
> > if it's been removed we just go back into the situation where we know
> > about it but it isn't powered.

> I imagine that teaching a subsystem to know about a device before it 
> has been detected would require significant changes.  My suggestion -- 
> powering up the device, detecting it, and then powering it back down -- 
> fits in very cleanly with existing designs and would require 
> comparatively little work.  Case B then becomes unnecessary; all the 
> important stuff will be handled under Case C.

To be honest I don't see how that helps much if you're going to handle
the case where platform data is required to enumerate the device.  You
need to know about the device prior to enumeration in order to get the
platform data to the driver when it does enumerate and you can't
enumerate it until you do that anyway.  A bus could insist on this if it
needed the information from enumeration for some reason but really it
seems like an implementation detail.

> There's one important factor to keep in mind: Are devices on the bus
> physically removable?  If not, the situation is pretty straightforward.  
> You just remember that the device used to be present, and reuse the old
> data structures when it reappears.

Not the ones I'm talking about, though other removable devices may
possibly be present on the same bus.  My interest is in the case where
we know the chip is there because we can see it soldered to the board.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-15 17:10                               ` Mark Brown
@ 2013-08-15 17:55                                   ` Alan Stern
  0 siblings, 0 replies; 54+ messages in thread
From: Alan Stern @ 2013-08-15 17:55 UTC (permalink / raw)
  To: Mark Brown
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

On Thu, 15 Aug 2013, Mark Brown wrote:

> On Thu, Aug 15, 2013 at 10:42:00AM -0400, Alan Stern wrote:
> > On Thu, 15 Aug 2013, Mark Brown wrote:
> 
> > So why not bring the device to full power as soon as possible during
> > boot, and have it registered on the bus in the usual way?  Once that's
> > done, the ordinary runtime PM mechanism will allow the device to go
> > back off-line.
> 
> That could be done, and is likely to happen anyway as a result of device
> initialisation.  I'm not sure it buys much to force it to happen
> immediately, though.

Not necessarily immediately, then.  Let's say at the time when you
would have wanted to tell the bus about the device's existence, even
though it hadn't yet been detected.

> There's a big difference between random glue outside the drivers and
> something the drivers know about themselves, it's important to be clear
> on this.  Bodges for this often involve writing a bit of board code that
> the drivers don't know anything about.

Of course.  Glue outside of drivers is very significant, whether that 
glue takes the form of code or data.

> > I imagine that teaching a subsystem to know about a device before it 
> > has been detected would require significant changes.  My suggestion -- 
> > powering up the device, detecting it, and then powering it back down -- 
> > fits in very cleanly with existing designs and would require 
> > comparatively little work.  Case B then becomes unnecessary; all the 
> > important stuff will be handled under Case C.
> 
> To be honest I don't see how that helps much if you're going to handle
> the case where platform data is required to enumerate the device.  You
> need to know about the device prior to enumeration in order to get the
> platform data to the driver when it does enumerate and you can't
> enumerate it until you do that anyway.

You're a little imprecise here.  Which driver do you mean?  The driver
that will ultimately bind to the device, or the driver that will
discover and enumerate it (which generally is bound to the device's
upstream parent)?  I'll assume the latter.

Under what circumstances is platform data required to enumerate a
device on a discoverable bus?  We're assuming the platform has already
taken care of everything required to make the device appear on the bus
in the usual manner (such as bringing it to full power).  Can you give
an example where something more is needed?

(Were you thinking of the case where the device's IRQ signal doesn't go
over the bus but uses a different platform mechanism?  I don't quite 
see how this can work.  What about devices on the bus that aren't known 
to the platform beforehand?  How do they send their IRQ signals?)

>  A bus could insist on this if it
> needed the information from enumeration for some reason but really it
> seems like an implementation detail.

It isn't an implementation detail.  The "power-up for initial
detection" scheme is a general solution to the problem of setting up a
complicated communication path between the bus and the platform.  
(I.e., it gives a simple way to avoid the need for this communication,
that can be used on any discoverable bus.)  It also is a general 
solution for avoiding the problem of registering a device on a bus 
before that device has been discovered and enumerated.

Alan Stern


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
@ 2013-08-15 17:55                                   ` Alan Stern
  0 siblings, 0 replies; 54+ messages in thread
From: Alan Stern @ 2013-08-15 17:55 UTC (permalink / raw)
  To: Mark Brown
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

On Thu, 15 Aug 2013, Mark Brown wrote:

> On Thu, Aug 15, 2013 at 10:42:00AM -0400, Alan Stern wrote:
> > On Thu, 15 Aug 2013, Mark Brown wrote:
> 
> > So why not bring the device to full power as soon as possible during
> > boot, and have it registered on the bus in the usual way?  Once that's
> > done, the ordinary runtime PM mechanism will allow the device to go
> > back off-line.
> 
> That could be done, and is likely to happen anyway as a result of device
> initialisation.  I'm not sure it buys much to force it to happen
> immediately, though.

Not necessarily immediately, then.  Let's say at the time when you
would have wanted to tell the bus about the device's existence, even
though it hadn't yet been detected.

> There's a big difference between random glue outside the drivers and
> something the drivers know about themselves, it's important to be clear
> on this.  Bodges for this often involve writing a bit of board code that
> the drivers don't know anything about.

Of course.  Glue outside of drivers is very significant, whether that 
glue takes the form of code or data.

> > I imagine that teaching a subsystem to know about a device before it 
> > has been detected would require significant changes.  My suggestion -- 
> > powering up the device, detecting it, and then powering it back down -- 
> > fits in very cleanly with existing designs and would require 
> > comparatively little work.  Case B then becomes unnecessary; all the 
> > important stuff will be handled under Case C.
> 
> To be honest I don't see how that helps much if you're going to handle
> the case where platform data is required to enumerate the device.  You
> need to know about the device prior to enumeration in order to get the
> platform data to the driver when it does enumerate and you can't
> enumerate it until you do that anyway.

You're a little imprecise here.  Which driver do you mean?  The driver
that will ultimately bind to the device, or the driver that will
discover and enumerate it (which generally is bound to the device's
upstream parent)?  I'll assume the latter.

Under what circumstances is platform data required to enumerate a
device on a discoverable bus?  We're assuming the platform has already
taken care of everything required to make the device appear on the bus
in the usual manner (such as bringing it to full power).  Can you give
an example where something more is needed?

(Were you thinking of the case where the device's IRQ signal doesn't go
over the bus but uses a different platform mechanism?  I don't quite 
see how this can work.  What about devices on the bus that aren't known 
to the platform beforehand?  How do they send their IRQ signals?)

>  A bus could insist on this if it
> needed the information from enumeration for some reason but really it
> seems like an implementation detail.

It isn't an implementation detail.  The "power-up for initial
detection" scheme is a general solution to the problem of setting up a
complicated communication path between the bus and the platform.  
(I.e., it gives a simple way to avoid the need for this communication,
that can be used on any discoverable bus.)  It also is a general 
solution for avoiding the problem of registering a device on a bus 
before that device has been discovered and enumerated.

Alan Stern


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-15 17:55                                   ` Alan Stern
  (?)
@ 2013-08-15 19:32                                   ` Mark Brown
  2013-08-15 20:42                                       ` Alan Stern
  -1 siblings, 1 reply; 54+ messages in thread
From: Mark Brown @ 2013-08-15 19:32 UTC (permalink / raw)
  To: Alan Stern
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 3136 bytes --]

On Thu, Aug 15, 2013 at 01:55:18PM -0400, Alan Stern wrote:
> On Thu, 15 Aug 2013, Mark Brown wrote:
> > On Thu, Aug 15, 2013 at 10:42:00AM -0400, Alan Stern wrote:

> > To be honest I don't see how that helps much if you're going to handle
> > the case where platform data is required to enumerate the device.  You
> > need to know about the device prior to enumeration in order to get the
> > platform data to the driver when it does enumerate and you can't
> > enumerate it until you do that anyway.

> You're a little imprecise here.  Which driver do you mean?  The driver
> that will ultimately bind to the device, or the driver that will
> discover and enumerate it (which generally is bound to the device's
> upstream parent)?  I'll assume the latter.

The driver that's binding to the device - obviously going through
teaching all controller drivers about how to start up any random child
device they might encounter is not going to be a good idea, this should
be encapsulated in the child driver.

> Under what circumstances is platform data required to enumerate a
> device on a discoverable bus?  We're assuming the platform has already
> taken care of everything required to make the device appear on the bus
> in the usual manner (such as bringing it to full power).  Can you give
> an example where something more is needed?

Powering on the device is exactly the sort of thing I'm talking about
here.  I'm not sure what you think "the platform" is here but it sounds
awfully like the sort of random board specific bodge code that people
currently use - something has got to know what's needed to get the
device up and running and how to do it and the device driver seems like
the sensible place to do that.

> (Were you thinking of the case where the device's IRQ signal doesn't go
> over the bus but uses a different platform mechanism?  I don't quite 
> see how this can work.  What about devices on the bus that aren't known 
> to the platform beforehand?  How do they send their IRQ signals?)

Either the bus doesn't support anything like interrupts at all or they'd
use the standard bus mechanisms.  Typical reasons for bypassing the bus
include things like latency and power, or excessive cost for
implementation on the device side.

> >  A bus could insist on this if it
> > needed the information from enumeration for some reason but really it
> > seems like an implementation detail.

> It isn't an implementation detail.  The "power-up for initial
> detection" scheme is a general solution to the problem of setting up a
> complicated communication path between the bus and the platform.  
> (I.e., it gives a simple way to avoid the need for this communication,
> that can be used on any discoverable bus.)  It also is a general 
> solution for avoiding the problem of registering a device on a bus 
> before that device has been discovered and enumerated.

I think I completely misunderstood what you mean by powering up on
initial use.  If you're saying that we should have some platform code
for doing this I don't think that's a scalable solution.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-15 19:32                                   ` Mark Brown
@ 2013-08-15 20:42                                       ` Alan Stern
  0 siblings, 0 replies; 54+ messages in thread
From: Alan Stern @ 2013-08-15 20:42 UTC (permalink / raw)
  To: Mark Brown
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

On Thu, 15 Aug 2013, Mark Brown wrote:

> On Thu, Aug 15, 2013 at 01:55:18PM -0400, Alan Stern wrote:
> > On Thu, 15 Aug 2013, Mark Brown wrote:
> > > On Thu, Aug 15, 2013 at 10:42:00AM -0400, Alan Stern wrote:
> 
> > > To be honest I don't see how that helps much if you're going to handle
> > > the case where platform data is required to enumerate the device.  You
> > > need to know about the device prior to enumeration in order to get the
> > > platform data to the driver when it does enumerate and you can't
> > > enumerate it until you do that anyway.
> 
> > You're a little imprecise here.  Which driver do you mean?  The driver
> > that will ultimately bind to the device, or the driver that will
> > discover and enumerate it (which generally is bound to the device's
> > upstream parent)?  I'll assume the latter.
> 
> The driver that's binding to the device - obviously going through
> teaching all controller drivers about how to start up any random child
> device they might encounter is not going to be a good idea, this should
> be encapsulated in the child driver.

Okay.  Here's a restatement of what you wrote above:

	In the case where platform data is required to enumerate the
	device, you need to know about the device prior to enumeration.

Obviously true.

	You need to get the platform data to the driver when it does
	enumerate.

Not necessarily; see below.

> > Under what circumstances is platform data required to enumerate a
> > device on a discoverable bus?  We're assuming the platform has already
> > taken care of everything required to make the device appear on the bus
> > in the usual manner (such as bringing it to full power).  Can you give
> > an example where something more is needed?
> 
> Powering on the device is exactly the sort of thing I'm talking about
> here.

So something needs to power-on the device.  But what?  The driver that
enumerates it, or some other part of the kernel?

If some other part of the kernel takes care of this then you _don't_
have to get the platform data to the driver when it enumerates.

>  I'm not sure what you think "the platform" is here but it sounds
> awfully like the sort of random board specific bodge code that people
> currently use - something has got to know what's needed to get the
> device up and running and how to do it and the device driver seems like
> the sensible place to do that.

Just the reverse.  The driver should deal with things it knows about:  
how to discover and enumerate devices on its bus.  It should not
contain anything platform-specific.  Adding this in would be a
logistical nightmare -- you'd have to stuff power-on procedures for all
sorts of different platforms into this one poor driver!

> I think I completely misunderstood what you mean by powering up on
> initial use.  If you're saying that we should have some platform code
> for doing this I don't think that's a scalable solution.

How can it be avoided?  The powering-up operation is platform-specific.  
By definition, whatever code carries out the operation is platform
code.

Alan Stern


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
@ 2013-08-15 20:42                                       ` Alan Stern
  0 siblings, 0 replies; 54+ messages in thread
From: Alan Stern @ 2013-08-15 20:42 UTC (permalink / raw)
  To: Mark Brown
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

On Thu, 15 Aug 2013, Mark Brown wrote:

> On Thu, Aug 15, 2013 at 01:55:18PM -0400, Alan Stern wrote:
> > On Thu, 15 Aug 2013, Mark Brown wrote:
> > > On Thu, Aug 15, 2013 at 10:42:00AM -0400, Alan Stern wrote:
> 
> > > To be honest I don't see how that helps much if you're going to handle
> > > the case where platform data is required to enumerate the device.  You
> > > need to know about the device prior to enumeration in order to get the
> > > platform data to the driver when it does enumerate and you can't
> > > enumerate it until you do that anyway.
> 
> > You're a little imprecise here.  Which driver do you mean?  The driver
> > that will ultimately bind to the device, or the driver that will
> > discover and enumerate it (which generally is bound to the device's
> > upstream parent)?  I'll assume the latter.
> 
> The driver that's binding to the device - obviously going through
> teaching all controller drivers about how to start up any random child
> device they might encounter is not going to be a good idea, this should
> be encapsulated in the child driver.

Okay.  Here's a restatement of what you wrote above:

	In the case where platform data is required to enumerate the
	device, you need to know about the device prior to enumeration.

Obviously true.

	You need to get the platform data to the driver when it does
	enumerate.

Not necessarily; see below.

> > Under what circumstances is platform data required to enumerate a
> > device on a discoverable bus?  We're assuming the platform has already
> > taken care of everything required to make the device appear on the bus
> > in the usual manner (such as bringing it to full power).  Can you give
> > an example where something more is needed?
> 
> Powering on the device is exactly the sort of thing I'm talking about
> here.

So something needs to power-on the device.  But what?  The driver that
enumerates it, or some other part of the kernel?

If some other part of the kernel takes care of this then you _don't_
have to get the platform data to the driver when it enumerates.

>  I'm not sure what you think "the platform" is here but it sounds
> awfully like the sort of random board specific bodge code that people
> currently use - something has got to know what's needed to get the
> device up and running and how to do it and the device driver seems like
> the sensible place to do that.

Just the reverse.  The driver should deal with things it knows about:  
how to discover and enumerate devices on its bus.  It should not
contain anything platform-specific.  Adding this in would be a
logistical nightmare -- you'd have to stuff power-on procedures for all
sorts of different platforms into this one poor driver!

> I think I completely misunderstood what you mean by powering up on
> initial use.  If you're saying that we should have some platform code
> for doing this I don't think that's a scalable solution.

How can it be avoided?  The powering-up operation is platform-specific.  
By definition, whatever code carries out the operation is platform
code.

Alan Stern


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-15 20:42                                       ` Alan Stern
  (?)
@ 2013-08-15 22:54                                       ` Mark Brown
  2013-08-16 14:42                                         ` Alan Stern
  -1 siblings, 1 reply; 54+ messages in thread
From: Mark Brown @ 2013-08-15 22:54 UTC (permalink / raw)
  To: Alan Stern
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 3290 bytes --]

On Thu, Aug 15, 2013 at 04:42:01PM -0400, Alan Stern wrote:

> Okay.  Here's a restatement of what you wrote above:

> 	In the case where platform data is required to enumerate the
> 	device, you need to know about the device prior to enumeration.

> Obviously true.

> 	You need to get the platform data to the driver when it does
> 	enumerate.

> Not necessarily; see below.

I think this is pretty essential - there is no point in having platform
data if you can't pass it to the device.  It needs to make it to the
driver at the very least by the time the probe function runs.

> > Powering on the device is exactly the sort of thing I'm talking about
> > here.

> So something needs to power-on the device.  But what?  The driver that
> enumerates it, or some other part of the kernel?

> If some other part of the kernel takes care of this then you _don't_
> have to get the platform data to the driver when it enumerates.

Right, but my contention would be that if it's not the driver for the
device that is being instantiated it's probably not going to be
anything scalable since that's where we generally put our knowledge of a
given bit of silicon.

> >  I'm not sure what you think "the platform" is here but it sounds
> > awfully like the sort of random board specific bodge code that people
> > currently use - something has got to know what's needed to get the
> > device up and running and how to do it and the device driver seems like
> > the sensible place to do that.

> Just the reverse.  The driver should deal with things it knows about:  
> how to discover and enumerate devices on its bus.  It should not

For a bus controller of course, they should be totally out of this.

> contain anything platform-specific.  Adding this in would be a
> logistical nightmare -- you'd have to stuff power-on procedures for all
> sorts of different platforms into this one poor driver!

No, this really is something that's very much generic to the device and
will apply to anywhere the silicon is used.  The power on process for a
device isn't something that changes, the mapping of resources that might
be used in that sequence is but we've got good abstractions for pretty
much all the resources that a device might need - clocks, power, GPIOs
and so on - which do the mapping of those resources onto the device at
board level so neither the provider not the user need to know about it.
That's just data and is much easier to encode in DT or equivalent than
actual sequences.

We've got a bunch of existing drivers in the kernel which do this sort
of stuff, they ask for resources and then know what to do with them and
can also make use of these resources at runtime if they want.

> > I think I completely misunderstood what you mean by powering up on
> > initial use.  If you're saying that we should have some platform code
> > for doing this I don't think that's a scalable solution.

> How can it be avoided?  The powering-up operation is platform-specific.  
> By definition, whatever code carries out the operation is platform
> code.

Like I say device power management isn't system specific, it's silicon
specific - think of what's in the driver as being the power up sequence
from the datasheet.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-15 22:54                                       ` Mark Brown
@ 2013-08-16 14:42                                         ` Alan Stern
  2013-08-16 18:39                                           ` Mark Brown
  0 siblings, 1 reply; 54+ messages in thread
From: Alan Stern @ 2013-08-16 14:42 UTC (permalink / raw)
  To: Mark Brown
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

On Thu, 15 Aug 2013, Mark Brown wrote:

> No, this really is something that's very much generic to the device and
> will apply to anywhere the silicon is used.  The power on process for a
> device isn't something that changes, the mapping of resources that might
> be used in that sequence is but we've got good abstractions for pretty
> much all the resources that a device might need - clocks, power, GPIOs
> and so on - which do the mapping of those resources onto the device at
> board level so neither the provider not the user need to know about it.
> That's just data and is much easier to encode in DT or equivalent than
> actual sequences.
> 
> We've got a bunch of existing drivers in the kernel which do this sort
> of stuff, they ask for resources and then know what to do with them and
> can also make use of these resources at runtime if they want.

Okay, let's see if I understand your problem.  You've got a driver that
knows how to manage its devices, including how to power them on and
off.  But the driver can't bind to one of these devices until the
device has appeared on the bus and been enumerated, and that won't
happen until the device has been powered on.  It's a chicken-and-egg
sort of thing.

You know about the existence of these devices beforehand because that
knowledge is encapsulated in platform information somewhere.  The
question is how best to use this information to solve the
chicken-and-egg problem.

Is that it?

One possible answer is to use the platform information to (partially)  
instantiate the device before it has been detected, so that the driver
can bind to it.  Another is to use the platform information to perform
an initial power-up of the device, so that it can be detected,
enumerated, and probed in the normal manner.

The difficulty with the first proposal is that subsystems aren't
designed to allow that sort of thing.  They expect to be able to
communicate with the devices they manage, during enumeration and
probing at least.  The difficulty with the second proposal is that it
requires duplicating the power-on code.

My feeling is that the second answer involves less work and less
complexity than the first.  Both proposals require additional
"run-once" code (to do the partial instantiations or the initial
power-ons), but the first proposal also requires the subsystem's 
detection and enumeration routines to be adjusted so that they can work 
even when the device is incommunicado.

(The second proposal also has the advantage that the power-on code may 
be shared between the driver and the subsystem.)

Alan Stern


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-16 14:42                                         ` Alan Stern
@ 2013-08-16 18:39                                           ` Mark Brown
  2013-08-16 19:27                                               ` Alan Stern
  0 siblings, 1 reply; 54+ messages in thread
From: Mark Brown @ 2013-08-16 18:39 UTC (permalink / raw)
  To: Alan Stern
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 1455 bytes --]

On Fri, Aug 16, 2013 at 10:42:10AM -0400, Alan Stern wrote:

> Okay, let's see if I understand your problem.  You've got a driver that
...
> Is that it?

Yes, I think that's it.

> The difficulty with the first proposal is that subsystems aren't
> designed to allow that sort of thing.  They expect to be able to
> communicate with the devices they manage, during enumeration and
> probing at least.  The difficulty with the second proposal is that it
> requires duplicating the power-on code.

> My feeling is that the second answer involves less work and less
> complexity than the first.  Both proposals require additional
> "run-once" code (to do the partial instantiations or the initial
> power-ons), but the first proposal also requires the subsystem's 
> detection and enumeration routines to be adjusted so that they can work 
> even when the device is incommunicado.

Right, but like I say I'm not sure that the modifications required are
substantially different to those for handling a device powering up and
down on the bus or those for getting platform data to a device when it
does enumerate.  I'd also not be so sure about the run once code, that
is only the case for devices that can't completely idle themselves at
runtime.

> (The second proposal also has the advantage that the power-on code may 
> be shared between the driver and the subsystem.)

Can you explain in more detail please, I don't follow?

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-16 18:39                                           ` Mark Brown
@ 2013-08-16 19:27                                               ` Alan Stern
  0 siblings, 0 replies; 54+ messages in thread
From: Alan Stern @ 2013-08-16 19:27 UTC (permalink / raw)
  To: Mark Brown
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

On Fri, 16 Aug 2013, Mark Brown wrote:

> > The difficulty with the first proposal is that subsystems aren't
> > designed to allow that sort of thing.  They expect to be able to
> > communicate with the devices they manage, during enumeration and
> > probing at least.  The difficulty with the second proposal is that it
> > requires duplicating the power-on code.
> 
> > My feeling is that the second answer involves less work and less
> > complexity than the first.  Both proposals require additional
> > "run-once" code (to do the partial instantiations or the initial
> > power-ons), but the first proposal also requires the subsystem's 
> > detection and enumeration routines to be adjusted so that they can work 
> > even when the device is incommunicado.
> 
> Right, but like I say I'm not sure that the modifications required are
> substantially different to those for handling a device powering up and
> down on the bus

I believe they are.  At the very least, a larger set of modifications
would be needed, because the subsystem's device-init and enumeration
routines would have to be changed to work with a powered-down device,
as would the driver's probe routine.  Whereas handling a device
powering up and down on the bus merely requires the subsystem's
connection-change routine to be modified.

>  or those for getting platform data to a device when it
> does enumerate.

?  I can't make any sense out of that comment.  For one thing, why do
you need to send platform data to a device?  (It's obvious that a
_driver_ would need to use platform data; it's not so clear that a
_device_ would.)

But even assuming you really do need to send platform data to the
device when it enumerates, don't the subsystem and driver already take
care of sending this data?  If they didn't then presumably the device
wouldn't be usable.  Therefore it seems that _no_ modifications should
be needed for this purpose.

>  I'd also not be so sure about the run once code, that
> is only the case for devices that can't completely idle themselves at
> runtime.
> 
> > (The second proposal also has the advantage that the power-on code may 
> > be shared between the driver and the subsystem.)
> 
> Can you explain in more detail please, I don't follow?

Let's say the subsystem powers up the device when the bus is first
registered, so that the device can be detected and enumerated.  Let's
also say that the driver wants to power-off and power-on the device
from time to time, as part of normal runtime PM.  Then instead of
having its own power-on routine (which would be code duplication), the
driver can simply call the subsystem's power-on routine.  (Of course,
this would mean that the routine would no longer be run-once.)

Alan Stern


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
@ 2013-08-16 19:27                                               ` Alan Stern
  0 siblings, 0 replies; 54+ messages in thread
From: Alan Stern @ 2013-08-16 19:27 UTC (permalink / raw)
  To: Mark Brown
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

On Fri, 16 Aug 2013, Mark Brown wrote:

> > The difficulty with the first proposal is that subsystems aren't
> > designed to allow that sort of thing.  They expect to be able to
> > communicate with the devices they manage, during enumeration and
> > probing at least.  The difficulty with the second proposal is that it
> > requires duplicating the power-on code.
> 
> > My feeling is that the second answer involves less work and less
> > complexity than the first.  Both proposals require additional
> > "run-once" code (to do the partial instantiations or the initial
> > power-ons), but the first proposal also requires the subsystem's 
> > detection and enumeration routines to be adjusted so that they can work 
> > even when the device is incommunicado.
> 
> Right, but like I say I'm not sure that the modifications required are
> substantially different to those for handling a device powering up and
> down on the bus

I believe they are.  At the very least, a larger set of modifications
would be needed, because the subsystem's device-init and enumeration
routines would have to be changed to work with a powered-down device,
as would the driver's probe routine.  Whereas handling a device
powering up and down on the bus merely requires the subsystem's
connection-change routine to be modified.

>  or those for getting platform data to a device when it
> does enumerate.

?  I can't make any sense out of that comment.  For one thing, why do
you need to send platform data to a device?  (It's obvious that a
_driver_ would need to use platform data; it's not so clear that a
_device_ would.)

But even assuming you really do need to send platform data to the
device when it enumerates, don't the subsystem and driver already take
care of sending this data?  If they didn't then presumably the device
wouldn't be usable.  Therefore it seems that _no_ modifications should
be needed for this purpose.

>  I'd also not be so sure about the run once code, that
> is only the case for devices that can't completely idle themselves at
> runtime.
> 
> > (The second proposal also has the advantage that the power-on code may 
> > be shared between the driver and the subsystem.)
> 
> Can you explain in more detail please, I don't follow?

Let's say the subsystem powers up the device when the bus is first
registered, so that the device can be detected and enumerated.  Let's
also say that the driver wants to power-off and power-on the device
from time to time, as part of normal runtime PM.  Then instead of
having its own power-on routine (which would be code duplication), the
driver can simply call the subsystem's power-on routine.  (Of course,
this would mean that the routine would no longer be run-once.)

Alan Stern


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-16 19:27                                               ` Alan Stern
  (?)
@ 2013-08-16 20:00                                               ` Mark Brown
  2013-08-16 20:39                                                   ` Alan Stern
  -1 siblings, 1 reply; 54+ messages in thread
From: Mark Brown @ 2013-08-16 20:00 UTC (permalink / raw)
  To: Alan Stern
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 1452 bytes --]

On Fri, Aug 16, 2013 at 03:27:58PM -0400, Alan Stern wrote:
> On Fri, 16 Aug 2013, Mark Brown wrote:

> >  or those for getting platform data to a device when it
> > does enumerate.

> ?  I can't make any sense out of that comment.  For one thing, why do
> you need to send platform data to a device?  (It's obvious that a
> _driver_ would need to use platform data; it's not so clear that a
> _device_ would.)

The device in this context is a running instance of the driver.

> > > (The second proposal also has the advantage that the power-on code may 
> > > be shared between the driver and the subsystem.)

> > Can you explain in more detail please, I don't follow?

> Let's say the subsystem powers up the device when the bus is first
> registered, so that the device can be detected and enumerated.  Let's
> also say that the driver wants to power-off and power-on the device
> from time to time, as part of normal runtime PM.  Then instead of
> having its own power-on routine (which would be code duplication), the
> driver can simply call the subsystem's power-on routine.  (Of course,
> this would mean that the routine would no longer be run-once.)

Oh, OK.  I don't think that's a meaningful difference, the driver is
going to have the code and be able to reuse it one way or another
anyway.  In many cases if the device has been in a low power idle mode a
slightly difference sequence would be needed anyway.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-16 20:00                                               ` Mark Brown
@ 2013-08-16 20:39                                                   ` Alan Stern
  0 siblings, 0 replies; 54+ messages in thread
From: Alan Stern @ 2013-08-16 20:39 UTC (permalink / raw)
  To: Mark Brown
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

On Fri, 16 Aug 2013, Mark Brown wrote:

> On Fri, Aug 16, 2013 at 03:27:58PM -0400, Alan Stern wrote:
> > On Fri, 16 Aug 2013, Mark Brown wrote:
> 
> > >  or those for getting platform data to a device when it
> > > does enumerate.
> 
> > ?  I can't make any sense out of that comment.  For one thing, why do
> > you need to send platform data to a device?  (It's obvious that a
> > _driver_ would need to use platform data; it's not so clear that a
> > _device_ would.)
> 
> The device in this context is a running instance of the driver.

It's kind of difficult to understand what you're saying.  Obviously the
literal meaning is not what you had in mind, because a device can't be
a driver (or even a running instance of a driver).  Maybe you meant
that the word "device" above should have been the word "driver".

So you seem to be saying that significant modifications would be needed 
to get platform information to the driver.  I don't see why.  Lots and 
lots of drivers use platform information right now.

Besides, you need to get the platform information to the driver in any 
case, no matter how you decide to solve the chicken-and-egg problem.  
It shouldn't be a factor in deciding which solution to use.

Alan Stern


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
@ 2013-08-16 20:39                                                   ` Alan Stern
  0 siblings, 0 replies; 54+ messages in thread
From: Alan Stern @ 2013-08-16 20:39 UTC (permalink / raw)
  To: Mark Brown
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

On Fri, 16 Aug 2013, Mark Brown wrote:

> On Fri, Aug 16, 2013 at 03:27:58PM -0400, Alan Stern wrote:
> > On Fri, 16 Aug 2013, Mark Brown wrote:
> 
> > >  or those for getting platform data to a device when it
> > > does enumerate.
> 
> > ?  I can't make any sense out of that comment.  For one thing, why do
> > you need to send platform data to a device?  (It's obvious that a
> > _driver_ would need to use platform data; it's not so clear that a
> > _device_ would.)
> 
> The device in this context is a running instance of the driver.

It's kind of difficult to understand what you're saying.  Obviously the
literal meaning is not what you had in mind, because a device can't be
a driver (or even a running instance of a driver).  Maybe you meant
that the word "device" above should have been the word "driver".

So you seem to be saying that significant modifications would be needed 
to get platform information to the driver.  I don't see why.  Lots and 
lots of drivers use platform information right now.

Besides, you need to get the platform information to the driver in any 
case, no matter how you decide to solve the chicken-and-egg problem.  
It shouldn't be a factor in deciding which solution to use.

Alan Stern


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-16 20:39                                                   ` Alan Stern
  (?)
@ 2013-08-16 22:46                                                   ` Mark Brown
  2013-08-17  1:29                                                       ` Alan Stern
  -1 siblings, 1 reply; 54+ messages in thread
From: Mark Brown @ 2013-08-16 22:46 UTC (permalink / raw)
  To: Alan Stern
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 1389 bytes --]

On Fri, Aug 16, 2013 at 04:39:47PM -0400, Alan Stern wrote:
> On Fri, 16 Aug 2013, Mark Brown wrote:

> > The device in this context is a running instance of the driver.

> It's kind of difficult to understand what you're saying.  Obviously the
> literal meaning is not what you had in mind, because a device can't be
> a driver (or even a running instance of a driver).  Maybe you meant
> that the word "device" above should have been the word "driver".

I don't think using device to refer to an instance of the running driver
is that obscure a usage to be honest...

> So you seem to be saying that significant modifications would be needed 
> to get platform information to the driver.  I don't see why.  Lots and 
> lots of drivers use platform information right now.

> Besides, you need to get the platform information to the driver in any 
> case, no matter how you decide to solve the chicken-and-egg problem.  
> It shouldn't be a factor in deciding which solution to use.

It's not that this is hard, it's that I don't see how if you already
have some concept of the device in the kernel data structures (which you
must have in order to be able to provide platform data when it's needed)
anything is gained by not using that when dealing with bootstrapping
issues.

Anyway, I think it's time to try to implement something rather than talk
about it.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-16 22:46                                                   ` Mark Brown
@ 2013-08-17  1:29                                                       ` Alan Stern
  0 siblings, 0 replies; 54+ messages in thread
From: Alan Stern @ 2013-08-17  1:29 UTC (permalink / raw)
  To: Mark Brown
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

On Fri, 16 Aug 2013, Mark Brown wrote:

> > Besides, you need to get the platform information to the driver in any 
> > case, no matter how you decide to solve the chicken-and-egg problem.  
> > It shouldn't be a factor in deciding which solution to use.
> 
> It's not that this is hard, it's that I don't see how if you already
> have some concept of the device in the kernel data structures (which you
> must have in order to be able to provide platform data when it's needed)
> anything is gained by not using that when dealing with bootstrapping
> issues.

I agree.  In fact, there's no choice but to use this device concept
during startup.  Otherwise there's no way to get the platform data to
the driver when it is needed, because there's no way to tell which
device the data applies to.  The question is how elaborate the concept
needs to be and how it gets used.

Aong those lines, I would like to point out that the device concept
embodied in the kernel's data structures can be pretty thin.  For
example, it might be little more than a port number or bus address.

> Anyway, I think it's time to try to implement something rather than talk
> about it.

Hopefully this discussion has given you some ideas for alternative 
approachs, or at least helped to solidify your ideas.

Alan Stern


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
@ 2013-08-17  1:29                                                       ` Alan Stern
  0 siblings, 0 replies; 54+ messages in thread
From: Alan Stern @ 2013-08-17  1:29 UTC (permalink / raw)
  To: Mark Brown
  Cc: Greg Kroah-Hartman, Rob Herring, Pawel Moll, Mark Rutland,
	Stephen Warren, Ian Campbell, Felipe Balbi, Grant Likely,
	devicetree, linux-usb, linux-kernel

On Fri, 16 Aug 2013, Mark Brown wrote:

> > Besides, you need to get the platform information to the driver in any 
> > case, no matter how you decide to solve the chicken-and-egg problem.  
> > It shouldn't be a factor in deciding which solution to use.
> 
> It's not that this is hard, it's that I don't see how if you already
> have some concept of the device in the kernel data structures (which you
> must have in order to be able to provide platform data when it's needed)
> anything is gained by not using that when dealing with bootstrapping
> issues.

I agree.  In fact, there's no choice but to use this device concept
during startup.  Otherwise there's no way to get the platform data to
the driver when it is needed, because there's no way to tell which
device the data applies to.  The question is how elaborate the concept
needs to be and how it gets used.

Aong those lines, I would like to point out that the device concept
embodied in the kernel's data structures can be pretty thin.  For
example, it might be little more than a port number or bus address.

> Anyway, I think it's time to try to implement something rather than talk
> about it.

Hopefully this discussion has given you some ideas for alternative 
approachs, or at least helped to solidify your ideas.

Alan Stern


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-17  1:29                                                       ` Alan Stern
  (?)
@ 2013-08-19 12:17                                                       ` Ming Lei
  2013-08-19 16:01                                                         ` Mark Brown
  -1 siblings, 1 reply; 54+ messages in thread
From: Ming Lei @ 2013-08-19 12:17 UTC (permalink / raw)
  To: Alan Stern
  Cc: Mark Brown, Greg Kroah-Hartman, Rob Herring, Pawel Moll,
	Mark Rutland, Stephen Warren, Ian Campbell, Felipe Balbi,
	Grant Likely, devicetree, linux-usb, Linux Kernel Mailing List

On Sat, Aug 17, 2013 at 9:29 AM, Alan Stern <stern@rowland.harvard.edu> wrote:
> On Fri, 16 Aug 2013, Mark Brown wrote:
>
>> > Besides, you need to get the platform information to the driver in any
>> > case, no matter how you decide to solve the chicken-and-egg problem.
>> > It shouldn't be a factor in deciding which solution to use.
>>
>> It's not that this is hard, it's that I don't see how if you already
>> have some concept of the device in the kernel data structures (which you
>> must have in order to be able to provide platform data when it's needed)
>> anything is gained by not using that when dealing with bootstrapping
>> issues.
>
> I agree.  In fact, there's no choice but to use this device concept
> during startup.  Otherwise there's no way to get the platform data to
> the driver when it is needed, because there's no way to tell which
> device the data applies to.  The question is how elaborate the concept
> needs to be and how it gets used.
>
> Aong those lines, I would like to point out that the device concept
> embodied in the kernel's data structures can be pretty thin.  For
> example, it might be little more than a port number or bus address.

Maybe the principle behind drivers/usb/core/usb-acpi.c is helpful
for the problem, and DT may refer to ACPI to describe on-board
USB devices, and the way to retrieve platform data too.

>> Anyway, I think it's time to try to implement something rather than talk
>> about it.
>
> Hopefully this discussion has given you some ideas for alternative
> approachs, or at least helped to solidify your ideas.


Thanks,
-- 
Ming Lei

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-19 12:17                                                       ` Ming Lei
@ 2013-08-19 16:01                                                         ` Mark Brown
  2013-08-20 13:19                                                           ` Ming Lei
  0 siblings, 1 reply; 54+ messages in thread
From: Mark Brown @ 2013-08-19 16:01 UTC (permalink / raw)
  To: Ming Lei
  Cc: Alan Stern, Greg Kroah-Hartman, Rob Herring, Pawel Moll,
	Mark Rutland, Stephen Warren, Ian Campbell, Felipe Balbi,
	Grant Likely, devicetree, linux-usb, Linux Kernel Mailing List

[-- Attachment #1: Type: text/plain, Size: 814 bytes --]

On Mon, Aug 19, 2013 at 08:17:53PM +0800, Ming Lei wrote:
> On Sat, Aug 17, 2013 at 9:29 AM, Alan Stern <stern@rowland.harvard.edu> wrote:

> > Aong those lines, I would like to point out that the device concept
> > embodied in the kernel's data structures can be pretty thin.  For
> > example, it might be little more than a port number or bus address.

> Maybe the principle behind drivers/usb/core/usb-acpi.c is helpful
> for the problem, and DT may refer to ACPI to describe on-board
> USB devices, and the way to retrieve platform data too.

I can't parse this at all well - why would DT want to refer to ACPI, do
you mean people may wish to look at the code as an example?  As Grant
noted DT already has some mechanisms for enumerable buses which looking
at the code appears to be broadly what that's doing.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-19 16:01                                                         ` Mark Brown
@ 2013-08-20 13:19                                                           ` Ming Lei
  2013-08-20 15:02                                                             ` Mark Brown
  0 siblings, 1 reply; 54+ messages in thread
From: Ming Lei @ 2013-08-20 13:19 UTC (permalink / raw)
  To: Mark Brown
  Cc: Alan Stern, Greg Kroah-Hartman, Rob Herring, Pawel Moll,
	Mark Rutland, Stephen Warren, Ian Campbell, Felipe Balbi,
	Grant Likely, devicetree, linux-usb, Linux Kernel Mailing List

On Tue, Aug 20, 2013 at 12:01 AM, Mark Brown <broonie@kernel.org> wrote:
> On Mon, Aug 19, 2013 at 08:17:53PM +0800, Ming Lei wrote:
>> On Sat, Aug 17, 2013 at 9:29 AM, Alan Stern <stern@rowland.harvard.edu> wrote:
>
>> > Aong those lines, I would like to point out that the device concept
>> > embodied in the kernel's data structures can be pretty thin.  For
>> > example, it might be little more than a port number or bus address.
>
>> Maybe the principle behind drivers/usb/core/usb-acpi.c is helpful
>> for the problem, and DT may refer to ACPI to describe on-board
>> USB devices, and the way to retrieve platform data too.
>
> I can't parse this at all well - why would DT want to refer to ACPI, do
> you mean people may wish to look at the code as an example?  As Grant

I mean usb-acpi provides one approach to retrieve platform data for USB device
during device enumeration, and the idea might be helpful for you to implement
similar things based on DT.

> noted DT already has some mechanisms for enumerable buses which looking
> at the code appears to be broadly what that's doing.

If the mechanism is ready now, so looks you might post code for review
and discussion?


Thanks,
-- 
Ming Lei

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: Non-enumerable devices on USB and other enumerable buses
  2013-08-20 13:19                                                           ` Ming Lei
@ 2013-08-20 15:02                                                             ` Mark Brown
  0 siblings, 0 replies; 54+ messages in thread
From: Mark Brown @ 2013-08-20 15:02 UTC (permalink / raw)
  To: Ming Lei
  Cc: Alan Stern, Greg Kroah-Hartman, Rob Herring, Pawel Moll,
	Mark Rutland, Stephen Warren, Ian Campbell, Felipe Balbi,
	Grant Likely, devicetree, linux-usb, Linux Kernel Mailing List

[-- Attachment #1: Type: text/plain, Size: 1071 bytes --]

On Tue, Aug 20, 2013 at 09:19:07PM +0800, Ming Lei wrote:
> On Tue, Aug 20, 2013 at 12:01 AM, Mark Brown <broonie@kernel.org> wrote:

> > I can't parse this at all well - why would DT want to refer to ACPI, do
> > you mean people may wish to look at the code as an example?  As Grant

> I mean usb-acpi provides one approach to retrieve platform data for USB device
> during device enumeration, and the idea might be helpful for you to implement
> similar things based on DT.

Ah, OK.

> > noted DT already has some mechanisms for enumerable buses which looking
> > at the code appears to be broadly what that's doing.

> If the mechanism is ready now, so looks you might post code for review
> and discussion?

There's nothing there for the problem I'm talking about here (devices
that haven't been enumerated yet) and I don't off the top of my head
know if the enumerated case is supported by any buses in Linux yet.  It
is part of the DT specifications and has been implemented on other OSs
but I'd need to go check if Linux actually went and implemented any of
that.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

end of thread, other threads:[~2013-08-20 15:51 UTC | newest]

Thread overview: 54+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-08-11 19:08 Non-enumerable devices on USB and other enumerable buses Mark Brown
2013-08-11 22:08 ` Grant Likely
2013-08-12 14:41   ` Mark Brown
2013-08-12  1:53 ` Alan Stern
2013-08-12  9:51   ` Mark Brown
2013-08-12 11:07     ` Mark Rutland
2013-08-12 11:32       ` Mark Brown
2013-08-12 18:08       ` Stephen Warren
2013-08-12 20:38         ` Mark Brown
2013-08-12  2:02 ` Greg Kroah-Hartman
2013-08-12 11:23   ` Mark Brown
2013-08-12 20:50     ` Greg Kroah-Hartman
2013-08-12 21:40       ` Mark Brown
2013-08-13  1:04         ` Alan Stern
2013-08-14 11:38           ` Mark Brown
2013-08-14 14:27             ` Alan Stern
2013-08-14 14:27               ` Alan Stern
2013-08-14 15:39               ` Mark Brown
2013-08-14 16:14                 ` Alan Stern
2013-08-14 16:14                   ` Alan Stern
2013-08-14 16:30                   ` Stephen Warren
2013-08-14 18:49                     ` Mark Brown
2013-08-14 17:30                   ` Mark Brown
2013-08-14 18:35                     ` Alan Stern
2013-08-14 18:35                       ` Alan Stern
2013-08-14 18:46                       ` Mark Brown
2013-08-14 19:39                         ` Alan Stern
2013-08-14 19:39                           ` Alan Stern
2013-08-14 20:16                           ` Paul Zimmerman
2013-08-14 23:59                             ` Mark Brown
2013-08-14 23:55                           ` Mark Brown
2013-08-15 14:42                             ` Alan Stern
2013-08-15 14:42                               ` Alan Stern
2013-08-15 17:10                               ` Mark Brown
2013-08-15 17:55                                 ` Alan Stern
2013-08-15 17:55                                   ` Alan Stern
2013-08-15 19:32                                   ` Mark Brown
2013-08-15 20:42                                     ` Alan Stern
2013-08-15 20:42                                       ` Alan Stern
2013-08-15 22:54                                       ` Mark Brown
2013-08-16 14:42                                         ` Alan Stern
2013-08-16 18:39                                           ` Mark Brown
2013-08-16 19:27                                             ` Alan Stern
2013-08-16 19:27                                               ` Alan Stern
2013-08-16 20:00                                               ` Mark Brown
2013-08-16 20:39                                                 ` Alan Stern
2013-08-16 20:39                                                   ` Alan Stern
2013-08-16 22:46                                                   ` Mark Brown
2013-08-17  1:29                                                     ` Alan Stern
2013-08-17  1:29                                                       ` Alan Stern
2013-08-19 12:17                                                       ` Ming Lei
2013-08-19 16:01                                                         ` Mark Brown
2013-08-20 13:19                                                           ` Ming Lei
2013-08-20 15:02                                                             ` Mark Brown

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.