]> git.dujemihanovic.xyz Git - u-boot.git/log
u-boot.git
9 years agodm: usb: sandbox: Add a uclass for USB device emulation
Simon Glass [Wed, 25 Mar 2015 18:22:37 +0000 (12:22 -0600)]
dm: usb: sandbox: Add a uclass for USB device emulation

With sandbox we want to be able to emulate USB devices so that we can test
the USB stack. Add a uclass to support this. It implements the same
operations as a normal USB device driver, but in this case passes them on
to an emulation driver.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Move struct usb_string to a common place
Simon Glass [Wed, 25 Mar 2015 18:22:36 +0000 (12:22 -0600)]
dm: usb: Move struct usb_string to a common place

This is needed for sandbox USB device emulation, so move it to a place
where it can be found by things other than gadgets.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: tegra: Add vbus GPIOs for nyan
Simon Glass [Wed, 25 Mar 2015 18:22:35 +0000 (12:22 -0600)]
dm: usb: tegra: Add vbus GPIOs for nyan

These are needed to enable the USB bus (although not sufficient since it
still does not work).

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Support driver model with USB keyboards
Simon Glass [Wed, 25 Mar 2015 18:22:34 +0000 (12:22 -0600)]
dm: usb: Support driver model with USB keyboards

Allow USB keyboards to work with driver model. The main difference is that
we can have multiple buses (each with its own device numbering) and each
bus must be scanned.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Split out the keyboard probe into its own function
Simon Glass [Wed, 25 Mar 2015 18:22:33 +0000 (12:22 -0600)]
dm: usb: Split out the keyboard probe into its own function

Before adding driver model support, split out code from this over-long
function.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Allow setting up a USB controller as a device/gadget
Simon Glass [Wed, 25 Mar 2015 18:22:32 +0000 (12:22 -0600)]
dm: usb: Allow setting up a USB controller as a device/gadget

Some controllers support OTG (on-the-go) where they can operate as either
host or device. The gadget layer in U-Boot supports this.

While this layer does not interact with driver model, we can provide a
function which sets up the controller in the correct way. This way the code
at least builds (although it likely will not work).

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Bind generic USB devices when there is no driver
Simon Glass [Wed, 25 Mar 2015 18:22:31 +0000 (12:22 -0600)]
dm: usb: Bind generic USB devices when there is no driver

At present USB devices with no driver model driver cannot be seen in the
device list, and we fail to set them up correctly. This means they cannot
be used.

While having real drivers that support driver model for all USB devices
is the eventual goal, we are not there yet.

As a stop-gap, add a generic USB driver which is bound when we do not have
a real driver. This allows the device to be set up and shown on the bus.
It also allows ad-hoc code (such as usb_ether) to find these devices and
set them up.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Allow USB drivers to be declared and auto-probed
Simon Glass [Wed, 25 Mar 2015 18:22:30 +0000 (12:22 -0600)]
dm: usb: Allow USB drivers to be declared and auto-probed

USB devices in U-Boot are currently probed only after all devices have
been enumerated. Each type of device is probed by custom code, e.g.:

- USB storage
- Keyboard
- Ethernet

With driver model this approach doesn't work very well. We could build
a picture of the bus and then go back and add the devices later, but
this means that the data structures are incomplete for quite a while.
It also does not follow the model of being able to bind a device when we
discover it.

We would prefer to have devices automatically be bound as the device is
enumerated. This allows us to attach drivers to particular USB classes
or product/vendor IDs. This is the method used by Linux.

Add the required #defines from Linux, a way of declaring a USB driver and
the logic to locate the correct driver given the USB device's descriptors.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Add driver model support to EHCI
Simon Glass [Wed, 25 Mar 2015 18:22:29 +0000 (12:22 -0600)]
dm: usb: Add driver model support to EHCI

Add a way for EHCI controller drivers to support driver model. Drivers can
call ehci_register() to register themselves in their probe() methods.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Change ehci_reset() to use a pointer
Simon Glass [Wed, 25 Mar 2015 18:22:28 +0000 (12:22 -0600)]
dm: usb: Change ehci_reset() to use a pointer

The index cannot be used with driver model, and isn't needed anyway. Change
the parameter to a pointer.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Drop the EHCI weak functions
Simon Glass [Wed, 25 Mar 2015 18:22:27 +0000 (12:22 -0600)]
dm: usb: Drop the EHCI weak functions

These are a pain with driver model because we might have different EHCI
drivers which want to implement them differently. Now that they use
consistent function signatures, we can in good conscience move them to
a struct.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
Fix non-driver-model EHCI to set up the EHCI operations correctly:
Signed-off-by: Tom Rini <trini@konsulko.com>
9 years agodm: usb: Refactor EHCI init
Simon Glass [Wed, 25 Mar 2015 18:22:26 +0000 (12:22 -0600)]
dm: usb: Refactor EHCI init

Move the bulk of the code in usb_lowlevel_init() into a separate function
which will also be used by driver model. Keep the CONFIG options out of
this function by providing a tweak flag for Faraday. We need to avoid using
CONFIG options in driver model code where possible, since it makes it
impossible to use multiple controllers in that code where they have
different options.

