27 May, 2012

1 commit

  • Pull arm-soc device tree conversions (part 2) from Olof Johansson:
    "These continue the device tree work from part 1, this set is for the
    tegra, mxs and imx platforms, all of which have dependencies on clock
    or pinctrl changes submitted earlier."

    Fix up trivial conflicts due to nearby changes in
    drivers/{gpio/gpio,i2c/busses/i2c}-mxs.c

    * tag 'dt2' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (73 commits)
    ARM: dt: tegra: invert status=disable vs status=okay
    ARM: dt: tegra: consistent basic property ordering
    ARM: dt: tegra: sort nodes based on bus order
    ARM: dt: tegra: remove duplicate device_type property
    ARM: dt: tegra: consistenly use lower-case for hex constants
    ARM: dt: tegra: format regs properties consistently
    ARM: dt: tegra: gpio comment cleanup
    ARM: dt: tegra: remove unnecessary unit addresses
    ARM: dt: tegra: whitespace cleanup
    ARM: dt: tegra cardhu: fix typo in SDHCI node name
    ARM: dt: tegra: cardhu: register core regulator tps62361
    ARM: dt: tegra30.dtsi: Add SMMU node
    ARM: dt: tegra20.dtsi: Add GART node
    ARM: dt: tegra30.dtsi: Add Memory Controller(MC) nodes
    ARM: dt: tegra20.dtsi: Add Memory Controller(MC) nodes
    ARM: dt: tegra: Add device tree support for AHB
    ARM: dts: enable audio support for imx28-evk
    ARM: dts: enable i2c device for imx28-evk
    i2c: mxs: add device tree probe support
    ARM: dts: enable mmc for imx28-evk
    ...

    Linus Torvalds
     

13 May, 2012

1 commit


09 May, 2012

2 commits

  • The variable 'dw_mci_card_workqueue' is a global variable shared between
    multiple instances of the dw_mmc host controller. Due to this, data
    corruption has been noticed when multiple instances of dw_mmc controllers
    are actively reading/writing the media. Fix this by adding a instance
    of 'struct workqueue_struct' for each host instance and removing the
    global 'dw_mci_card_workqueue' instance.

    Signed-off-by: Thomas Abraham
    Acked-by: Jaehoon Chung
    Acked-by: Will Newton
    Signed-off-by: Chris Ball

    Thomas Abraham
     
  • Current implementation decides the card type exclusively. Even though
    eMMC device can support both HS200 and DDR mode, card type will be
    set only for HS200. If the host doesn't support HS200 but has DDR
    capability, then DDR mode can't be selected.

    Signed-off-by: Seungwon Jeon
    Reviewed-by: Subhash Jadavani
    Signed-off-by: Chris Ball

    Seungwon Jeon
     

22 Apr, 2012

1 commit

  • Commit 06e8935feb ("optimized SDIO IRQ handling for single irq")
    introduced some spurious calls to SDIO function interrupt handlers,
    such as when the SDIO IRQ thread is started, or the safety check
    performed upon a system resume. Let's add a flag to perform the
    optimization only when a real interrupt is signaled by the host
    driver and we know there is no point confirming it.

    Reported-by: Sujit Reddy Thumma
    Signed-off-by: Nicolas Pitre
    Cc: stable
    Signed-off-by: Chris Ball

    Nicolas Pitre
     

21 Apr, 2012

1 commit

  • MMC bus is using legacy suspend/resume method, which is not compatible if
    runtime pm callbacks are used. In this scenario, MMC bus suspend/resume
    callbacks cannot be called when system entering S3. So change to use the
    new defined dev_pm_ops for system sleeping mode.

    Tested on AM335x Platform. Solves major issue/crash reported at
    http://www.mail-archive.com/linux-omap@vger.kernel.org/msg65425.html

    Signed-off-by: Chuanxiao Dong
    Tested-by: Hebbar, Gururaja
    Acked-by: Linus Walleij
    Acked-by: Ulf Hansson
    Signed-off-by: Chris Ball

    Chuanxiao Dong
     

29 Mar, 2012

