ARM: davinci: add support for the am1808 based enbw_cmc board
Subsystems (10)
v2 cover ARM: davinci: add support for the am1808 based enbw_cmc board
This patchserie adds support for the davinci am1808 based enbw_cmc board.
Post this patchserie now as v2, as reworked in the comments I got for the RFC serie.
Important: I rebased this patchserie against the irqdomain/next branch from grant likely, as he suggested to rework the OF intcontroller changes to the irqdomain work, branch found here:
http://git.secretlab.ca/?p=linux-2.6.git;a=shortlog;h=refs/heads/irqdomain/next
commit 2462bacd0334d918f9fcd79fc59c403b76b36f8a
Author: Grant Likely <[email protected]> Date: Thu Jan 26 14:10:13 2012 -0700
irq_domain/microblaze: Convert microblaze to use irq_domains
Got no comments to the following points, I noted in the RFC series, so posting this patchseries with them:
- ARM: davinci: configure davinci aemif chipselects through OF not moved to mfd, as mentioned in this discussion:
http://davinci-linux-open-source.1494791.n2.nabble.com/PATCH-arm-davinci-configure-davinci-aemif-chipselects-through-OF-td7059739.html
instead use a phandle in the DTS, so drivers which uses the davinci aemif, can call davinci_aemif_setup_timing_of()
This is just thought as an RFC ... The enbw_cmc board support not really need to setup this bus timings, as they are setup in U-Boot ... but I want to post this, as I think, it is a nice to have, and I am not really sure, if this has to be a MFD device (If so, all bus interfaces for other SoCs should be converted also to MFD devices) ... as an example how this can be used I add this to the davinci nand controller OF support patch, in this patchserie.
- ARM: davinci: mux: add OF support
I want to get rid of the pin setup code in board code ... This patch introduces a davinci_cfg_reg_of() function, which davinci drivers can call, if they found a "pinmux-handle", so used in the following drivers in this patchserie:
drivers/net/ethernet/ti/davinci_emac
drivers/i2c/busses/i2c-davinci.c
drivers/mtd/nand/davinci_nand.c
- post this board support with USB support, even though USB is only working with the 10 ms "workaround", posted here:
http://comments.gmane.org/gmane.linux.usb.general/54505
I see this issue also on the AM1808 TMDXEXP1808L evalboard.
- MMC and USB are not using OF support yet, ideas how to port this are welcome. I need for USB and MMC board specific callbacks, how to solve this with OF support?
Heiko Schocher (7):
ARM: davinci, intc: Add OF support for TI interrupt controller
ARM: davinci: configure davinci aemif chipselects through OF
ARM: davinci: mux: add OF support
ARM: davinci: net: davinci_emac: add OF support
ARM: davinci: i2c: add OF support
ARM: mtd: nand: davinci: add OF support for davinci nand controller
ARM: davinci: add support for the am1808 based enbw_cmc board
.../devicetree/bindings/arm/davinci/aemif.txt | 119 ++++++ .../bindings/arm/davinci/davinci_emac.txt | 43 +++ .../devicetree/bindings/arm/davinci/i2c.txt | 33 ++ .../devicetree/bindings/arm/davinci/intc.txt | 26 ++ .../devicetree/bindings/arm/davinci/mux.txt | 40 ++ .../devicetree/bindings/arm/davinci/nand.txt | 74 ++++ arch/arm/boot/dts/enbw_cmc.dts | 268 ++++++++++++++ arch/arm/configs/enbw_cmc_defconfig | 123 +++++++ arch/arm/mach-davinci/Kconfig | 9 + arch/arm/mach-davinci/Makefile | 1 + arch/arm/mach-davinci/aemif.c | 86 +++++- arch/arm/mach-davinci/board-enbw-cmc.c | 380 ++++++++++++++++++++ arch/arm/mach-davinci/cp_intc.c | 133 +++++++ arch/arm/mach-davinci/include/mach/aemif.h | 1 + arch/arm/mach-davinci/include/mach/cp_intc.h | 1 + arch/arm/mach-davinci/include/mach/mux.h | 2 + arch/arm/mach-davinci/include/mach/uncompress.h | 1 + arch/arm/mach-davinci/mux.c | 73 ++++- drivers/i2c/busses/i2c-davinci.c | 37 ++ drivers/mtd/nand/davinci_nand.c | 85 +++++- drivers/net/ethernet/ti/davinci_emac.c | 94 +++++- 21 files changed, 1625 insertions(+), 4 deletions(-) create mode 100644 Documentation/devicetree/bindings/arm/davinci/aemif.txt create mode 100644 Documentation/devicetree/bindings/arm/davinci/davinci_emac.txt create mode 100644 Documentation/devicetree/bindings/arm/davinci/i2c.txt create mode 100644 Documentation/devicetree/bindings/arm/davinci/intc.txt create mode 100644 Documentation/devicetree/bindings/arm/davinci/mux.txt create mode 100644 Documentation/devicetree/bindings/arm/davinci/nand.txt create mode 100644 arch/arm/boot/dts/enbw_cmc.dts create mode 100644 arch/arm/configs/enbw_cmc_defconfig create mode 100644 arch/arm/mach-davinci/board-enbw-cmc.c
Signature · 1 line
1.7.7.6
PATCH v2 1/7 ARM: davinci, intc: Add OF support for TI interrupt controller
Add a function to initialize the davinci interrupt controller (INTC) using a device tree node.
---
- changes for v2:
- add comment from Grant Likely:
- migrate the whole interrupt controller to natively use an irq_domain. Rebased complete patchserie to:
http://git.secretlab.ca/?p=linux-2.6.git;a=shortlog;h=refs/heads/irqdomain/next
commit 2462bacd0334d918f9fcd79fc59c403b76b36f8a
Author: Grant Likely <[email protected]>
Date: Thu Jan 26 14:10:13 2012 -0700
irq_domain/microblaze: Convert microblaze to use irq_domains
.../devicetree/bindings/arm/davinci/intc.txt | 26 ++++ arch/arm/mach-davinci/cp_intc.c | 133 ++++++++++++++++++++ arch/arm/mach-davinci/include/mach/cp_intc.h | 1 + 3 files changed, 160 insertions(+), 0 deletions(-) create mode 100644 Documentation/devicetree/bindings/arm/davinci/intc.txt
Documentation/devicetree/bindings/arm/davinci/intc.txt new file +26 -0
@@ -0,0 +1,26 @@ +* TI Davinci Interrupt Controller + +davinci are using a TI interrupt controller that can support several +configurable number of interrupts. + +Main node required properties: + +- compatible : should be: + "ti,davinci-intc" +- interrupt-controller : Identifies the node as an interrupt controller +- #interrupt-cells : Specifies the number of cells needed to encode an + interrupt source. The type shall be a <u32> and the value shall be 1. + + The cell contains the interrupt number in the range [0-128]. +- ti,intc-size: Number of interrupts handled by the interrupt controller. +- reg: physical base address and size of the intc registers map. + +Example: + + intc: interrupt-controller at 1 { + compatible = "ti,davinci-intc"; + interrupt-controller; + #interrupt-cells = <1>; + ti,intc-size = <101>; + reg = <0xfffee000 0x2000>; + };
arch/arm/mach-davinci/cp_intc.c +133 -0
145 lines not on this page · raw message
arch/arm/mach-davinci/include/mach/cp_intc.h +1 -0
@@ -52,5 +52,6 @@#define CP_INTC_VECTOR_ADDR (n) (0x2000 + (n << 2))void __init cp_intc_init (void ); +void __init davinci_init_irq (void );#endif /* __ASM_HARDWARE_CP_INTC_H */
Signature · 1 line
1.7.7.6
PATCH v2 1/7 ARM: davinci, intc: Add OF support for TI interrupt controller
Hello.
Quoted 2 lines · Heiko Schocher
Add a function to initialize the davinci interrupt controller (INTC) using a device tree node.
cp_intc is not DaVinci interrupt controller, it's only used in OMAP-L1x
SoCs. cp_intc stands for Common Platform Interrupt Controller. I don't see where you are initializiing the DaVinci interrupt controller itself. You should understand that there are two disctinct types of interrupt controllers used in the SoCs supported by arch/arm/mach-davinci/.
Quoted 7 lines
Signed-off-by Heiko Schocher<[email protected]>Cc davinci-linux-open-source at linux.davincidsp.comCc linux-arm-kernel at lists.infradead.orgCc devicetree-discuss at lists.ozlabs.orgCc Grant Likely<[email protected]>Cc Sekhar Nori<[email protected]>Cc Wolfgang Denk<[email protected]>
[...]
Quoted 6 lines
Documentation/devicetree/bindings/arm/davinci/intc.txt new file +0
-0
Documentation/devicetree/bindings/arm/davinci/intc.txt line 9
Quoted 9 lines
Documentation/devicetree/bindings/arm/davinci/intc.txt new file +9
-0@@ -0,0 +1,26 @@ +* TI Davinci Interrupt Controller + +davinci are using a TI interrupt controller that can support several +configurable number of interrupts. + +Main node required properties: + +- compatible : should be: + "ti,davinci-intc"
The right "compatible" prop would be "ti,cp_intc" in this case.
WBR, Sergei
PATCH v2 1/7 ARM: davinci, intc: Add OF support for TI interrupt controller
Hello Sergei,
Quoted 7 lines · Sergei Shtylyov
Quoted 2 lines · Heiko Schocher
Add a function to initialize the davinci interrupt controller (INTC) using a device tree node.
cp_intcis not DaVinci interrupt controller, it's only used in
OMAP-L1x SoCs.cp_intcstands for Common Platform Interrupt Controller.
Ah, Ok! Thanks for the explanation.
Quoted 3 lines
I don't see where you are initializiing the DaVinci interrupt controller itself. You should understand that there are two disctinct types of interrupt controllers used in the SoCs supported by
arch/arm/mach-davinci/.
board code:
MACHINE_START(ENBW_CMC, "EnBW CMC")
[...]
.init_irq = davinci_init_irq,
and in arch/arm/mach-davinci/cp_intc.c
for the of case:
void __init davinci_init_irq(void)
{
of_irq_init(irq_match);
}in drivers/of/irq.c:
/**
* of_irq_init - Scan and init matching interrupt controllers in DT
* @matches: 0 terminated array of nodes to match and init function to call *
* This function scans the device tree for matching interrupt controller nodes,
* and calls their initialization functions in order with parents first. */
void __init of_irq_init(const struct of_device_id *matches)
Ok, the name of davinci_init_irq() is missleading ...
Should I name it "cp_intc_of_init" ?
Quoted 20 lines
Quoted 7 lines
Signed-off-by Heiko Schocher<[email protected]>Cc davinci-linux-open-source at linux.davincidsp.comCc linux-arm-kernel at lists.infradead.orgCc devicetree-discuss at lists.ozlabs.orgCc Grant Likely<[email protected]>Cc Sekhar Nori<[email protected]>Cc Wolfgang Denk<[email protected]>[...]
Quoted 10 lines
Documentation/devicetree/bindings/arm/davinci/intc.txt new file +3
-0@@ -0,0 +1,26 @@ +* TI Davinci Interrupt Controller + +davinci are using a TI interrupt controller that can support several
Quoted 8 lines
Documentation/devicetree/bindings/arm/davinci/intc.txt line 9
Quoted 6 lines
Documentation/devicetree/bindings/arm/davinci/intc.txt new file +6
-0+configurable number of interrupts. + +Main node required properties: + +- compatible : should be: + "ti,davinci-intc"The right "compatible" prop would be "ti,cp_intc" in this case.
Ok, change this.
Thanks for the review!
bye,
Heiko
Signature · 2 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
PATCH v2 1/7 ARM: davinci, intc: Add OF support for TI interrupt controller
Hello.
Quoted 38 lines · Heiko Schocher
Quoted 5 lines
Quoted 2 lines
Add a function to initialize the davinci interrupt controller (INTC) using a device tree node.
cp_intcis not DaVinci interrupt controller, it's only used in
OMAP-L1x SoCs.cp_intcstands for Common Platform Interrupt Controller.Ah, Ok! Thanks for the explanation.
Quoted 3 lines
I don't see where you are initializiing the DaVinci interrupt controller itself. You should understand that there are two disctinct types of interrupt controllers used in the SoCs supported by
arch/arm/mach-davinci/.board code:
MACHINE_START(ENBW_CMC, "EnBW CMC")
[...]
.init_irq =davinci_init_irq,and in
arch/arm/mach-davinci/cp_intc.cfor the of case:
void
__initdavinci_init_irq(void){ of_irq_init(irq_match); }in
drivers/of/irq.c:/**
*of_irq_init- Scan and init matching interrupt controllers in DT
* @matches: 0 terminated array of nodes to match and init function to call *
* This function scans the device tree for matching interrupt controller nodes,
* and calls their initialization functions in order with parents first. */
void__initof_irq_init(const struct of_device_id *matches)
Quoted 3 lines
Ok, the name of
davinci_init_irq()is missleading ...Should I name it "
cp_intc_of_init" ?
Probably. At least something with "cp_intc" in the name...
Quoted 2 lines
bye,
Heiko
WBR, Sergei
PATCH v2 2/7 ARM: davinci: configure davinci aemif chipselects through OF
In reply to Heiko SchocherAdd support for configuring the aemif timing registers through device tree. Introduce new compatible property "ti,davinci-cs", see full description in Documentation/devicetree/bindings/arm/davinci/aemif.txt
---
- changes for v2
- add comment from Sergei Shtylyov:
- use of_property_read_u32()
- Conding Style changes
- add comment from Sekhar Nori:
- add patch description
- use davinci_aemif_setup_timing
- change compatible node to "ti,davinci-aemif"
- not moved to mfd, as mentioned in this discussion:
http://davinci-linux-open-source.1494791.n2.nabble.com/PATCH-arm-davinci-configure-davinci-aemif-chipselects-through-OF-td7059739.html
instead use a phandle in the DTS, so drivers which uses the davinci aemif, can call davinci_aemif_setup_timing_of()
This is just thought as an RFC ... The enbw_cmc board support not really need to setup this bus timings, as they are setup in U-Boot ... but I want to post this, as I think, it is a nice to have ... as an example used in the davinci nand controller OF support patch, in this patchserie.
.../devicetree/bindings/arm/davinci/aemif.txt | 119 ++++++++++++++++++++ arch/arm/mach-davinci/aemif.c | 86 ++++++++++++++- arch/arm/mach-davinci/include/mach/aemif.h | 1 + 3 files changed, 205 insertions(+), 1 deletions(-) create mode 100644 Documentation/devicetree/bindings/arm/davinci/aemif.txt
Documentation/devicetree/bindings/arm/davinci/aemif.txt new file +119 -0
@@ -0,0 +1,119 @@ +* Texas Instruments Davinci AEMIF + +This file provides information, what the device node for the +davinci aemif interface contain. + +Required properties: +- compatible: "ti,davinci-aemif"; +- #address-cells : Should be either two or three. The first cell is the + chipselect number, and the remaining cells are the + offset into the chipselect. +- #size-cells : Either one or two, depending on how large each chipselect + can be. +- ranges : Each range corresponds to a single chipselect, and cover + the entire access window as configured. + +Optional properties: +- none + +Optional subnodes: +- Chipselect setup: + - compatible: "ti,davinci-cs"; + - #address-cells = <1>; + - #size-cells = <1>; + + Timing setup, all timings in nanoseconds + - cs: chipselect (value 2,3,4 or 5) + - asize: Asynchronous Data Bus Width. + value: + 0: 8 bit + 1: 16 bit + - ta: Minimum Turn-Around time. + - rhold: Read hold width + - rstrobe: Read strobe width + - rsetup: Read setup width + - whold: Write hold width + - wstrobe: Write strobe width + - wsetup: Write setup width + - ew: Extend Wait bit + value: + 0: Extended wait cycles disabled. + 1: Extended wait cycles enabled. + - ss: Select Strobe bit. + value: + 0: Normal Mode enabled. + 1: Select Strobe Mode enabled. +- CFI driver: + see: Documentation/devicetree/bindings/mtd/mtd-physmap.txt + +Example (enbw_cmc board): + aemif at 60000000 { + compatible = "ti,davinci-aemif"; + #address-cells = <2>; + #size-cells = <1>; + reg = <0x68000000 0x80000>; + ranges = <2 0 0x60000000 0x02000000 + 3 0 0x62000000 0x02000000 + 4 0 0x64000000 0x02000000 + 5 0 0x66000000 0x02000000 + 6 0 0x68000000 0x02000000>; + cs2 at 68000000 { + compatible = "ti,davinci-cs"; + #address-cells = <1>; + #size-cells = <1>; + /* all timings in nanoseconds */ + cs = <2>; + asize = <1>; + ta = <0>; + rhold = <7>; + rstrobe = <42>; + rsetup = <14>; + whold = <7>; + wstrobe = <42>; + wsetup = <14>; + ew = <0>; + ss = <0>; + }; + flash at 2,0 { + compatible = "cfi-flash"; + reg = <2 0x0 0x400000>; + #address-cells = <1>; + #size-cells = <1>; + bank-width = <2>; + device-width = <2>; + }; + nand_cs: cs3 at 68000000 { + compatible = "ti,davinci-cs"; + #address-cells = <1>; + #size-cells = <1>; + /* all timings in nanoseconds */ + cs = <3>; + asize = <0>; + ta = <0>; + rhold = <7>; + rstrobe = <42>; + rsetup = <7>; + whold = <7>; + wstrobe = <14>; + wsetup = <7>; + ew = <0>; + ss = <0>; + }; + nandflash at 3,0 { + compatible = "ti,davinci-nand"; + reg = <3 0x0 0x807ff + 6 0x0 0x8000>; + #address-cells = <1>; + #size-cells = <1>; + mask_ale = <0>; + mask_cle = <0>; + mask_chipsel = <0>; + ecc_mode = <2>; + ecc_bits = <4>; + options = <0>; + bbt_options = <0x20000>; + pinmux-handle = <&nand_pins>; + timing-handle = <&nand_cs>; + }; + + };
arch/arm/mach-davinci/aemif.c +85 -1
113 lines not on this page · raw message
arch/arm/mach-davinci/include/mach/aemif.h +1 -0
@@ -33,4 +33,5 @@ struct davinci_aemif_timing {int davinci_aemif_setup_timing (struct davinci_aemif_timing *t,void __iomem *base,unsigned cs); +int davinci_aemif_setup_timing_of (struct device_node *np);#endif
Signature · 1 line
1.7.7.6
PATCH v2 3/7 ARM: davinci: mux: add OF support
In reply to Heiko Schocheradd support for configuring the pinmux on davinci SoC through OF.
---
This patch is just a RFC, as I want to get rid of the pin setup code in board code ... This patch introduces a davinci_cfg_reg_of() function, which davinci drivers can call, if they found a pinmux-handle, so used in the following drivers in this patchserie:
drivers/net/ethernet/ti/davinci_emacdrivers/i2c/busses/i2c-davinci.cdrivers/mtd/nand/davinci_nand.c
Comments are welcome.
.../devicetree/bindings/arm/davinci/mux.txt | 40 +++++++++++ arch/arm/mach-davinci/include/mach/mux.h | 2 + arch/arm/mach-davinci/mux.c | 73 +++++++++++++++++++- 3 files changed, 114 insertions(+), 1 deletions(-) create mode 100644 Documentation/devicetree/bindings/arm/davinci/mux.txt
Documentation/devicetree/bindings/arm/davinci/mux.txt new file +40 -0
@@ -0,0 +1,40 @@ +* Texas Instruments Davinci pinmux + +This file provides information, what the device node for the +davinci pinmux interface contain. + +Required properties: +- compatible: "ti,davinci-pinmux"; +- pins : contains a table with the following colums: + mux register: pinmux register + register offset: offset in register, which to change + mode mask: mode mask + mode value: mode value + +Optional properties: +- none + +Example (enbw_cmc board): + emac_pins: pinmux at 1c14120 { + compatible = "ti,davinci-pinmux"; + reg = <0x14120 0x1000>; + pins = < /* muxreg maskoff modemsk muxmode */ + 2 4 15 8 /* MII TXEN */ + 2 8 15 8 /* MII TXCLK */ + 2 12 15 8 /* MII COL */ + 2 16 15 8 /* MII TXD_3 */ + 2 20 15 8 /* MII TXD_2 */ + 2 24 15 8 /* MII TXD_1 */ + 2 28 15 8 /* MII TXD_0 */ + 3 8 15 8 /* MII RXER */ + 3 12 15 8 /* MII CRS */ + 3 0 15 8 /* MII RXCLK */ + 3 4 15 8 /* MII RXDV */ + 3 16 15 8 /* MII RXD_3 */ + 3 20 15 8 /* MII RXD_2 */ + 3 24 15 8 /* MII RXD_1 */ + 3 28 15 8 /* MII RXD_0 */ + 4 0 15 8 /* MDIO CLK */ + 4 4 15 8 /* MDIO D */ + >; + };
arch/arm/mach-davinci/include/mach/mux.h +2 -0
@@ -1205,6 +1205,7 @@ enum davinci_tnetv107x_index {/* setup pin muxing */ extern int davinci_cfg_reg (unsigned long reg_cfg);extern int davinci_cfg_reg_list (const short pins[]); +extern int davinci_cfg_reg_of (struct device_node *);#else /* boot loader does it all (no warnings from CONFIG_DAVINCI_MUX_WARNINGS) */ static inline int davinci_cfg_reg (unsigned long reg_cfg) {return 0 ; }
@@ -1212,6 +1213,7 @@ static inline int davinci_cfg_reg_list(const short pins[]) {return 0 ; } +static int davinci_cfg_reg_of (struct device_node *) {return 0 ; };#endif #endif /* __INC_MACH_MUX_H */
arch/arm/mach-davinci/mux.c +72 -1
96 lines not on this page · raw message
Signature · 1 line
1.7.7.6
PATCH v2 4/7 ARM: davinci: net: davinci_emac: add OF support
In reply to Heiko Schocheradd of support for the davinci_emac driver.
---
- changes for v2:
- add comment from Anatoly Sivov
- fix typo in davinci_emac.txt
- add comment from Grant Likely:
- add prefix "ti,davinci-" to davinci specific property names
- remove version property
- use compatible name "ti,davinci-dm6460-emac"
- use devm_kzalloc()
- use of_match_ptr()
- document all new properties
- remove of_address_to_resource() and do not overwrite resource table
- whitespace fixes
- remove hw_ram_addr as it is not used in current board code
.../bindings/arm/davinci/davinci_emac.txt | 43 +++++++++ drivers/net/ethernet/ti/davinci_emac.c | 94 +++++++++++++++++++- 2 files changed, 136 insertions(+), 1 deletions(-) create mode 100644 Documentation/devicetree/bindings/arm/davinci/davinci_emac.txt
Documentation/devicetree/bindings/arm/davinci/davinci_emac.txt new file +43 -0
@@ -0,0 +1,43 @@ +* Texas Instruments Davinci EMAC + +This file provides information, what the device node +for the davinci_emac interface contain. + +Required properties: +- compatible: "ti,davinci-dm6460-emac"; +- reg: Offset and length of the register set for the device +- ti,davinci-ctrl-reg-offset: offset to control register +- ti,davinci-ctrl-mod-reg-offset: offset to control module register +- ti,davinci-ctrl-ram-offset: offset to control module ram +- ti,davinci-ctrl-ram-size: size of control module ram +- ti,davinci-rmii-en: use RMII +- ti,davinci-no-bd-ram: has the emac controller BD RAM +- phy-handle: Contains a phandle to an Ethernet PHY. + if not, davinci_emac driver defaults to 100/FULL +- interrupts: interrupt mapping for the davinci emac interrupts sources: + 4 sources: <Receive Threshold Interrupt + Receive Interrupt + Transmit Interrupt + Miscellaneous Interrupt> +- pinmux-handle: Contains a handle to configure the pinmux settings. + +Optional properties: +- local-mac-address : 6 bytes, mac address + +Example (enbw_cmc board): + eth0: emac at 1e20000 { + compatible = "ti,davinci-dm6460-emac"; + reg = <0x220000 0x4000>; + ti,davinci-ctrl-reg-offset = <0x3000>; + ti,davinci-ctrl-mod-reg-offset = <0x2000>; + ti,davinci-ctrl-ram-offset = <0>; + ti,davinci-ctrl-ram-size = <0x2000>; + local-mac-address = [ 00 00 00 00 00 00 ]; + interrupts = <33 + 34 + 35 + 36 + >; + interrupt-parent = <&intc>; + pinmux-handle = <&emac_pins>; + };
drivers/net/ethernet/ti/davinci_emac.c +93 -1
130 lines not on this page · raw message
Signature · 1 line
1.7.7.6
PATCH v2 5/7 ARM: davinci: i2c: add OF support
In reply to Heiko Schocheradd of support for the davinci i2c driver.
---
- changes for v2:
- add comments from Sylwester Nawrocki <[email protected]>:
- use "cell-index" instead "id"
- OF_DEV_AUXDATA in the machine code, instead pre-define platform device name
- add comment from Grant Likely:
- removed "id" resp. "cell-index" completely
- fixed documentation
- use of_match_ptr()
- use devm_kzalloc() for allocating plattform data mem
- fixed a whitespace issue
.../devicetree/bindings/arm/davinci/i2c.txt | 33 +++++++++++++++++ drivers/i2c/busses/i2c-davinci.c | 37 ++++++++++++++++++++ 2 files changed, 70 insertions(+), 0 deletions(-) create mode 100644 Documentation/devicetree/bindings/arm/davinci/i2c.txt
Documentation/devicetree/bindings/arm/davinci/i2c.txt new file +33 -0
@@ -0,0 +1,33 @@ +* Texas Instruments Davinci I2C + +This file provides information, what the device node for the +davinci i2c interface contain. + +Required properties: +- compatible: "ti,davinci-i2c"; +- reg : Offset and length of the register set for the device + +Recommended properties : +- interrupts : <a> standard interrupt property. +- clock-frequency : desired I2C bus clock frequency in Hz. + +Optional properties: +- bus-delay: bus delay in usec +- pinmux-handle: Contains a handle to configure the pinmux settings. + +Example (enbw_cmc board): + i2c at 1c22000 { + compatible = "ti,davinci-i2c"; + reg = <0x22000 0x1000>; + clock-frequency = <100000>; + interrupts = <15>; + interrupt-parent = <&intc>; + pinmux-handle = <&i2c1_pins>; + #address-cells = <1>; + #size-cells = <0>; + + dtt at 48 { + compatible = "national,lm75"; + reg = <0x48>; + }; + };
drivers/i2c/busses/i2c-davinci.c +37 -0
@@ -38,9 +38,12 @@#include <linux/slab.h> #include <linux/cpufreq.h> #include <linux/gpio.h> +#include <linux/of_i2c.h> +#include <linux/of_device.h> #include <mach/hardware.h> #include <mach/i2c.h> +#include <mach/mux.h> /* ----- global defines ----------------------------------------------- */
@@ -635,6 +638,12 @@ static struct i2c_algorithm i2c_davinci_algo = { .functionality = i2c_davinci_func, }; +static const struct of_device_id davinci_i2c_of_match[] = { + {.compatible ="ti,davinci-i2c" , }, + {}, +}; +MODULE_DEVICE_TABLE (of, davinci_i2c_of_match); +static int davinci_i2c_probe (struct platform_device *pdev) {struct davinci_i2c_dev *dev;
@@ -676,6 +685,31 @@ static int davinci_i2c_probe(struct platform_device *pdev) dev->irq = irq->start;platform_set_drvdata (pdev, dev); +if ((dev->dev->platform_data ==NULL ) && + (pdev->dev.of_node)) { +struct device_node *pinmux_np; +struct davinci_i2c_platform_data *pdata; +u32 prop; + + pdata =devm_kzalloc (&pdev->dev,sizeof (*pdata),GFP_KERNEL ); +if (!pdata) { + r = -ENOMEM ; + goto err_free_mem; + } +memcpy (pdata, &davinci_i2c_platform_data_default, +sizeof (*pdata)); + dev->dev->platform_data = pdata; +if (!of_property_read_u32 (pdev->dev.of_node,"clock-frequency" , + &prop)) + pdata->bus_freq = prop /1000 ; +if (!of_property_read_u32 (pdev->dev.of_node,"bus-delay" , + &prop)) + pdata->bus_delay = prop; + pinmux_np =of_parse_phandle (pdev->dev.of_node, +"pinmux-handle" ,0 ); +if (pinmux_np) +davinci_cfg_reg_of (pinmux_np); + } dev->clk =clk_get (&pdev->dev,NULL );if (IS_ERR (dev->clk)) { r = -ENODEV ;
@@ -711,6 +745,7 @@ static int davinci_i2c_probe(struct platform_device *pdev) adap->algo = &i2c_davinci_algo; adap->dev.parent = &pdev->dev; adap->timeout =DAVINCI_I2C_TIMEOUT ; + adap->dev.of_node = pdev->dev.of_node; adap->nr = pdev->id; r =i2c_add_numbered_adapter (adap);
@@ -718,6 +753,7 @@ static int davinci_i2c_probe(struct platform_device *pdev)dev_err (&pdev->dev,"failure adding adapter\n" ); goto err_free_irq; } +of_i2c_register_devices (adap);return 0 ;
@@ -809,6 +845,7 @@ static struct platform_driver davinci_i2c_driver = { .name = "i2c_davinci", .owner = THIS_MODULE, .pm = davinci_i2c_pm_ops, + .of_match_table = of_match_ptr(davinci_i2c_of_match), }, };
Signature · 1 line
1.7.7.6
PATCH v2 6/7 ARM: mtd: nand: davinci: add OF support for davinci nand controller
In reply to Heiko Schocheradd OF support for the davinci nand controller.
---
- changes for v2:
- add comments from Scott Wood:
- add "ti,davinci-" prefix
- Dashes are preferred to underscores
- rename "nandflash" to "nand"
- introduce new "ti,davinci" specific properties for setting up ecc_mode, ecc_bits, options and bbt options, instead using linux defines
- readme fixes
.../devicetree/bindings/arm/davinci/nand.txt | 74 +++++++++++++++++ drivers/mtd/nand/davinci_nand.c | 85 +++++++++++++++++++- 2 files changed, 158 insertions(+), 1 deletions(-) create mode 100644 Documentation/devicetree/bindings/arm/davinci/nand.txt
Documentation/devicetree/bindings/arm/davinci/nand.txt new file +74 -0
@@ -0,0 +1,74 @@ +* Texas Instruments Davinci NAND + +This file provides information, what the device node for the +davinci nand interface contain. + +Required properties: +- compatible: "ti,davinci-nand"; +- reg : contain 2 offset/length values: + - offset and length for the access window + - offset and length for accessing the aemif control registers +- ti,davinci-chipselect: Indicates on the davinci_nand driver which + chipselect is used for accessing the nand. + +Recommended properties : +- ti,davinci-mask-ale: mask for ale +- ti,davinci-mask-cle: mask for cle +- ti,davinci-mask-chipsel: mask for chipselect +- ti,davinci-ecc-mode: ECC mode valid values for davinci driver: + - "none" + - "soft" + - "hw" +- ti,davinci-ecc-bits: used ECC bits, currently supported 1 or 4. +- ti,davinci-nand-buswidth: buswidth 8 or 16 +- ti,davinci-nand-use-bbt: use flash based bad block table support. + +Optional properties: +- pinmux-handle: contains a handle to configure the pinmux settings. +- timing-handle: contains a handle to setup aemif timing. + +Example (enbw_cmc board): +aemif at 60000000 { + compatible = "ti,davinci-aemif"; + #address-cells = <2>; + #size-cells = <1>; + reg = <0x68000000 0x80000>; + ranges = <2 0 0x60000000 0x02000000 + 3 0 0x62000000 0x02000000 + 4 0 0x64000000 0x02000000 + 5 0 0x66000000 0x02000000 + 6 0 0x68000000 0x02000000>; + nand_cs: cs3 at 68000000 { + compatible = "ti,davinci-cs"; + #address-cells = <1>; + #size-cells = <1>; + /* all timings in nanoseconds */ + cs = <3>; + asize = <0>; + ta = <0>; + rhold = <7>; + rstrobe = <42>; + rsetup = <7>; + whold = <7>; + wstrobe = <14>; + wsetup = <7>; + ew = <0>; + ss = <0>; + }; + nand at 3,0 { + compatible = "ti,davinci-nand"; + reg = <3 0x0 0x807ff + 6 0x0 0x8000>; + #address-cells = <1>; + #size-cells = <1>; + ti,davinci-chipselect = <1>; + ti,davinci-mask-ale = <0>; + ti,davinci-mask-cle = <0>; + ti,davinci-mask-chipsel = <0>; + ti,davinci-ecc-mode = "hw"; + ti,davinci-ecc-bits = <4>; + ti,davinci-nand-use-bbt; + pinmux-handle = <&nand_pins>; + timing-handle = <&nand_cs>; + }; +};
drivers/mtd/nand/davinci_nand.c +84 -1
114 lines not on this page · raw message
Signature · 1 line
1.7.7.6
A message that is not in the archive (sent off-list or not yet received): 1329893410-24413-1-git-send-email-hs-ynQEQJNshbs@public.gmane.org
PATCH v2 7/7 ARM: davinci: add support for the am1808 based enbw_cmc board
- AM1808 based board
- 64 MiB DDR ram
- 2 MiB Nor flash
- 128 MiB NAND flash
- use internal RTC
- I2C support
- hwmon lm75 support
- UBI/UBIFS support
- MMC support
- USB OTG support
---
- post this board support with USB support, even though USB is only working with the 10 ms "workaround", posted here:
http://comments.gmane.org/gmane.linux.usb.general/54505
I see this issue also on the AM1808 TMDXEXP1808L evalboard.
- MMC and USB are not using OF support yet, ideas how to port this are welcome. I need for USB and MMC boards board specific callbacks, how to solve this with OF support?
- changes for v2:
- changes in the nand node due to comments from Scott Wood:
- add "ti,davinci-" prefix
- Dashes are preferred to underscores
- rename "nandflash" to "nand"
- introduce new "ti,davinci" specific properties for setting up ecc_mode, ecc_bits, options and bbt options, instead using linux defines
- changes for i2c due to comments from Sylwester Nawrocki:
- use "cell-index" instead "id"
- OF_DEV_AUXDATA in the machine code, instead pre-define platform device name
- add comment from Grant Likely for i2c:
- removed "id" resp. "cell-index" completely
- fixed documentation
- use of_match_ptr()
- use devm_kzalloc() for allocating plattform data mem
- fixed a whitespace issue
- add net comments from Grant Likely:
- add prefix "ti,davinci-" to davinci specific property names
- remove version property
- use compatible name "ti,davinci-dm6460-emac"
- add comment from Grant Likely:
- rename compatible node
- do not use cell-index
- CONFIG_OF required for this board
TODO:
- create a generic board support file, as I got no answer to my ping to grant, maybe this could be done in a second step?
arch/arm/boot/dts/enbw_cmc.dts | 268 ++++++++++++++++ arch/arm/configs/enbw_cmc_defconfig | 123 ++++++++ arch/arm/mach-davinci/Kconfig | 9 + arch/arm/mach-davinci/Makefile | 1 + arch/arm/mach-davinci/board-enbw-cmc.c | 380 +++++++++++++++++++++++ arch/arm/mach-davinci/include/mach/uncompress.h | 1 + 6 files changed, 782 insertions(+), 0 deletions(-) create mode 100644 arch/arm/boot/dts/enbw_cmc.dts create mode 100644 arch/arm/configs/enbw_cmc_defconfig create mode 100644 arch/arm/mach-davinci/board-enbw-cmc.c
arch/arm/boot/dts/enbw_cmc.dts new file +268 -0
@@ -0,0 +1,268 @@ +/* + * Device Tree for the EnBW CMC plattform + * + * Copyright 2011 DENX Software Engineering GmbH + * Heiko Schocher <[email protected]> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ +/dts-v1/; +/include/ "skeleton.dtsi" + +/ { + model = "EnBW CMC"; + compatible = "enbw,cmc"; + + aliases { + ethernet0 = ð0; + }; + + arm { + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0xfffee000 0x00020000>; + intc: interrupt-controller at 1 { + compatible = "ti,davinci-intc"; + interrupt-controller; + #interrupt-cells = <1>; + ti,intc-size = <101>; + reg = <0x0 0x2000>; + }; + }; + soc at 1c00000 { + compatible = "ti,da850"; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0x0 0x01c00000 0x400000>; + + serial0: serial at 1c42000 { + compatible = "ti,da850", "ns16550a"; + reg = <0x42000 0x100>; + clock-frequency = <150000000>; + reg-shift = <2>; + interrupts = <25>; + interrupt-parent = <&intc>; + }; + serial1: serial at 1d0c000 { + compatible = "ti,da850", "ns16550a"; + reg = <0x10c000 0x100>; + clock-frequency = <150000000>; + reg-shift = <2>; + interrupts = <53>; + interrupt-parent = <&intc>; + }; + serial2: serial at 1d0d000 { + compatible = "ti,da850", "ns16550a"; + reg = <0x10d000 0x100>; + clock-frequency = <150000000>; + reg-shift = <2>; + interrupts = <61>; + interrupt-parent = <&intc>; + }; + + nor_pins: nor_pinmux at 1c14120 { + compatible = "ti,davinci-pinmux"; + reg = <0x14120 0x1000>; + pins = < /* muxreg maskoff modemsk muxmode */ + 5 24 15 1 /* EMA_BA_1 */ + 6 0 15 1 /* EMA CLK */ + 6 24 15 1 /* EMA_WAIT_1 */ + 7 0 15 1 /* NEMA_CS_2 */ + 7 16 15 1 /* NEMA_WE */ + 7 20 15 1 /* NEMA_OE */ + 9 28 15 1 /* EMA_D_0 */ + 9 24 15 1 /* EMA_D_1 */ + 9 20 15 1 /* EMA_D_2 */ + 9 16 15 1 /* EMA_D_3 */ + 9 12 15 1 /* EMA_D_4 */ + 9 8 15 1 /* EMA_D_5 */ + 9 4 15 1 /* EMA_D_6 */ + 9 0 15 1 /* EMA_D_7 */ + 8 28 15 1 /* EMA_D_8 */ + 8 24 15 1 /* EMA_D_9 */ + 8 20 15 1 /* EMA_D_10 */ + 8 16 15 1 /* EMA_D_11 */ + 8 12 15 1 /* EMA_D_12 */ + 8 8 15 1 /* EMA_D_13 */ + 8 4 15 1 /* EMA_D_14 */ + 8 0 15 1 /* EMA_D_15 */ + 12 28 15 1 /* EMA_A_0 */ + 12 24 15 1 /* EMA_A_1 */ + 12 20 15 1 /* EMA_A_2 */ + 12 16 15 1 /* EMA_A_3 */ + 12 12 15 1 /* EMA_A_4 */ + 12 8 15 1 /* EMA_A_5 */ + 12 4 15 1 /* EMA_A_6 */ + 12 0 15 1 /* EMA_A_7 */ + 11 28 15 1 /* EMA_A_8 */ + 11 24 15 1 /* EMA_A_9 */ + 11 20 15 1 /* EMA_A_10 */ + 11 16 15 1 /* EMA_A_11 */ + 11 12 15 1 /* EMA_A_12 */ + 11 8 15 1 /* EMA_A_13 */ + 11 4 15 1 /* EMA_A_14 */ + 11 0 15 1 /* EMA_A_15 */ + 10 28 15 1 /* EMA_A_16 */ + 10 24 15 1 /* EMA_A_17 */ + 10 20 15 1 /* EMA_A_18 */ + 10 16 15 1 /* EMA_A_19 */ + 10 12 15 1 /* EMA_A_20 */ + 10 8 15 1 /* EMA_A_21 */ + 10 4 15 1 /* EMA_A_22 */ + 10 0 15 1 /* EMA_A_23 */ + >; + }; + nand_pins: nand_pinmux at 1c14120 { + compatible = "ti,davinci-pinmux"; + reg = <0x14120 0x1000>; + pins = < /* muxreg maskoff modemsk muxmode */ + 7 4 15 1 /* NEMA_CS_3 */ + >; + }; + + emac_pins: pinmux at 1c14120 { + compatible = "ti,davinci-pinmux"; + reg = <0x14120 0x1000>; + pins = < /* muxreg maskoff modemsk muxmode */ + 2 4 15 8 /* MII TXEN */ + 2 8 15 8 /* MII TXCLK */ + 2 12 15 8 /* MII COL */ + 2 16 15 8 /* MII TXD_3 */ + 2 20 15 8 /* MII TXD_2 */ + 2 24 15 8 /* MII TXD_1 */ + 2 28 15 8 /* MII TXD_0 */ + 3 8 15 8 /* MII RXER */ + 3 12 15 8 /* MII CRS */ + 3 0 15 8 /* MII RXCLK */ + 3 4 15 8 /* MII RXDV */ + 3 16 15 8 /* MII RXD_3 */ + 3 20 15 8 /* MII RXD_2 */ + 3 24 15 8 /* MII RXD_1 */ + 3 28 15 8 /* MII RXD_0 */ + 4 0 15 8 /* MDIO CLK */ + 4 4 15 8 /* MDIO D */ + >; + }; + + i2c1_pins: i2c_pinmux at 1c14120 { + compatible = "ti,davinci-pinmux"; + reg = <0x14120 0x1000>; + pins = < /* muxreg maskoff modemsk muxmode */ + 4 12 15 2 /* I2C0 SDA */ + 4 8 15 2 /* I2C0 SCL */ + >; + }; + + eth0: emac at 1e20000 { + compatible = "ti,davinci-dm6460-emac"; + reg = <0x220000 0x4000>; + ti,davinci-ctrl-reg-offset = <0x3000>; + ti,davinci-ctrl-mod-reg-offset = <0x2000>; + ti,davinci-ctrl-ram-offset = <0>; + ti,davinci-ctrl-ram-size = <0x2000>; + local-mac-address = [ 00 00 00 00 00 00 ]; + interrupts = <33 + 34 + 35 + 36 + >; + interrupt-parent = <&intc>; + pinmux-handle = <&emac_pins>; + }; + + i2c at 1c22000 { + compatible = "ti,davinci-i2c"; + reg = <0x22000 0x1000>; + clock-frequency = <100000>; + interrupts = <15>; + interrupt-parent = <&intc>; + pinmux-handle = <&i2c1_pins>; + #address-cells = <1>; + #size-cells = <0>; + + dtt at 48 { + compatible = "national,lm75"; + reg = <0x48>; + }; + }; + }; + onchipram at 8000000 { + compatible = "ti,davinci-onchipram"; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0x0 0x80000000 0x20000>; + }; + aemif at 60000000 { + compatible = "ti,davinci-aemif"; + #address-cells = <2>; + #size-cells = <1>; + reg = <0x68000000 0x80000>; + ranges = <2 0 0x60000000 0x02000000 + 3 0 0x62000000 0x02000000 + 4 0 0x64000000 0x02000000 + 5 0 0x66000000 0x02000000 + 6 0 0x68000000 0x02000000>; + cs2 at 68000000 { + compatible = "ti,davinci-cs"; + #address-cells = <1>; + #size-cells = <1>; + /* all timings in nanoseconds */ + cs = <2>; + asize = <1>; + ta = <0>; + rhold = <7>; + rstrobe = <42>; + rsetup = <14>; + whold = <7>; + wstrobe = <42>; + wsetup = <14>; + ew = <0>; + ss = <0>; + }; + flash at 2,0 { + compatible = "cfi-flash"; + reg = <2 0x0 0x400000>; + #address-cells = <1>; + #size-cells = <1>; + bank-width = <2>; + device-width = <2>; + }; + nand_cs: cs3 at 68000000 { + compatible = "ti,davinci-cs"; + #address-cells = <1>; + #size-cells = <1>; + /* all timings in nanoseconds */ + cs = <3>; + asize = <0>; + ta = <0>; + rhold = <7>; + rstrobe = <42>; + rsetup = <7>; + whold = <7>; + wstrobe = <14>; + wsetup = <7>; + ew = <0>; + ss = <0>; + }; + nand at 3,0 { + compatible = "ti,davinci-nand"; + reg = <3 0x0 0x807ff + 6 0x0 0x8000>; + #address-cells = <1>; + #size-cells = <1>; + ti,davinci-chipselect = <1>; + ti,davinci-mask-ale = <0>; + ti,davinci-mask-cle = <0>; + ti,davinci-mask-chipsel = <0>; + ti,davinci-ecc-mode = "hw"; + ti,davinci-ecc-bits = <4>; + ti,davinci-nand-use-bbt; + pinmux-handle = <&nand_pins>; + timing-handle = <&nand_cs>; + }; + + }; +};
arch/arm/configs/enbw_cmc_defconfig new file +123 -0
123 lines not on this page · raw message
arch/arm/mach-davinci/Kconfig +9 -0
@@ -202,6 +202,15 @@ config DA850_WL12XX Say Y if you want to use a wl1271 expansion card connected to the AM18x EVM. +config MACH_ENBW_CMC + bool "EnBW Communication Module Compact" + default ARCH_DAVINCI_DA850 + depends on ARCH_DAVINCI_DA850 + select OF + help + Say Y here to select the EnBW Communication Module Compact + board. + config GPIO_PCA953X default MACH_DAVINCI_DA850_EVM
arch/arm/mach-davinci/Makefile +1 -0
@@ -34,6 +34,7 @@ obj-$(CONFIG_MACH_DAVINCI_DA850_EVM) += board-da850-evm.o obj-$(CONFIG_MACH_TNETV107X) += board-tnetv107x-evm.o obj-$(CONFIG_MACH_MITYOMAPL138) += board-mityomapl138.o obj-$(CONFIG_MACH_OMAPL138_HAWKBOARD) += board-omapl138-hawk.o +obj-$(CONFIG_MACH_ENBW_CMC) += board-enbw-cmc.o # Power Management obj-$(CONFIG_CPU_FREQ) += cpufreq.o
arch/arm/mach-davinci/board-enbw-cmc.c new file +380 -0
380 lines not on this page · raw message
arch/arm/mach-davinci/include/mach/uncompress.h +1 -0
@@ -96,6 +96,7 @@ static inline void __arch_decomp_setup(unsigned long arch_id)DEBUG_LL_DA8XX (davinci_da850_evm,2 );DEBUG_LL_DA8XX (mityomapl138,1 );DEBUG_LL_DA8XX (omapl138_hawkboard,2 ); +DEBUG_LL_DA8XX (enbw_cmc,2 );/* TNETV107x boards */ DEBUG_LL_TNETV107X (tnetv107x,1 );
Signature · 1 line
1.7.7.6