The CONFIG_EHCI_HCD_INIT_AFTER_RESET option is also kept out of the
common init function. With driver model the controller will be able to
perform this extra init itself after registering with the EHCI layer.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: ehci: Use a function to find the controller from struct udevice
Simon Glass [Wed, 25 Mar 2015 18:22:25 +0000 (12:22 -0600)]
dm: usb: ehci: Use a function to find the controller from struct udevice

With driver model we want to remove the controller pointer in struct udevice
and use driver model data structures instead. To prepare for this, move
access to this field to a function which can provide a different
implementation for driver model.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Pass EHCI controller pointer to ehci_get_portsc_register()
Simon Glass [Wed, 25 Mar 2015 18:22:24 +0000 (12:22 -0600)]
dm: usb: Pass EHCI controller pointer to ehci_get_portsc_register()

Adjust this function so that it is passed an EHCI controller pointer so that
implementations can look up their controller. This makes the weak functions
use a consistent API.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Pass EHCI controller pointer to ehci_set_usbmode()
Simon Glass [Wed, 25 Mar 2015 18:22:23 +0000 (12:22 -0600)]
dm: usb: Pass EHCI controller pointer to ehci_set_usbmode()

Adjust this function so that it is passed an EHCI controller pointer so that
implementations can look up their controller. This makes the weak functions
use a consistent API.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: tegra: Drop use of global controller variable
Simon Glass [Wed, 25 Mar 2015 18:22:22 +0000 (12:22 -0600)]
dm: usb: tegra: Drop use of global controller variable

We don't need this anymore, so adjust the code to avoid using it.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Pass EHCI controller pointer to ehci_powerup_fixup()
Simon Glass [Wed, 25 Mar 2015 18:22:21 +0000 (12:22 -0600)]
dm: usb: Pass EHCI controller pointer to ehci_powerup_fixup()

Adjust this function so that it is passed an EHCI controller pointer so that
implementations can look up their controller.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: tegra: Store the controller type explicitly
Simon Glass [Wed, 25 Mar 2015 18:22:20 +0000 (12:22 -0600)]
dm: usb: tegra: Store the controller type explicitly

At present the tegra driver uses a separate pointer to know which controller
type is in use. This works because only one controller type is used at a
time.

With driver model we want to make the controller state hermetic in the sense
that it is not necessary to look elsewhere to know the controller type. This
will permit a controller to implement the EHCI weak functions without
reference to global data structures.

To achieve this, define an enum for the controller type and store it with
the information on each EHCI controller.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Allow ECHI to hold private data for the controller
Simon Glass [Wed, 25 Mar 2015 18:22:19 +0000 (12:22 -0600)]
dm: usb: Allow ECHI to hold private data for the controller

Add a private data pointer that clients of EHCI can use to access their
private information. This establishes a link between struct ehci_ctrl and
its associated controller data structure.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Pass EHCI controller pointer to ehci_get_port_speed()
Simon Glass [Wed, 25 Mar 2015 18:22:18 +0000 (12:22 -0600)]
dm: usb: Pass EHCI controller pointer to ehci_get_port_speed()

Adjust this function so that it is passed an EHCI controller pointer so that
implementations can look up their controller.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Move all the EHCI weak functions together and declare them
Simon Glass [Wed, 25 Mar 2015 18:22:17 +0000 (12:22 -0600)]
dm: usb: Move all the EHCI weak functions together and declare them

Put these at the top of the file so they are in one place. Also add function
prototypes to the header file to avoid call site mismatches.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Convert usb_storage to driver model
Simon Glass [Wed, 25 Mar 2015 18:22:16 +0000 (12:22 -0600)]
dm: usb: Convert usb_storage to driver model

Add support for scanning USB storage devices with driver model. This mostly
involves adding a USB device ID for storage devices.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Move storage device scanning into its own function
Simon Glass [Wed, 25 Mar 2015 18:22:15 +0000 (12:22 -0600)]
dm: usb: Move storage device scanning into its own function

The usb_stor_scan() function is quite long, so split out the code that scans
each device into its own function. Also, rather than setting up the block
device list once at the start, set it up as each device is scanned. This
makes it possible to use this code from driver model.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agoRevert "usb_storage : scan all interfaces to find a storage device"
Simon Glass [Thu, 16 Apr 2015 23:27:34 +0000 (17:27 -0600)]
Revert "usb_storage : scan all interfaces to find a storage device"

This reverts commit cd749658d5994978579628a6333e5c2a6c8ec632.

The conflicts with this commit are hard for me to figure out. I will re-apply
it later.

9 years agodm: usb: Adjust usb_storage to work with sandbox
Simon Glass [Wed, 25 Mar 2015 18:22:14 +0000 (12:22 -0600)]
dm: usb: Adjust usb_storage to work with sandbox

With a few tweaks we can compile this code with sandbox and enable testing
of the USB storage layer.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Simply device finding code in usb_storage
Simon Glass [Wed, 25 Mar 2015 18:22:13 +0000 (12:22 -0600)]
dm: usb: Simply device finding code in usb_storage