1 commit

  • Pull MMC updates from Chris Ball:

    Core:
    * Support for MMC 4.5 Data Tag feature -- we tag REQ_META, so devices
    that support Data Tag will provide increased throughput for metadata.
    * Faster detection of card removal on I/O errors.

    Drivers:
    * dw_mmc now supports eMMC Power Off Notify, has PCI support, and
    implements pre_req and post_req for asynchronous requests.
    * omap_hsmmc now supports device tree.
    * esdhc now has power management support.
    * sdhci-tegra now supports Tegra30 devices.
    * sdhci-spear now supports hibernation.
    * tmio_mmc now supports using a GPIO for card detection.
    * Intel PCH now supports 8-bit bus transfers.

    * tag 'mmc-merge-for-3.4-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc: (53 commits)
    mmc: sh_mmcif: simplify bitmask macros
    mmc: sh_mobile_sdhi: support modular mmc-core with non-standard hotplug
    mmc: sh_mobile_sdhi: add a callback for board specific init code
    mmc: tmio: cosmetic: prettify the tmio_mmc_set_ios() function
    mmc: sh_mobile_sdhi: do not manage PM clocks manually
    mmc: tmio_mmc: remove unused sdio_irq_enabled flag
    mmc: tmio_mmc: power status flag doesn't have to be exposed in platform data
    mmc: sh_mobile_sdhi: pass card hotplug GPIO number to TMIO MMC
    mmc: tmio_mmc: support the generic MMC GPIO card hotplug helper
    mmc: tmio: calculate the native hotplug condition only once
    mmc: simplify mmc_cd_gpio_request() by removing two parameters
    mmc: sdhci-pci: allow 8-bit bus width for Intel PCH
    mmc: sdhci: check interrupt flags in ISR again
    mmc: sdhci-pci: Add MSI support
    mmc: core: warn when card doesn't support HPI
    mmc: davinci: Poll status for small size transfers
    mmc: davinci: Eliminate spurious interrupts
    mmc: omap_hsmmc: Avoid a regulator voltage change with dt
    mmc: omap_hsmmc: Convert hsmmc driver to use device tree
    mmc: sdhci-pci: add SDHCI_QUIRK2_HOST_OFF_CARD_ON for Medfield SDIO
    ...

    Linus Torvalds
     

28 Mar, 2012

9 commits


26 Mar, 2012

2 commits

  • Support of PCI mode for the dw_mmc driver. This Patch adds the
    support for the scenario where the Synopsys Designware IP
    is present on the PCI bus. The patch adds the minimal modifications
    necessary for the driver to work on PCI platform. Also added separate
    files for PCI and PLATFORM modes of operation.

    Signed-off-by: Shashidhar Hiremath
    Acked-by: James Hogan
    Signed-off-by: Chris Ball

    Shashidhar Hiremath
     
  • MMC-4.5 data tag feature will be used to store the file system meta-data
    in the tagged region of eMMC. This will improve the write and subsequent
    read transfer time for the meta data.

    Signed-off-by: Saugata Das
    Tested-by: Venkatraman S
    Signed-off-by: Chris Ball

    Saugata Das
     

25 Mar, 2012

1 commit

  • Pull avoidance patches from Paul Gortmaker:
    "Nearly every subsystem has some kind of header with a proto like:

    void foo(struct device *dev);

    and yet there is no reason for most of these guys to care about the
    sub fields within the device struct. This allows us to significantly
    reduce the scope of headers including headers. For this instance, a
    reduction of about 40% is achieved by replacing the include with the
    simple fact that the device is some kind of a struct.

    Unlike the much larger module.h cleanup, this one is simply two
    commits. One to fix the implicit users, and then one
    to delete the device.h includes from the linux/include/ dir wherever
    possible."

    * tag 'device-for-3.4' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux:
    device.h: audit and cleanup users in main include dir
    device.h: cleanup users outside of linux/include (C files)

    Linus Torvalds
     

24 Mar, 2012

1 commit

  • This addresses some header check warnings. DRM headers which include
    "drm.h" have been excluded, as they indirectly include types.h.

    Signed-off-by: Bobby Powers
    Cc: Chris Ball
    Cc: Dave Airlie
    Cc: James Bottomley
    Cc: Takashi Iwai
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Bobby Powers
     

16 Mar, 2012

