From mboxrd@z Thu Jan 1 00:00:00 1970 Date: Wed, 6 Feb 2013 12:32:07 -0300 From: Ezequiel Garcia To: Gregory CLEMENT Subject: Re: [PATCH] arm: mvebu: Add SPI flash on Armada XP-GP board Message-ID: <20130206153206.GA4618@localhost> References: <1360063473-26176-1-git-send-email-ezequiel.garcia@free-electrons.com> <5111331F.7090900@free-electrons.com> <511168BE.1000803@free-electrons.com> <20130206105431.GA21764@localhost> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20130206105431.GA21764@localhost> Cc: Thomas Petazzoni , Andrew Lunn , Jason Cooper , devicetree-discuss@lists.ozlabs.org, grant.likely@secretlab.ca, Lior Amsalem , shadi@marvell.com, linux-mtd@lists.infradead.org, spi-devel-general@lists.sourceforge.net, dwmw2@infradead.org, Florian Fainelli , linux-arm-kernel@lists.infradead.org List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , (Adding mtd in Cc) On Wed, Feb 06, 2013 at 07:54:31AM -0300, Ezequiel Garcia wrote: > Hi Gregory, > > On Tue, Feb 05, 2013 at 09:17:02PM +0100, Gregory CLEMENT wrote: > > On 02/05/2013 05:28 PM, Gregory CLEMENT wrote: > > > Hi Ezequiel, > > > > > > On 02/05/2013 12:24 PM, Ezequiel Garcia wrote: > > >> This patch adds an SPI master device node for Armada XP-GP board. > > >> This master node is an SPI flash controller 'n25q128a13'. > > >> > > >> Since there is no 'partitions' node declared, one full sized > > >> partition named as the device will be created. > > >> > > >> Cc: Gregory Clement > > >> Cc: Thomas Petazzoni > > >> Cc: Lior Amsalem > > >> Signed-off-by: Ezequiel Garcia > > >> --- > > >> This patch depends on: > > >> > > >> 1. Gregory's patch for Armada XP GP board: > > >> arm: mvebu: support for the new Armada XP development board(DB-MV784MP-GP) > > >> > > >> 2. My previous patch for SPI on Armada 370/XP: > > >> arm: mvebu: Add support for SPI controller in Armada 370/XP > > >> > > >> And don't forget to compile the SPI flash driver, CONFIG_MTD_M25P80=y > > >> > > >> arch/arm/boot/dts/armada-xp-gp.dts | 12 ++++++++++++ > > >> 1 files changed, 12 insertions(+), 0 deletions(-) > > >> > > >> diff --git a/arch/arm/boot/dts/armada-xp-gp.dts b/arch/arm/boot/dts/armada-xp-gp.dts > > >> index 3eea531..1c8afe2 100644 > > >> --- a/arch/arm/boot/dts/armada-xp-gp.dts > > >> +++ b/arch/arm/boot/dts/armada-xp-gp.dts > > >> @@ -97,5 +97,17 @@ > > >> phy = <&phy3>; > > >> phy-mode = "rgmii-id"; > > >> }; > > >> + > > >> + spi0: spi@d0010600 { > > >> + status = "okay"; > > >> + > > >> + spi-flash@0 { > > >> + #address-cells = <1>; > > >> + #size-cells = <1>; > > >> + compatible = "n25q128a13"; > > >> + reg = <0>; /* Chip select 0 */ > > >> + spi-max-frequency = <108000000>; > > > > I had a remark about it, according to the datasheet, 108MHz is the > > maximum frequency for the all the instructions but the READ > > instruction. For the READ the maximum frequency is 54MHz. So I wonder > > if we shouldn't use 54000000 here. > > > > Mmm... nice catch. > > The mtd driver for the spi flash (m25p80) will use FAST_READ opcode > if CONFIG_M25PXX_USE_FAST_READ is selected, and this option > is selected by default. > However we cannot count on this option being selected, of course. > > On the other side, after some testing with spi-max-frequency = 50 MHz > and also with spi-max-frequency = 108 MHz I'm seeing the flash often > (not always) stalls when trying to read the full device through dd: > > / # dd if=/dev/mtd0ro of=/dev/null > FWIW, using CONFIG_DETECT_HUNG_TASK we can see the hung happens inside spi_sync(). It seems the completion handler is never called, though I still don't understand under what circumstances that can happen. dd D c02d79c8 0 964 961 0x00000000 [] (__schedule+0x1c8/0x504) from [] (schedule_timeout+0x158/0x200) [] (schedule_timeout+0x158/0x200) from [] (wait_for_common+0xe0/0x194) [] (wait_for_common+0xe0/0x194) from [] (spi_sync+0x74/0x90) [] (spi_sync+0x74/0x90) from [] (m25p80_read+0x100/0x17c) [] (m25p80_read+0x100/0x17c) from [] (mtd_read+0x8c/0xc0) [] (mtd_read+0x8c/0xc0) from [] (mtdchar_read+0xe0/0x224) [] (mtdchar_read+0xe0/0x224) from [] (vfs_read+0xa4/0x148) [] (vfs_read+0xa4/0x148) from [] (sys_read+0x44/0x78) [] (sys_read+0x44/0x78) from [] (ret_fast_syscall+0x0/0x30) -- Ezequiel GarcĂ­a, Free Electrons Embedded Linux, Kernel and Android Engineering http://free-electrons.com From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ezequiel Garcia Subject: Re: [PATCH] arm: mvebu: Add SPI flash on Armada XP-GP board Date: Wed, 6 Feb 2013 12:32:07 -0300 Message-ID: <20130206153206.GA4618@localhost> References: <1360063473-26176-1-git-send-email-ezequiel.garcia@free-electrons.com> <5111331F.7090900@free-electrons.com> <511168BE.1000803@free-electrons.com> <20130206105431.GA21764@localhost> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Cc: Andrew Lunn , Jason Cooper , devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org, Lior Amsalem , shadi-eYqpPyKDWXRBDgjK7y7TUQ@public.gmane.org, linux-mtd-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org, dwmw2-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org, Florian Fainelli , linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org To: Gregory CLEMENT Return-path: Content-Disposition: inline In-Reply-To: <20130206105431.GA21764@localhost> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: devicetree-discuss-bounces+gldd-devicetree-discuss=m.gmane.org-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org Sender: "devicetree-discuss" List-Id: linux-spi.vger.kernel.org KEFkZGluZyBtdGQgaW4gQ2MpCgpPbiBXZWQsIEZlYiAwNiwgMjAxMyBhdCAwNzo1NDozMUFNIC0w MzAwLCBFemVxdWllbCBHYXJjaWEgd3JvdGU6Cj4gSGkgR3JlZ29yeSwKPiAKPiBPbiBUdWUsIEZl YiAwNSwgMjAxMyBhdCAwOToxNzowMlBNICswMTAwLCBHcmVnb3J5IENMRU1FTlQgd3JvdGU6Cj4g PiBPbiAwMi8wNS8yMDEzIDA1OjI4IFBNLCBHcmVnb3J5IENMRU1FTlQgd3JvdGU6Cj4gPiA+IEhp IEV6ZXF1aWVsLAo+ID4gPiAKPiA+ID4gT24gMDIvMDUvMjAxMyAxMjoyNCBQTSwgRXplcXVpZWwg R2FyY2lhIHdyb3RlOgo+ID4gPj4gVGhpcyBwYXRjaCBhZGRzIGFuIFNQSSBtYXN0ZXIgZGV2aWNl IG5vZGUgZm9yIEFybWFkYSBYUC1HUCBib2FyZC4KPiA+ID4+IFRoaXMgbWFzdGVyIG5vZGUgaXMg YW4gU1BJIGZsYXNoIGNvbnRyb2xsZXIgJ24yNXExMjhhMTMnLgo+ID4gPj4KPiA+ID4+IFNpbmNl IHRoZXJlIGlzIG5vICdwYXJ0aXRpb25zJyBub2RlIGRlY2xhcmVkLCBvbmUgZnVsbCBzaXplZAo+ ID4gPj4gcGFydGl0aW9uIG5hbWVkIGFzIHRoZSBkZXZpY2Ugd2lsbCBiZSBjcmVhdGVkLgo+ID4g Pj4KPiA+ID4+IENjOiBHcmVnb3J5IENsZW1lbnQgPGdyZWdvcnkuY2xlbWVudEBmcmVlLWVsZWN0 cm9ucy5jb20+Cj4gPiA+PiBDYzogVGhvbWFzIFBldGF6em9uaSA8dGhvbWFzLnBldGF6em9uaUBm cmVlLWVsZWN0cm9ucy5jb20+Cj4gPiA+PiBDYzogTGlvciBBbXNhbGVtIDxhbGlvckBtYXJ2ZWxs LmNvbT4KPiA+ID4+IFNpZ25lZC1vZmYtYnk6IEV6ZXF1aWVsIEdhcmNpYSA8ZXplcXVpZWwuZ2Fy Y2lhQGZyZWUtZWxlY3Ryb25zLmNvbT4KPiA+ID4+IC0tLQo+ID4gPj4gVGhpcyBwYXRjaCBkZXBl bmRzIG9uOgo+ID4gPj4KPiA+ID4+ICAxLiBHcmVnb3J5J3MgcGF0Y2ggZm9yIEFybWFkYSBYUCBH UCBib2FyZDoKPiA+ID4+ICAgICAgIGFybTogbXZlYnU6IHN1cHBvcnQgZm9yIHRoZSBuZXcgQXJt YWRhIFhQIGRldmVsb3BtZW50IGJvYXJkKERCLU1WNzg0TVAtR1ApCj4gPiA+Pgo+ID4gPj4gIDIu IE15IHByZXZpb3VzIHBhdGNoIGZvciBTUEkgb24gQXJtYWRhIDM3MC9YUDoKPiA+ID4+ICAgICAg IGFybTogbXZlYnU6IEFkZCBzdXBwb3J0IGZvciBTUEkgY29udHJvbGxlciBpbiBBcm1hZGEgMzcw L1hQCj4gPiA+Pgo+ID4gPj4gQW5kIGRvbid0IGZvcmdldCB0byBjb21waWxlIHRoZSBTUEkgZmxh c2ggZHJpdmVyLCBDT05GSUdfTVREX00yNVA4MD15Cj4gPiA+Pgo+ID4gPj4gIGFyY2gvYXJtL2Jv b3QvZHRzL2FybWFkYS14cC1ncC5kdHMgfCAgIDEyICsrKysrKysrKysrKwo+ID4gPj4gIDEgZmls ZXMgY2hhbmdlZCwgMTIgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKPiA+ID4+Cj4gPiA+ PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvYXJtYWRhLXhwLWdwLmR0cyBiL2FyY2gv YXJtL2Jvb3QvZHRzL2FybWFkYS14cC1ncC5kdHMKPiA+ID4+IGluZGV4IDNlZWE1MzEuLjFjOGFm ZTIgMTAwNjQ0Cj4gPiA+PiAtLS0gYS9hcmNoL2FybS9ib290L2R0cy9hcm1hZGEteHAtZ3AuZHRz Cj4gPiA+PiArKysgYi9hcmNoL2FybS9ib290L2R0cy9hcm1hZGEteHAtZ3AuZHRzCj4gPiA+PiBA QCAtOTcsNSArOTcsMTcgQEAKPiA+ID4+ICAJCQlwaHkgPSA8JnBoeTM+Owo+ID4gPj4gIAkJCXBo eS1tb2RlID0gInJnbWlpLWlkIjsKPiA+ID4+ICAJCX07Cj4gPiA+PiArCj4gPiA+PiArCQlzcGkw OiBzcGlAZDAwMTA2MDAgewo+ID4gPj4gKwkJCXN0YXR1cyA9ICJva2F5IjsKPiA+ID4+ICsKPiA+ ID4+ICsJCQlzcGktZmxhc2hAMCB7Cj4gPiA+PiArCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+Owo+ ID4gPj4gKwkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKPiA+ID4+ICsJCQkJY29tcGF0aWJsZSA9ICJu MjVxMTI4YTEzIjsKPiA+ID4+ICsJCQkJcmVnID0gPDA+OyAvKiBDaGlwIHNlbGVjdCAwICovCj4g PiA+PiArCQkJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDEwODAwMDAwMD47Cj4gPiAKPiA+IEkgaGFk IGEgcmVtYXJrIGFib3V0IGl0LCBhY2NvcmRpbmcgdG8gdGhlIGRhdGFzaGVldCwgMTA4TUh6IGlz IHRoZQo+ID4gbWF4aW11bSBmcmVxdWVuY3kgZm9yIHRoZSBhbGwgdGhlIGluc3RydWN0aW9ucyBi dXQgdGhlIFJFQUQKPiA+IGluc3RydWN0aW9uLiBGb3IgdGhlIFJFQUQgdGhlIG1heGltdW0gZnJl cXVlbmN5IGlzIDU0TUh6LiBTbyBJIHdvbmRlcgo+ID4gaWYgd2Ugc2hvdWxkbid0IHVzZSA1NDAw MDAwMCBoZXJlLgo+ID4gCj4gCj4gTW1tLi4uIG5pY2UgY2F0Y2guCj4gCj4gVGhlIG10ZCBkcml2 ZXIgZm9yIHRoZSBzcGkgZmxhc2ggKG0yNXA4MCkgd2lsbCB1c2UgRkFTVF9SRUFEIG9wY29kZQo+ IGlmIENPTkZJR19NMjVQWFhfVVNFX0ZBU1RfUkVBRCBpcyBzZWxlY3RlZCwgYW5kIHRoaXMgb3B0 aW9uCj4gaXMgc2VsZWN0ZWQgYnkgZGVmYXVsdC4KPiBIb3dldmVyIHdlIGNhbm5vdCBjb3VudCBv biB0aGlzIG9wdGlvbiBiZWluZyBzZWxlY3RlZCwgb2YgY291cnNlLgo+IAo+IE9uIHRoZSBvdGhl ciBzaWRlLCBhZnRlciBzb21lIHRlc3Rpbmcgd2l0aCBzcGktbWF4LWZyZXF1ZW5jeSA9IDUwIE1I ego+IGFuZCBhbHNvIHdpdGggc3BpLW1heC1mcmVxdWVuY3kgPSAxMDggTUh6IEknbSBzZWVpbmcg dGhlIGZsYXNoIG9mdGVuCj4gKG5vdCBhbHdheXMpIHN0YWxscyB3aGVuIHRyeWluZyB0byByZWFk IHRoZSBmdWxsIGRldmljZSB0aHJvdWdoIGRkOgo+IAo+IC8gIyBkZCBpZj0vZGV2L210ZDBybyBv Zj0vZGV2L251bGwKPiAKCkZXSVcsIHVzaW5nIENPTkZJR19ERVRFQ1RfSFVOR19UQVNLIHdlIGNh biBzZWUgdGhlIGh1bmcgaGFwcGVucyBpbnNpZGUgc3BpX3N5bmMoKS4KSXQgc2VlbXMgdGhlIGNv bXBsZXRpb24gaGFuZGxlciBpcyBuZXZlciBjYWxsZWQsCnRob3VnaCBJIHN0aWxsIGRvbid0IHVu ZGVyc3RhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoYXQgY2FuIGhhcHBlbi4KCmRkICAg ICAgICAgICAgICBEIGMwMmQ3OWM4ICAgICAwICAgOTY0ICAgIDk2MSAweDAwMDAwMDAwCls8YzAy ZDc5Yzg+XSAoX19zY2hlZHVsZSsweDFjOC8weDUwNCkgZnJvbSBbPGMwMmQ2MWQwPl0gKHNjaGVk dWxlX3RpbWVvdXQrMHgxNTgvMHgyMDApCls8YzAyZDYxZDA+XSAoc2NoZWR1bGVfdGltZW91dCsw eDE1OC8weDIwMCkgZnJvbSBbPGMwMmQ3NTA0Pl0gKHdhaXRfZm9yX2NvbW1vbisweGUwLzB4MTk0 KQpbPGMwMmQ3NTA0Pl0gKHdhaXRfZm9yX2NvbW1vbisweGUwLzB4MTk0KSBmcm9tIFs8YzAyMTVi NDQ+XSAoc3BpX3N5bmMrMHg3NC8weDkwKQpbPGMwMjE1YjQ0Pl0gKHNwaV9zeW5jKzB4NzQvMHg5 MCkgZnJvbSBbPGMwMjE0YzgwPl0gKG0yNXA4MF9yZWFkKzB4MTAwLzB4MTdjKQpbPGMwMjE0Yzgw Pl0gKG0yNXA4MF9yZWFkKzB4MTAwLzB4MTdjKSBmcm9tIFs8YzAyMGVkYWM+XSAobXRkX3JlYWQr MHg4Yy8weGMwKQpbPGMwMjBlZGFjPl0gKG10ZF9yZWFkKzB4OGMvMHhjMCkgZnJvbSBbPGMwMjE0 MDRjPl0gKG10ZGNoYXJfcmVhZCsweGUwLzB4MjI0KQpbPGMwMjE0MDRjPl0gKG10ZGNoYXJfcmVh ZCsweGUwLzB4MjI0KSBmcm9tIFs8YzAwYzc1N2M+XSAodmZzX3JlYWQrMHhhNC8weDE0OCkKWzxj MDBjNzU3Yz5dICh2ZnNfcmVhZCsweGE0LzB4MTQ4KSBmcm9tIFs8YzAwYzc2NjQ+XSAoc3lzX3Jl YWQrMHg0NC8weDc4KQpbPGMwMGM3NjY0Pl0gKHN5c19yZWFkKzB4NDQvMHg3OCkgZnJvbSBbPGMw MDBlZGUwPl0gKHJldF9mYXN0X3N5c2NhbGwrMHgwLzB4MzApCgotLSAKRXplcXVpZWwgR2FyY8Ot YSwgRnJlZSBFbGVjdHJvbnMKRW1iZWRkZWQgTGludXgsIEtlcm5lbCBhbmQgQW5kcm9pZCBFbmdp bmVlcmluZwpodHRwOi8vZnJlZS1lbGVjdHJvbnMuY29tCl9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fCmRldmljZXRyZWUtZGlzY3VzcyBtYWlsaW5nIGxpc3QK ZGV2aWNldHJlZS1kaXNjdXNzQGxpc3RzLm96bGFicy5vcmcKaHR0cHM6Ly9saXN0cy5vemxhYnMu b3JnL2xpc3RpbmZvL2RldmljZXRyZWUtZGlzY3Vzcwo= From mboxrd@z Thu Jan 1 00:00:00 1970 From: ezequiel.garcia@free-electrons.com (Ezequiel Garcia) Date: Wed, 6 Feb 2013 12:32:07 -0300 Subject: [PATCH] arm: mvebu: Add SPI flash on Armada XP-GP board In-Reply-To: <20130206105431.GA21764@localhost> References: <1360063473-26176-1-git-send-email-ezequiel.garcia@free-electrons.com> <5111331F.7090900@free-electrons.com> <511168BE.1000803@free-electrons.com> <20130206105431.GA21764@localhost> Message-ID: <20130206153206.GA4618@localhost> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org (Adding mtd in Cc) On Wed, Feb 06, 2013 at 07:54:31AM -0300, Ezequiel Garcia wrote: > Hi Gregory, > > On Tue, Feb 05, 2013 at 09:17:02PM +0100, Gregory CLEMENT wrote: > > On 02/05/2013 05:28 PM, Gregory CLEMENT wrote: > > > Hi Ezequiel, > > > > > > On 02/05/2013 12:24 PM, Ezequiel Garcia wrote: > > >> This patch adds an SPI master device node for Armada XP-GP board. > > >> This master node is an SPI flash controller 'n25q128a13'. > > >> > > >> Since there is no 'partitions' node declared, one full sized > > >> partition named as the device will be created. > > >> > > >> Cc: Gregory Clement > > >> Cc: Thomas Petazzoni > > >> Cc: Lior Amsalem > > >> Signed-off-by: Ezequiel Garcia > > >> --- > > >> This patch depends on: > > >> > > >> 1. Gregory's patch for Armada XP GP board: > > >> arm: mvebu: support for the new Armada XP development board(DB-MV784MP-GP) > > >> > > >> 2. My previous patch for SPI on Armada 370/XP: > > >> arm: mvebu: Add support for SPI controller in Armada 370/XP > > >> > > >> And don't forget to compile the SPI flash driver, CONFIG_MTD_M25P80=y > > >> > > >> arch/arm/boot/dts/armada-xp-gp.dts | 12 ++++++++++++ > > >> 1 files changed, 12 insertions(+), 0 deletions(-) > > >> > > >> diff --git a/arch/arm/boot/dts/armada-xp-gp.dts b/arch/arm/boot/dts/armada-xp-gp.dts > > >> index 3eea531..1c8afe2 100644 > > >> --- a/arch/arm/boot/dts/armada-xp-gp.dts > > >> +++ b/arch/arm/boot/dts/armada-xp-gp.dts > > >> @@ -97,5 +97,17 @@ > > >> phy = <&phy3>; > > >> phy-mode = "rgmii-id"; > > >> }; > > >> + > > >> + spi0: spi at d0010600 { > > >> + status = "okay"; > > >> + > > >> + spi-flash at 0 { > > >> + #address-cells = <1>; > > >> + #size-cells = <1>; > > >> + compatible = "n25q128a13"; > > >> + reg = <0>; /* Chip select 0 */ > > >> + spi-max-frequency = <108000000>; > > > > I had a remark about it, according to the datasheet, 108MHz is the > > maximum frequency for the all the instructions but the READ > > instruction. For the READ the maximum frequency is 54MHz. So I wonder > > if we shouldn't use 54000000 here. > > > > Mmm... nice catch. > > The mtd driver for the spi flash (m25p80) will use FAST_READ opcode > if CONFIG_M25PXX_USE_FAST_READ is selected, and this option > is selected by default. > However we cannot count on this option being selected, of course. > > On the other side, after some testing with spi-max-frequency = 50 MHz > and also with spi-max-frequency = 108 MHz I'm seeing the flash often > (not always) stalls when trying to read the full device through dd: > > / # dd if=/dev/mtd0ro of=/dev/null > FWIW, using CONFIG_DETECT_HUNG_TASK we can see the hung happens inside spi_sync(). It seems the completion handler is never called, though I still don't understand under what circumstances that can happen. dd D c02d79c8 0 964 961 0x00000000 [] (__schedule+0x1c8/0x504) from [] (schedule_timeout+0x158/0x200) [] (schedule_timeout+0x158/0x200) from [] (wait_for_common+0xe0/0x194) [] (wait_for_common+0xe0/0x194) from [] (spi_sync+0x74/0x90) [] (spi_sync+0x74/0x90) from [] (m25p80_read+0x100/0x17c) [] (m25p80_read+0x100/0x17c) from [] (mtd_read+0x8c/0xc0) [] (mtd_read+0x8c/0xc0) from [] (mtdchar_read+0xe0/0x224) [] (mtdchar_read+0xe0/0x224) from [] (vfs_read+0xa4/0x148) [] (vfs_read+0xa4/0x148) from [] (sys_read+0x44/0x78) [] (sys_read+0x44/0x78) from [] (ret_fast_syscall+0x0/0x30) -- Ezequiel Garc?a, Free Electrons Embedded Linux, Kernel and Android Engineering http://free-electrons.com