The for() loop is not needed since the value is immediately accessible.
Use this instead to simplify the code.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Fix type problems in usb_stor_get_info()
Simon Glass [Wed, 25 Mar 2015 18:22:12 +0000 (12:22 -0600)]
dm: usb: Fix type problems in usb_stor_get_info()

This function assumes that unsigned long is 32-bits wide, but it is not
on 64-bit machines. Use the correct type, and add a few debug() lines also.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Move USB storage definitions to usb_defs.h
Simon Glass [Wed, 25 Mar 2015 18:22:11 +0000 (12:22 -0600)]
dm: usb: Move USB storage definitions to usb_defs.h

These are better off in a header file so they can be used by other code (e.g.
the sandbox USB storage emulator).

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Add driver model support for hubs
Simon Glass [Wed, 25 Mar 2015 18:22:10 +0000 (12:22 -0600)]
dm: usb: Add driver model support for hubs

Adjust the existing hub code to support driver model, and add a USB driver
for hubs.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Split hub detection into its own function
Simon Glass [Wed, 25 Mar 2015 18:22:09 +0000 (12:22 -0600)]
dm: usb: Split hub detection into its own function

Split out the hub detection logic so it can be used by driver model. Also
adjust the code to return errors correctly.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Convert core usb.c file to support driver model
Simon Glass [Wed, 25 Mar 2015 18:22:08 +0000 (12:22 -0600)]
dm: usb: Convert core usb.c file to support driver model

Add the required #ifdefs and remove unwanted data structures so that the
USB uclass will be able to use this file.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Complete the splitting up of usb_new_device()
Simon Glass [Wed, 25 Mar 2015 18:22:07 +0000 (12:22 -0600)]
dm: usb: Complete the splitting up of usb_new_device()

This function now calls usb_setup_device() to set up the device and
usb_hub_probe() to check if it is a hub. The XHCI special case is now a
parameter to usb_setup_device(). The latter will be used by the USB uclass
when it is added, since it does not rely on any CONFIGs or legacy data
structures.

Signed-off-by: Simon Glass <sjg@chromium.org>
Bug-fixes for descriptor reading and usb_new_device() return value
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Marek Vasut <marex@denx.de>
Tested-by: Tom Rini <trini@konsulko.com>
9 years agodm: usb: Split out more code from usb_new_device()
Simon Glass [Wed, 25 Mar 2015 18:22:06 +0000 (12:22 -0600)]
dm: usb: Split out more code from usb_new_device()

Move the code that sets up the device with a new address into its own
function, usb_prepare_device().

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Move descriptor setup code into its own function
Simon Glass [Wed, 25 Mar 2015 18:22:05 +0000 (12:22 -0600)]
dm: usb: Move descriptor setup code into its own function

usb_new_device() is far too long and does far too much. As a first step, move
the code that does initial setup and reads a descriptor into its own function
called usb_setup_descriptor().

For XHCI the init order is different - we set up the device but don't
actually read the descriptor until after we set an address. Support this
option as a parameter to usb_setup_descriptor().

Avoid changing this torturous code more than necessary to make it easy to
review.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Refactor port resets
Simon Glass [Wed, 25 Mar 2015 18:22:04 +0000 (12:22 -0600)]
dm: usb: Refactor port resets

Move the port reset code into its own function. Rename usb_hub_reset() to
indicate that is is now a legacy function.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Drop the legacy USB init sequence
Simon Glass [Wed, 25 Mar 2015 18:22:03 +0000 (12:22 -0600)]
dm: usb: Drop the legacy USB init sequence

This CONFIG is not used anywhere in U-Boot, so drop it.

Signed-off-by: Simon Glass <sjg@chromium.org>
Acked-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Convert 'usb' command to support driver model
Simon Glass [Wed, 25 Mar 2015 18:22:02 +0000 (12:22 -0600)]
dm: usb: Convert 'usb' command to support driver model

Adjust this command to work with the new driver model uclass. It needs to
iterate through multiple independent controllers to find hubs, and work
through their children recursively in a different way. Otherwise the
functionality is much the same.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Adjust usb_alloc_new_device() to return an error
Simon Glass [Wed, 25 Mar 2015 18:22:01 +0000 (12:22 -0600)]
dm: usb: Adjust usb_alloc_new_device() to return an error

This function returns NULL on error at present. Adjust it so that we can
return a real error, as is needed with driver model. Also improve the
error handling in its caller, usb_hub_port_connect_change(), and adjust
the code order to prepare for driver model.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Adjust usb command to prepare for driver model
Simon Glass [Wed, 25 Mar 2015 18:22:00 +0000 (12:22 -0600)]
dm: usb: Adjust usb command to prepare for driver model

Use 'udev' instead of 'dev' in a few places, reserving 'dev' for driver
model's struct udevice. Also adjust the code in a few minor ways to make
it easier to plumb in driver model.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: usb: Add a uclass for USB controllers
Simon Glass [Wed, 25 Mar 2015 18:21:59 +0000 (12:21 -0600)]
dm: usb: Add a uclass for USB controllers