1 commit

  • The header includes a lot of stuff, and
    it in turn gets a lot of use just for the basic "struct device"
    which appears so often.

    Clean up the users as follows:

    1) For those headers only needing "struct device" as a pointer
    in fcn args, replace the include with exactly that.

    2) For headers not really using anything from device.h, simply
    delete the include altogether.

    3) For headers relying on getting device.h implicitly before
    being included themselves, now explicitly include device.h

    4) For files in which doing #1 or #2 uncovers an implicit
    dependency on some other header, fix by explicitly adding
    the required header(s).

    Any C files that were implicitly relying on device.h to be
    present have already been dealt with in advance.

    Total removals from #1 and #2: 51. Total additions coming
    from #3: 9. Total other implicit dependencies from #4: 7.

    As of 3.3-rc1, there were 110, so a net removal of 42 gives
    about a 38% reduction in device.h presence in include/*

    Signed-off-by: Paul Gortmaker

    Paul Gortmaker
     

14 Feb, 2012

4 commits

  • Current PIO mode makes a kernel crash with CONFIG_HIGHMEM.
    Highmem pages have a NULL from sg_virt(sg).
    This patch fixes the following problem.

    Unable to handle kernel NULL pointer dereference at virtual address 00000000
    pgd = c0004000
    [00000000] *pgd=00000000
    Internal error: Oops: 817 [#1] PREEMPT SMP
    Modules linked in:
    CPU: 0 Not tainted (3.0.15-01423-gdbf465f #589)
    PC is at dw_mci_pull_data32+0x4c/0x9c
    LR is at dw_mci_read_data_pio+0x54/0x1f0
    pc : [] lr : [] psr: 20000193
    sp : c0619d48 ip : c0619d70 fp : c0619d6c
    r10: 00000000 r9 : 00000002 r8 : 00001000
    r7 : 00000200 r6 : 00000000 r5 : e1dd3100 r4 : 00000000
    r3 : 65622023 r2 : 0000007f r1 : eeb96000 r0 : e1dd3100
    Flags: nzCv IRQs off FIQs on Mode SVC_32 ISA ARM Segment
    xkernel
    Control: 10c5387d Table: 61e2004a DAC: 00000015
    Process swapper (pid: 0, stack limit = 0xc06182f0)
    Stack: (0xc0619d48 to 0xc061a000)
    9d40: e1dd3100 e1a4f000 00000000 e1dd3100 e1a4f000 00000200
    9d60: c0619da4 c0619d70 c035988c c03587e4 c0619d9c e18158f4 e1dd3100 e1dd3100
    9d80: 00000020 00000000 00000000 00000020 c06e8a84 00000000 c0619e04 c0619da8
    9da0: c0359b24 c0359844 e18158f4 e1dd3164 e1dd3168 e1dd3150 3d02fc79 e1dd3154
    9dc0: e1dd3178 00000000 00000020 00000000 e1dd3150 00000000 c10dd7e8 e1a84900
    9de0: c061e7cc 00000000 00000000 0000008d c06e8a84 c061e780 c0619e4c c0619e08
    9e00: c00c4738 c0359a34 3d02fc79 00000000 c0619e4c c05a1698 c05a1670 c05a165c
    9e20: c04de8b0 c061e780 c061e7cc e1a84900 ffffed68 0000008d c0618000 00000000
    9e40: c0619e6c c0619e50 c00c48b4 c00c46c8 c061e780 c00423ac c061e7cc ffffed68
    9e60: c0619e8c c0619e70 c00c7358 c00c487c 0000008d ffffee38 c0618000 ffffed68
    9e80: c0619ea4 c0619e90 c00c4258 c00c72b0 c00423ac ffffee38 c0619ecc c0619ea8
    9ea0: c004241c c00c4234 ffffffff f8810000 0000006d 00000002 00000001 7fffffff
    9ec0: c0619f44 c0619ed0 c0048bc0 c00423c4 220ae7a9 00000000 386f0d30 0005d3a4
    9ee0: c00423ac c10dd0b8 c06f2cd8 c0618000 c0594778 c003a674 7fffffff c0619f44
    9f00: 386f0d30 c0619f18 c00a6f94 c005be3c 80000013 ffffffff 386f0d30 0005d3a4
    9f20: 386f0d30 0005d2d1 c10dd0a8 c10dd0b8 c06f2cd8 c0618000 c0619f74 c0619f48
    9f40: c0345858 c005be00 c00a2440 c0618000 c0618000 c00410d8 c06c1944 c00410fc
    9f60: c0594778 c003a674 c0619f9c c0619f78 c004a7e8 c03457b4 c0618000 c06c18f8
    9f80: 00000000 c0039c70 c06c18d4 c003a674 c0619fb4 c0619fa0 c04ceafc c004a714
    9fa0: c06287b4 c06c18f8 c0619ff4 c0619fb8 c0008b68 c04cea68 c0008578 00000000
    9fc0: 00000000 c003a674 00000000 10c5387d c0628658 c003aa78 c062f1c4 4000406a
    9fe0: 413fc090 00000000 00000000 c0619ff8 40008044 c0008858 00000000 00000000
    Backtrace:
    [] (dw_mci_pull_data32+0x0/0x9c) from [] (dw_mci_read_data_pio+0x54/0x1f0)
    r6:00000200 r5:e1a4f000 r4:e1dd3100
    [] (dw_mci_read_data_pio+0x0/0x1f0) from [] (dw_mci_interrupt+0xfc/0x4a4)
    [] (dw_mci_interrupt+0x0/0x4a4) from [] (handle_irq_event_percpu+0x7c/0x1b4)
    [] (handle_irq_event_percpu+0x0/0x1b4) from [] (handle_irq_event+0x44/0x64)
    [] (handle_irq_event+0x0/0x64) from [] (handle_fasteoi_irq+0xb4/0x124)
    r7:ffffed68 r6:c061e7cc r5:c00423ac r4:c061e780
    [] (handle_fasteoi_irq+0x0/0x124) from [] (generic_handle_irq+0x30/0x38)
    r7:ffffed68 r6:c0618000 r5:ffffee38 r4:0000008d
    [] (generic_handle_irq+0x0/0x38) from [] (asm_do_IRQ+0x64/0xe0)
    r5:ffffee38 r4:c00423ac
    [] (asm_do_IRQ+0x0/0xe0) from [] (__irq_svc+0x80/0x14c)
    Exception stack(0xc0619ed0 to 0xc0619f18)

    Signed-off-by: Seungwon Jeon
    Acked-by: Will Newton
    Cc: stable
    Signed-off-by: Chris Ball

    Seungwon Jeon
     
  • Modified the mmc_poweroff to resume before sending the poweroff
    notification command. In sleep mode only AWAKE and RESET commands are
    allowed, so before sending the poweroff notification command resume from
    sleep mode and then send the notification command.

    PowerOff Notify is tested on a Synopsis Designware Host Controller
    (eMMC 4.5). The suspend to RAM and resume works fine.

    Signed-off-by: Girish K S
    Tested-by: Girish K S
    Reviewed-by: Saugata Das
    Signed-off-by: Chris Ball

    Girish K S
     
  • There is an understood mismatch between the voltage the host controller is
    set to and the voltage supplied to the card by a fixed voltage regulator.
    Teaching the driver to accept the mismatch is overly complicated. Instead
    just accept the regulator's voltage.

    This patch adds MMC_CAP2_BROKEN_VOLTAGE.

    If the voltage didn't satisfy between min_uV and max_uV, try to change
    the voltage in core.c. When changing the voltage, maybe use
    regulator_set_voltage().

    In regulator_set_voltage(), check the below condition.

    /* sanity check */
    if (!rdev->desc->ops->set_voltage &&
    !rdev->desc->ops->set_voltage_sel) {
    ret = -EINVAL;
    goto out;
    }

    If some board should use the fixed-regulator, always return -EINVAL.
    Then, eMMC didn't initialize always.

    So if use a fixed-regulator, we need to add the MMC_CAP2_BROKEN_VOLTAGE.

    Signed-off-by: Jaehoon Chung
    Signed-off-by: Kyungmin Park
    Acked-by: Adrian Hunter
    Signed-off-by: Chris Ball

    Jaehoon Chung
     
  • Ensure clocks are always enabled before any interaction with the
    host controller driver. This makes sure that there is no race
    between host execution and the core layer turning off clocks
    in different context with clock gating framework.

    Signed-off-by: Sujit Reddy Thumma
    Acked-by: Linus Walleij
    Acked-by: Per Forlin
    Signed-off-by: Chris Ball

    Sujit Reddy Thumma
     