Add a uclass that can represent a USB controller. For now we do not create
devices for things attached to the controller. This will be added later.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: gpio: Add an implementation for gpio_get_number()
Simon Glass [Wed, 25 Mar 2015 18:21:58 +0000 (12:21 -0600)]
dm: gpio: Add an implementation for gpio_get_number()

This has a prototype but no implementation. It returns the global GPIO number
given a gpio_desc. It is useful for debugging in some cases.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: core: Add device children and sibling functions
Simon Glass [Wed, 25 Mar 2015 18:21:57 +0000 (12:21 -0600)]
dm: core: Add device children and sibling functions

Add some utility functions to check for children and for the last sibling in
a device's parent.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: core: Mark device as active before calling uclass probe() methods
Simon Glass [Wed, 25 Mar 2015 18:21:56 +0000 (12:21 -0600)]
dm: core: Mark device as active before calling uclass probe() methods

The uclass pre-probe functions may end up calling back into the device in
some circumstances. This can fail if recursion takes place. Adjust the
ordering so that we mark the device as active early, then retract this
later if needed.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: core: Rename driver data function to dev_get_driver_data()
Simon Glass [Wed, 25 Mar 2015 18:21:55 +0000 (12:21 -0600)]
dm: core: Rename driver data function to dev_get_driver_data()

The existing get_get_of_data() function provides access to both the driver's
compatible string and its driver data. However only the latter is actually
useful. Update the interface to reflect this and fix up existing users.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: core: Convert driver_bind() to use const
Simon Glass [Wed, 25 Mar 2015 18:21:54 +0000 (12:21 -0600)]
dm: core: Convert driver_bind() to use const

The driver is not modified by driver model, so update driver_bind() to
recognise that.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: core: Support allocating driver-private data for DMA
Simon Glass [Wed, 25 Mar 2015 18:21:53 +0000 (12:21 -0600)]
dm: core: Support allocating driver-private data for DMA

Some driver want to put DMA buffers in their private data. Add a flag
to tell driver model to align driver-private data to a cache boundary so
that DMA will work correctly in this case.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: test: bus: Use a local variable to simplify code
Simon Glass [Wed, 25 Mar 2015 18:21:51 +0000 (12:21 -0600)]
dm: test: bus: Use a local variable to simplify code

Adjust this test to avoid repeating the same code too often.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agosandbox: Fix comment for os_open()
Simon Glass [Wed, 25 Mar 2015 18:21:50 +0000 (12:21 -0600)]
sandbox: Fix comment for os_open()

This has the wrong #define in the function comment. Fix it.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agolinker_lists: Add a function to access a linker list entry
Simon Glass [Wed, 25 Mar 2015 18:21:49 +0000 (12:21 -0600)]
linker_lists: Add a function to access a linker list entry

Once declared, you cannot access a linker_list entry since you do not have
a symbol name for it. Add llsym() macro to provide this. This avoids
searching for the symbol at run-time based on name.

An example usage is to declare a driver with U_BOOT_DRIVER(), then obtain
a pointer to that driver later.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
9 years agodm: eth: Provide a way for drivers to manage packet buffers
Joe Hershberger [Sat, 4 Apr 2015 01:09:46 +0000 (20:09 -0500)]
dm: eth: Provide a way for drivers to manage packet buffers

Some drivers need a chance to manage their receive buffers after the
packet has been handled by the network stack. Add an operation that
will allow the driver to be called in that case.

Reported-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Acked-by: Simon Glass <sjg@chromium.org>
Tested-by: Simon Glass <sjg@chromium.org>
Tested-on: pcduino3

9 years agodm: spi: Convert Freescale QSPI driver to driver model
Haikun.Wang@freescale.com [Wed, 1 Apr 2015 03:10:40 +0000 (11:10 +0800)]
dm: spi: Convert Freescale QSPI driver to driver model

Move the Freescale QSPI driver over to driver model.

Signed-off-by: Haikun Wang <Haikun.Wang@freescale.com>
Signed-off-by: Peng Fan <Peng.Fan@freescale.com>
Tested-by: Peng Fan <Peng.Fan@freescale.com>
Acked-by: Simon Glass <sjg@chromium.org>
9 years agodm: spi: Convert Freescale DSPI driver to driver model
Haikun.Wang@freescale.com [Tue, 24 Mar 2015 14:03:58 +0000 (22:03 +0800)]
dm: spi: Convert Freescale DSPI driver to driver model

Move the Freescale DSPI driver over to driver model.

Signed-off-by: Haikun Wang <Haikun.Wang@freescale.com>
Acked-by: Simon Glass <sjg@chromium.org>
9 years agodm: ls1021a: dts: Add QSPI dts node
Haikun.Wang@freescale.com [Tue, 24 Mar 2015 13:20:40 +0000 (21:20 +0800)]
dm: ls1021a: dts: Add QSPI dts node

Add QSPI controller dts node in ls1021a.dtsi.
Add QSPI slave device dts node in ls1021a-twr.dts and ls1021a-qds.dts.

Signed-off-by: Haikun Wang <Haikun.Wang@freescale.com>
Acked-by: Simon Glass <sjg@chromium.org>
9 years agodm: ls1021a: dts: Update DSPI node to support DM SPI
Haikun.Wang@freescale.com [Tue, 24 Mar 2015 13:19:23 +0000 (21:19 +0800)]
dm: ls1021a: dts: Update DSPI node to support DM SPI