15 Jan, 2012

1 commit

  • Autogenerated GPG tag for Rusty D1ADB8F1: 15EE 8D6C AB0E 7F0C F999 BFCB D920 0E6C D1AD B8F1

    * tag 'for-linus' of git://github.com/rustyrussell/linux:
    module_param: check that bool parameters really are bool.
    intelfbdrv.c: bailearly is an int module_param
    paride/pcd: fix bool verbose module parameter.
    module_param: make bool parameters really bool (drivers & misc)
    module_param: make bool parameters really bool (arch)
    module_param: make bool parameters really bool (core code)
    kernel/async: remove redundant declaration.
    printk: fix unnecessary module_param_name.
    lirc_parallel: fix module parameter description.
    module_param: avoid bool abuse, add bint for special cases.
    module_param: check type correctness for module_param_array
    modpost: use linker section to generate table.
    modpost: use a table rather than a giant if/else statement.
    modules: sysfs - export: taint, coresize, initsize
    kernel/params: replace DEBUGP with pr_debug
    module: replace DEBUGP with pr_debug
    module: struct module_ref should contains long fields
    module: Fix performance regression on modules with large symbol tables
    module: Add comments describing how the "strmap" logic works

    Fix up conflicts in scripts/mod/file2alias.c due to the new linker-
    generated table approach to adding __mod_*_device_table entries. The
    ARM sa11x0 mcp bus needed to be converted to that too.

    Linus Torvalds
     