Update DSPI controller node in ls1021a.dtsi.
Update flash device node in ls1021a-qds.dts.
Ls1021a-twr board doesn't support DSPI, so remove DSPI node
in ls1021a-twr.dts.

Signed-off-by: Haikun Wang <Haikun.Wang@freescale.com>
Acked-by: Simon Glass <sjg@chromium.org>
9 years agodm: ls1021a: dts: Change address_cells and size_cells from 2 to 1
haikun [Tue, 24 Mar 2015 13:16:31 +0000 (21:16 +0800)]
dm: ls1021a: dts: Change address_cells and size_cells from 2 to 1

Change address_cells and size_cells of root node and 'soc' node
from 2 to 1.

We backport ls1021a device tree source files from kernel to u-boot.
Kernel files set address_cells and size_cells to 2 in order to access
more than 4GB space.
But we don't have this requirement now and u-boot fdtdec_get_xxx interfaces
can't support property whose size is 'u64' completely.
So make this change.

Signed-off-by: Haikun Wang <Haikun.Wang@freescale.com>
Acked-by: Simon Glass <sjg@chromium.org>
9 years agodm: ls1021a: Bring in ls1021a dts files from linux kernel
haikun [Wed, 25 Mar 2015 12:23:26 +0000 (20:23 +0800)]
dm: ls1021a: Bring in ls1021a dts files from linux kernel

Bring in required device tree files for ls1021a from Linux.
These are initially unchanged and have a number of pieces not needed by U-Boot.

Signed-off-by: Haikun Wang <Haikun.Wang@freescale.com>
Acked-by: Simon Glass <sjg@chromium.org>
9 years agodm: arm: Bring in skeleton64 device tree file from Linux
Haikun.Wang@freescale.com [Tue, 24 Mar 2015 13:12:13 +0000 (21:12 +0800)]
dm: arm: Bring in skeleton64 device tree file from Linux

Backport of kernel commits:
7c14f6c719de092d69c81877786e83ce7ae1a860
35faad2a1563b3d4dc983a82ac41033fe053870c

Signed-off-by: Haikun Wang <Haikun.Wang@freescale.com>
Acked-by: Simon Glass <sjg@chromium.org>
9 years agodm: i2c: add i2c-gpio driver
Przemyslaw Marczak [Tue, 31 Mar 2015 16:57:18 +0000 (18:57 +0200)]
dm: i2c: add i2c-gpio driver

This commit adds driver model support to software emulated i2c bus driver.
This driver supports kernel-style device tree bindings. Fdt properties in use:
- compatible - "i2c-gpio"
- gpios      - data and clock GPIO pin phandles
- delay-us   - micro seconds delay between GPIOs toggle operations,
               which is 1/4 of I2C speed clock period.

Added:
- Config: CONFIG_DM_I2C_GPIO
- File: drivers/i2c/i2c-gpio.c
- File: doc/device-tree-bindings/i2c/i2c-gpio.txt

Driver base code is taken from: drivers/i2c/soft-i2c.c, changes:
- use "i2c-gpio" naming
- update comments style
- move preprocesor macros into functions
- add device tree support
- add driver model i2c support
- code cleanup,
- add Kconfig entry

Signed-off-by: Przemyslaw Marczak <p.marczak@samsung.com>
Acked-by: Simon Glass <sjg@chromium.org>
Added braces in i2c_gpio_xfer() to fix style nit:
Signed-off-by: Simon Glass <sjg@chromium.org>
9 years agoKconfig: i2c: fix help message related to dm i2c
Przemyslaw Marczak [Tue, 31 Mar 2015 16:57:17 +0000 (18:57 +0200)]
Kconfig: i2c: fix help message related to dm i2c

Signed-off-by: Przemyslaw Marczak <p.marczak@samsung.com>
Acked-by: Simon Glass <sjg@chromium.org>
9 years agodm: gpio: request list: return the count if requests max_count reached
Przemyslaw Marczak [Tue, 31 Mar 2015 16:57:16 +0000 (18:57 +0200)]
dm: gpio: request list: return the count if requests max_count reached

The function gpio_request_list_by_name_nodev() returned -ENOSPC error,
when the loop count was greater than requested count. This was wrong,
because function should return the requested gpio count, when meets
the call request without errors. Now, the loop ends on requested
max_count.

Signed-off-by: Przemyslaw Marczak <p.marczak@samsung.com>
Acked-by: Simon Glass <sjg@chromium.org>
9 years agoi8042: Add keyboard enable logic in kbd_reset()
Simon Glass [Thu, 26 Mar 2015 15:29:41 +0000 (09:29 -0600)]
i8042: Add keyboard enable logic in kbd_reset()

This code appears to be missing a piece that is needed on some keyboards
to enable the keyboard. Add this in.

This makes the keyboard work correctly on chromebook_link.

Signed-off-by: Simon Glass <sjg@chromium.org>
9 years agosandbox: cros_ec: Add Kconfig for sandbox EC config
Simon Glass [Thu, 26 Mar 2015 15:29:40 +0000 (09:29 -0600)]
sandbox: cros_ec: Add Kconfig for sandbox EC config

Move CONFIG_CROS_EC_SANDBOX to Kconfig.

Signed-off-by: Simon Glass <sjg@chromium.org>
9 years agocros_ec: exynos: Match up device tree with kernel version
Simon Glass [Thu, 26 Mar 2015 15:29:39 +0000 (09:29 -0600)]
cros_ec: exynos: Match up device tree with kernel version

The U-Boot device trees are slightly different in a few places. Adjust them
to remove most of the differences. Note that U-Boot does not support the
concept of interrupts as distinct from GPIOs, so this difference remains.

For sandbox, use the same keyboard file as for ARM boards and drop the
host emulation bus which seems redundant.

Signed-off-by: Simon Glass <sjg@chromium.org>
9 years agofdt: Drop LPC compatible string in fdtdec
Simon Glass [Thu, 26 Mar 2015 15:29:38 +0000 (09:29 -0600)]
fdt: Drop LPC compatible string in fdtdec

This is not needed now that we have moved chromebook_link and cros_ec to
driver model.

Signed-off-by: Simon Glass <sjg@chromium.org>
9 years agofdt: cros_ec: Drop compatible string in fdtdec
Simon Glass [Thu, 26 Mar 2015 15:29:37 +0000 (09:29 -0600)]
fdt: cros_ec: Drop compatible string in fdtdec

This is not needed now that we have moved to driver model.

Signed-off-by: Simon Glass <sjg@chromium.org>
9 years agocros_ec: Remove unused cros_ec_board_init() function
Simon Glass [Thu, 26 Mar 2015 15:29:36 +0000 (09:29 -0600)]
cros_ec: Remove unused cros_ec_board_init() function

Now that driver model handles cros_ec init, we can drop this special code.

Signed-off-by: Simon Glass <sjg@chromium.org>
9 years agoexynos: cros_ec: Drop unnecessary init
Simon Glass [Thu, 26 Mar 2015 15:29:35 +0000 (09:29 -0600)]
exynos: cros_ec: Drop unnecessary init

Since driver model will probe the EC when it is first used, we do not
need to init it explicitly.

Signed-off-by: Simon Glass <sjg@chromium.org>
9 years agox86: cros_ec: Drop unnecessary init
Simon Glass [Thu, 26 Mar 2015 15:29:34 +0000 (09:29 -0600)]
x86: cros_ec: Drop unnecessary init

Since driver model will probe the EC when it is first used, we do not
need to init it explicitly.

Signed-off-by: Simon Glass <sjg@chromium.org>
9 years agosandbox: cros_ec: Drop unnecessary init
Simon Glass [Thu, 26 Mar 2015 15:29:33 +0000 (09:29 -0600)]
sandbox: cros_ec: Drop unnecessary init

Since driver model will probe the EC when it is first used, we do not
need to init it explicitly.

Signed-off-by: Simon Glass <sjg@chromium.org>
9 years agocros_ec: Drop unused CONFIG_DM_CROS_EC
Simon Glass [Thu, 26 Mar 2015 15:29:32 +0000 (09:29 -0600)]
cros_ec: Drop unused CONFIG_DM_CROS_EC

Since all supported boards enable this option now, we can remove it along
with the old code.

Signed-off-by: Simon Glass <sjg@chromium.org>
9 years agocros_ec: Reinit the cros_ec device when 'crosec init' is used
Simon Glass [Thu, 26 Mar 2015 15:29:31 +0000 (09:29 -0600)]
cros_ec: Reinit the cros_ec device when 'crosec init' is used

This command is supposed to reinit the device. At present with driver
model is does nothing. Implement this feature.

Signed-off-by: Simon Glass <sjg@chromium.org>
9 years agodm: cros_ec: Convert cros_ec LPC driver to driver model
Simon Glass [Thu, 26 Mar 2015 15:29:30 +0000 (09:29 -0600)]
dm: cros_ec: Convert cros_ec LPC driver to driver model

This is the last driver to be converted. It requires an LPC bus and a
special check_version() method.

Signed-off-by: Simon Glass <sjg@chromium.org>
9 years agox86: chromebook_link: dts: Add PCH and LPC devices
Simon Glass [Thu, 26 Mar 2015 15:29:29 +0000 (09:29 -0600)]
x86: chromebook_link: dts: Add PCH and LPC devices

The PCH (Platform Controller Hub) is on the PCI bus, so show it as such.
The LPC (Low Pin Count) and SPI bus are inside the PCH, so put these in the
right place also.

Rename the compatible strings to be more descriptive since this board is the
only user. Once we are using driver model fully on x86, these will be
dropped.

Signed-off-by: Simon Glass <sjg@chromium.org>
9 years agodm: x86: Add a uclass for an Low Pin Count (LPC) device
Simon Glass [Thu, 26 Mar 2015 15:29:28 +0000 (09:29 -0600)]
dm: x86: Add a uclass for an Low Pin Count (LPC) device

On x86 systems this device is commonly used to provide legacy port access.
It is sort-of a replacement for the old ISA bus.