13 Jan, 2012

3 commits

  • module_param(bool) used to counter-intuitively take an int. In
    fddd5201 (mid-2009) we allowed bool or int/unsigned int using a messy
    trick.

    It's time to remove the int/unsigned int option. For this version
    it'll simply give a warning, but it'll break next kernel version.

    Acked-by: Mauro Carvalho Chehab
    Signed-off-by: Rusty Russell

    Rusty Russell
     
  • This patch adds support for the HS200 mode on the host side.
    Also enables the tuning feature required when the HS200 mode
    is selected.

    Signed-off-by: Girish K S
    Signed-off-by: Chris Ball

    Girish K S
     
  • This patch adds the support of the HS200 bus speed for eMMC 4.5 devices.
    The eMMC 4.5 devices have support for 200MHz bus speed. The function
    prototype of the tuning function is modified to handle the tuning
    command number which is different in sd and mmc case.

    Signed-off-by: Girish K S
    Signed-off-by: Philip Rakity
    Signed-off-by: Chris Ball

    Girish K S
     

12 Jan, 2012

11 commits

  • Host may now use MMC_CAP2_NO_SLEEP_CMD to disable the use
    of eMMC sleep/awake command.

    This option can be used when your platform has a buggy
    kernel crash dump software, which is supposed to store
    the dump on the eMMC, but is not able to wake up the eMMC
    from sleep state.

    In particular, failures have been seen with u-boot; even if
    it is fixed there, platforms will be slow to update their
    bootloader binaries.

    Signed-off-by: Ulf Hansson
    Reviewed-by: Hanumath Prasad
    Reviewed-by: Srinidhi Kasagar
    Acked-by: Subhash Jadavani
    Signed-off-by: Chris Ball

    Ulf Hansson
     
  • Even if a driver provides separate card detection, an interrupt
    is still needed to abort mmc requests that are in progress.
    SDHCI_QUIRK2_OWN_CARD_DETECTION prevents that, so remove it.

    Signed-off-by: Adrian Hunter
    Signed-off-by: Chris Ball

    Adrian Hunter
     
  • Add a means of getting platform data for the SDHCI PCI
    devices. The data is stored against the slot not the
    device in order to support multi-slot devices.

    The data allows platform-specific setup (such as getting
    GPIO numbers from firmware or setting up wl12xx for SDIO)
    to be done in platform support files instead of the
    sdhci-pci driver.

    Signed-off-by: Adrian Hunter
    Signed-off-by: Chris Ball

    Adrian Hunter
     
  • This patch adds a primitive helper to support card hotplug detection on
    platforms, where a GPIO, capable of producing interrupts, is used for
    detection of card-insertion and -removal events.

    Signed-off-by: Guennadi Liakhovetski
    Signed-off-by: Chris Ball

    Guennadi Liakhovetski
     
  • SD/MMC controllers provide different card insertion and removal detection
    methods. On some of them the controller itself issues an interrupt, on
    others polling is used, on yet others auxiliary means are used for this
    purpose, e.g., a GPIO IRQ. Further, on some systems one of those methods
    can be chosen at driver probing time and configured in software. E.g., on
    some systems the SD/MMC controller card hot-plug detection pin can be
    configured either as a respective controller functions, or an IRQ-capable
    GPIO. To support such flexible configurations a card hot-plug context
    is added by this patch.

    Signed-off-by: Guennadi Liakhovetski
    Signed-off-by: Chris Ball

    Guennadi Liakhovetski
     
  • This patch adds another capabilities field for MMC_CAPS2_XXX.

    Signed-off-by: Seungwon Jeon
    Signed-off-by: Chris Ball

    Seungwon Jeon
     
  • Enable boot partitions to be read-only locked until next power on via
    a sysfs entry. There will be one sysfs entry for each boot partition:

    /sys/block/mmcblkXbootY/ro_lock_until_next_power_on

    Each boot partition is locked by writing 1 to its file.

    Signed-off-by: Johan Rudholm
    Signed-off-by: John Beckett
    Signed-off-by: Chris Ball

    Johan Rudholm
     
  • Add a function mmc_detect_card_removed() which upper layers can use to
    determine immediately if a card has been removed. This function should
    be called after an I/O request fails so that all queued I/O requests
    can be errored out immediately instead of waiting for the card device
    to be removed.

    Signed-off-by: Adrian Hunter
    Acked-by: Sujit Reddy Thumma
    Signed-off-by: Chris Ball

    Adrian Hunter
     
  • This patch adds support for sdio UHS cards per the version 3.0
    spec.

    UHS mode is only enabled for version 3.0 cards when both the
    host and the controller support UHS modes.

    1.8v signaling support is removed if both the card and the
    host do not support UHS. This is done to maintain
    compatibility and some system/card combinations break when
    1.8v signaling is enabled when the host does not support UHS.

    Signed-off-by: Philip Rakity
    Signed-off-by: Aaron Lu
    Reviewed-by: Arindam Nath
    Tested-by: Bing Zhao
    Signed-off-by: Chris Ball

    Philip Rakity
     
  • Current clock gating framework disables the MCI clock as soon as the
    request is completed and enables it when a request arrives. This aggressive
    clock gating framework, when enabled, cause following issues:

    When there are back-to-back requests from the Queue layer, we unnecessarily
    end up disabling and enabling the clocks between these requests since 8MCLK
    clock cycles is a very short duration compared to the time delay between
    back to back requests reaching the MMC layer. This overhead can effect the
    overall performance depending on how long the clock enable and disable
    calls take which is platform dependent. For example on some platforms we
    can have clock control not on the local processor, but on a different
    subsystem and the time taken to perform the clock enable/disable can add
    significant overhead.

    Also if the host controller driver decides to disable the host clock too
    when mmc_set_ios function is called with ios.clock=0, it adds additional
    delay and it is highly possible that the next request had already arrived
    and unnecessarily blocked in enabling the clocks. This is seen frequently
    when the processor is executing at high speeds and in multi-core platforms
    thus reduces the overall throughput compared to if clock gating is
    disabled.

    Fix this by delaying turning off the clocks by posting request on
    delayed workqueue. Also cancel the unscheduled pending work, if any,
    when there is access to card.

    sysfs entry is provided to tune the delay as needed, default
    value set to 200ms.

    Signed-off-by: Sujit Reddy Thumma
    Acked-by: Linus Walleij
    Signed-off-by: Chris Ball

    Sujit Reddy Thumma
     
  • This patch is to expose the actual SDCLK frequency in
    /sys/kernel/debug/mmcX/ios entry.

    For example, if the max clk for a normal speed card is 20MHz this
    is reported in /sys/kernel/debug/mmcX/ios. Unfortunately the actual
    SDCLK frequency (i.e. Baseclock / divisor) is not reported at all:
    for example, in that case, on Arasan HC, it should be 48/4=12 (MHz).

    Signed-off-by: Giuseppe Cavallaro
    Acked-by: Adrian Hunter
    Signed-off-by: Chris Ball

    Giuseppe CAVALLARO