Add a uclass for this, and allow it to have child devices.

Signed-off-by: Simon Glass <sjg@chromium.org>
9 years agodm: x86: Add a uclass for a Platform Controller Hub
Simon Glass [Thu, 26 Mar 2015 15:29:27 +0000 (09:29 -0600)]
dm: x86: Add a uclass for a Platform Controller Hub

Add a simple uclass for this chip which is often found in x86 systems
where the CPU is a separate device.

The device can have children, so make it scan the device tree for these.

Signed-off-by: Simon Glass <sjg@chromium.org>
9 years agodm: x86: spi: Convert ICH SPI driver to driver model
Simon Glass [Thu, 26 Mar 2015 15:29:26 +0000 (09:29 -0600)]
dm: x86: spi: Convert ICH SPI driver to driver model

Convert this driver over to use driver model. Since all x86 platforms use
it, move x86 to use driver model for SPI and SPI flash. Adjust all dependent
code and remove the old x86 spi_init() function.

Note that this does not make full use of the new PCI uclass as yet. We still
scan the bus looking for the device. It should move to finding its details
in the device tree.

Signed-off-by: Simon Glass <sjg@chromium.org>
9 years agodm: sf: Add driver model read/write/erase methods
Simon Glass [Thu, 26 Mar 2015 15:29:25 +0000 (09:29 -0600)]
dm: sf: Add driver model read/write/erase methods

Permit use of a udevice to talk to SPI flash. Ultimately we would like
to retire the use of 'struct spi_flash' for this purpose, so create the
new API for those who want to move to it.

Signed-off-by: Simon Glass <sjg@chromium.org>
9 years agonet: Improve error handling
Joe Hershberger [Sun, 22 Mar 2015 22:09:24 +0000 (17:09 -0500)]
net: Improve error handling

Take a pass at plumbing errors through to the users of the network stack

Currently only the start() function errors will be returned from
NetLoop(). recv() tends not to have errors, so that is likely not worth
adding. send() certainly can return errors, but this patch does not
attempt to plumb them yet. halt() is not expected to error.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
9 years agosandbox: eth: Add support for using the 'lo' interface
Joe Hershberger [Sun, 22 Mar 2015 22:09:23 +0000 (17:09 -0500)]
sandbox: eth: Add support for using the 'lo' interface

The 'lo' interface on Linux doesn't support thinks like ARP or
link-layer access like we use to talk to a normal network interface.
A higher-level network API must be used to access localhost.

As written, this interface is limited to not supporting ICMP since the
API doesn't allow the socket to be opened for all IP traffic and be able
to receive at the same time. UDP is far more useful to test with, so it
was selected over ICMP. Ping won't work, but things like TFTP should
work.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
9 years agosandbox: Enable DHCP and IP defrag
Joe Hershberger [Sun, 22 Mar 2015 22:09:22 +0000 (17:09 -0500)]
sandbox: Enable DHCP and IP defrag

This is now testable via the eth-raw interface

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
9 years agosandbox: eth: Add a bridge to a real network for sandbox
Joe Hershberger [Sun, 22 Mar 2015 22:09:21 +0000 (17:09 -0500)]
sandbox: eth: Add a bridge to a real network for sandbox

Implement a bridge between U-Boot's network stack and Linux's raw packet
API allowing the sandbox to send and receive packets using the host
machine's network interface.

This raw Ethernet API requires elevated privileges.  You can either run
as root, or you can add the capability needed like so:

sudo /sbin/setcap "CAP_NET_RAW+ep" /path/to/u-boot

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
9 years agotest: dm: net: Add a test of the netretry behavior
Joe Hershberger [Sun, 22 Mar 2015 22:09:20 +0000 (17:09 -0500)]
test: dm: net: Add a test of the netretry behavior

The effect of the "netretry" env var was recently changed. This test
checks that behavior.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
9 years agosandbox: eth: Add ability to disable ping reply in sandbox eth driver
Joe Hershberger [Sun, 22 Mar 2015 22:09:19 +0000 (17:09 -0500)]
sandbox: eth: Add ability to disable ping reply in sandbox eth driver

This is needed to test the netretry functionality (make the command fail
on a sandbox eth device).

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
9 years agotest: dm: eth: Add testing for ethrotate env var
Joe Hershberger [Sun, 22 Mar 2015 22:09:18 +0000 (17:09 -0500)]
test: dm: eth: Add testing for ethrotate env var

Make sure that the ethrotate behavior occurs as expected.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
9 years agodm: eth: Add support for ethprime env var
Joe Hershberger [Sun, 22 Mar 2015 22:09:17 +0000 (17:09 -0500)]
dm: eth: Add support for ethprime env var

The ethprime env var is used to indicate the starting device if none is
specified in ethact. Also support aliases specified in the ethprime var.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
9 years agodm: eth: Add support for aliases
Joe Hershberger [Sun, 22 Mar 2015 22:09:16 +0000 (17:09 -0500)]
dm: eth: Add support for aliases

Allow network devices to be referred to as "eth0" instead of
"eth@12345678" when specified in ethact.

Add tests to verify this behavior.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
9 years agotest: dm: eth: Add tests for the eth dm implementation
Joe Hershberger [Sun, 22 Mar 2015 22:09:15 +0000 (17:09 -0500)]
test: dm: eth: Add tests for the eth dm implementation

Add a test for the eth uclass using the sandbox eth driver. Verify basic
functionality of the network stack / eth uclass by exercising the ping
function.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
9 years agosandbox: eth: Add ARP and PING response to sandbox driver
Joe Hershberger [Sun, 22 Mar 2015 22:09:14 +0000 (17:09 -0500)]
sandbox: eth: Add ARP and PING response to sandbox driver

The sandbox driver will now generate response traffic to exercise the
ping command even when no network exists.  This allows the basic data
pathways of the DM to be tested.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
9 years agosandbox: eth: Add network support to sandbox
Joe Hershberger [Sun, 22 Mar 2015 22:09:13 +0000 (17:09 -0500)]
sandbox: eth: Add network support to sandbox

Add basic network support to sandbox which includes a network driver.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
9 years agodm: eth: Pass the packet pointer as a parameter to recv
Joe Hershberger [Sun, 22 Mar 2015 22:09:12 +0000 (17:09 -0500)]
dm: eth: Pass the packet pointer as a parameter to recv

Stop forcing drivers to call net_process_received_packet() - formerly
called NetReceive(). Now the uclass will handle calling the driver for
each packet until the driver errors or has nothing to return. The uclass
will then pass the good packets off to the network stack by calling
net_process_received_packet().

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
9 years agonet: Clean up network stack names used in DM drivers
Joe Hershberger [Sun, 22 Mar 2015 22:09:11 +0000 (17:09 -0500)]
net: Clean up network stack names used in DM drivers

Take the opportunity to enforce better names on newly written or
retrofitted Ethernet drivers.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
9 years agodm: eth: Add basic driver model support to Ethernet stack
Joe Hershberger [Sun, 22 Mar 2015 22:09:10 +0000 (17:09 -0500)]
dm: eth: Add basic driver model support to Ethernet stack

First just add support for MAC drivers.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
9 years agocmd: net: Clean up return codes
Joe Hershberger [Sun, 22 Mar 2015 22:09:09 +0000 (17:09 -0500)]
cmd: net: Clean up return codes

The return codes in common/cmd_net.c had a number of inconsistencies.
Update them to all use the enum from command.h

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
9 years agonet: Access mapped physmem in net functions
Joe Hershberger [Sun, 22 Mar 2015 22:09:08 +0000 (17:09 -0500)]
net: Access mapped physmem in net functions

Previously the net functions would access memory assuming physmem did
not need to be mapped.  In sandbox, that's not the case.

Now we map the physmem specified by the user in loadaddr to the buffer
that represents that space.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
9 years agonet: Make netretry actually do something
Joe Hershberger [Sun, 22 Mar 2015 22:09:07 +0000 (17:09 -0500)]
net: Make netretry actually do something

netretry previously would only retry in one specific case (your MAC
address is not set) and no other. This is basically useless. In the DM
implementation for eth it turns this into a completely useless case
since an un-configured MAC address results in not even entering the
NetLoop. The behavior is now changed to retry any failed command
(rotating through the eth adapters if ethrotate != no).

It also defaulted to retry forever. It is now changed to default to not
retry

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
9 years agonet: Remove the bd* parameter from net stack functions
Joe Hershberger [Sun, 22 Mar 2015 22:09:06 +0000 (17:09 -0500)]
net: Remove the bd* parameter from net stack functions

This value is not used by the network stack and is available in the
global data, so stop passing it around.  For the one legacy function
that still expects it (init op on old Ethernet drivers) pass in the
global pointer version directly to avoid changing that interface.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reported-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Simon Glass <sjg@chromium.org>
(Trival fix to remove an unneeded variable declaration in 4xx_enet.c)

9 years agonet: Use int instead of u8 for boolean flag
Joe Hershberger [Sun, 22 Mar 2015 22:09:05 +0000 (17:09 -0500)]
net: Use int instead of u8 for boolean flag

On some archs masking the parameter is inefficient, so don't use u8.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reported-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Simon Glass <sjg@chromium.org>
9 years agonet: Change return codes from net/eth.c to use errorno constants
Joe Hershberger [Sun, 22 Mar 2015 22:09:04 +0000 (17:09 -0500)]
net: Change return codes from net/eth.c to use errorno constants

Many functions returned -1 previously. Change them to return appropriate error
codes.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reported-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Simon Glass <sjg@chromium.org>
9 years agonet: Refactor in preparation for driver model
Joe Hershberger [Sun, 22 Mar 2015 22:09:03 +0000 (17:09 -0500)]
net: Refactor in preparation for driver model

Move some things around and organize things so that the driver model
implementation will fit in more easily.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
9 years agonet: Remove unneeded "extern" in net.h
Joe Hershberger [Sun, 22 Mar 2015 22:09:02 +0000 (17:09 -0500)]
net: Remove unneeded "extern" in net.h

Many of the functions in net.h were preceded extern needlessly. Removing
them to limit the number of checkpatch.pl complaints.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: Simon Glass <sjg@chromium.org>