Updating SPEAr Support
Subsystems (4)
v4 cover Updating SPEAr Support
Following set of patches:
- updates SPEAr3xx, 6xx support
- Adds support for SPEAr13xx
- Removes Multiple defconfigs per machine family
Changes since V3:
- SPEAr13xx: gic init, smp and hotplug code updated w.r.t. latest linus/master
- Appending UL to VMALLOC_END Macros
- readl & writle _relaxed used instread _raw in uncompress.h
- infinite loop removed from arch_reset() in mach-spear13xx/include/mach/system.h
- patch: ST-SPEAr13xx-Modified-static-mappings is broken into two patches. Now, static mapping for SPEAr1310 RAS will be present only on 1310 machine.
- Updated commit message of: SPEAr Power Management: Added the support for Standby mode
- Default ssp freq changed to 25MHz.
- patch: ST-SPEAr-13xx-Adding-support-for-SPEAr1310 is splitted into two patches. Separate patch for 320 CAN is added.
- Wrapper routine spi_init() in spear*evb.c files is removed.
- routine i2c_register_board_devices() is renamed to i2c_register_default_devices() in arch/arm/plat-spear/i2c_eval_board.c file
- Following patches are removed from this patchset, they will be added separately:
ST-SPEAr-FSMC-Flexible-Static-Memory-Controller-NOR-.patch
- Following patches are already present in linus-next or already Acked, so they are also removed from this patchset:
Newly-erased-page-read-workaround.patch
Changes since V2:
- Following patches are removed from this patchset, as they are still under review:
ST SPEAr: PCIE gadget suppport
ST SPEAr13xx: Adding machine support for pci gadget
ST SPEAr: Add smi driver for serial NOR flash
ST SPEAr: Adding support for serial nor flash in all spear platforms
- Following patches are already present in linus-next, so they are also removed from this patchset:
mtd/fsmc.h: including linux/io.h for definition of readl
Keyboard: Adding support for spear-keyboard
USB host: Adding USB ehci & ohci support for spear platform
- spear-keyboard machine support is updated according to updations in driver (driver is already in linus-next)
- rtc driver is updated and ioctl routine is removed.
Changes since V1:
- sev definitions moved to system.h and removed from spear and omap archs
- bug fix added in system controller file sp810.h
- Review Comments incorporated
- Driver and machine support are divided into separate patches
- Nand Driver is removed from patch list as it is already floated by Linus Walleij.
- Few later patches of SPEAr13xx Patches are merged with initial patches of SPEAr13xx
- Smaller Defconfigs are used instead of large.
- Clock renaming & minor corrections are moved to clock specific patches from peripheral machine support patches.
- Removed Commented code related to SPI
- [PATCH] Incrementing the ecc_pos array to contain 128 char - is removed from list
- Board specific code is moved to *evb.c files from machine files for EMI NOR
- replaced readl with __raw_readl in uncompress.h in plat-spear/include/plat/
Rebased over linus: v2.6.37e6f597a1425b5af64917be3448b29e2d5a585ac8
Bhupesh Sharma (1):
ST SPEAr 13xx : Adding support for SPEAr1310
Deepak Sikri (5):
ST SPEAr: Adding machine support for USB host
SPEAr Clock Framework: Adding support for PLL frequency change SPEAr Power Management: Added the support for Standby mode. SPEAr CPU freq: Adding support for CPU Freq framework ST SPEAr13xx: Adding CPU hotplug support added for SMP platforms
Pratyush Anand (1):
ST SPEAr: Added PCIE host controller base driver support.
Rajeev Kumar (4):
rtc: Adding support for spear rtc
ST SPEAr: Adding machine support for rtc-spear ST SPEAr: adding support for synopsis i2c designware ST SPEAr: Adding machine support for keyboard
Ryan Mallon (5):
SPEAr3xx: Make local structures static
SPEAR3xx: Rename register/irq defines to remove naming conflicts
SPEAr3xx: Rework pmx_dev code to remove conflicts
SPEAr3xx: Rework KConfig to allow all boards to be compiled in
SPEAr3xx: Replace defconfigs with single unified defconfig
Shiraz Hashim (13):
sp810 Fix: Switch to slow mode before sysctl_soft_reset ST SPEAr: Formalized timer support
ST SPEAr13XX: Adding machine specific header files
ST SPEAr13XX: Adding machine specific src files
ST SPEAr: Adding support for SPEAr13xx SoC in spear generic plat/ ST SPEAr13XX: Added compilation support in arch/arm/ ST SPEAr13xx: Adding default config file
ST SPEAr: Adding Debugfs support on clock framework
ST SPEAr: Replacing SIZE macro's with actual required size
SPEAr: defines base addresses as ulong.
ST SPEAr13xx: add L2 cache support
ST SPEAr13xx: Modified static mappings
ST SPEAr: Adding information in Documentation/ and MAINTAINERS
Vipin Kumar (5):
ST SPEAr: Adding machine support for nand
ST SPEAr : EMI (Extrenal Memory Interface) controller driver SPEAr : Pad multiplexing handling modified
SPEAr13xx : Fixed part devices in SPEAr13xx addded to the generic
implementation
SPEAr : Updating pad multiplexing support
Vipul-kumar Samar (1):
ST SPEAr: Adding support for CLCD on SPEAr3xx/6xx
Viresh Kumar (27):
spear/vmalloc.h: Appending UL to VMALLOC_END
ST SPEAr: Padmux code Updated
ST SPEAr: Making clock functions more generic
ST SPEAr: Updating Clock Support
ST SPEAr: Correcting SOC Config base address for spear320 ST SPEAr: Adding PLGPIO driver for spear platform
ST SPEAr: Added ARM PL061 GPIO Support on SPEAr13xx and modified
resource size
ST SPEAr: Adding support for ST's PWM IP
ST SPEAr: Adding Watchdog support
ST SPEAr: Adding support for SSP PL022
ST SPEAr: Adding support for SDHCI (SDIO)
ST SPEAr: Changing resource size of amba devices to SZ_4K ST SPEAr: Adding miscellaneous devices
SPEAr320: Adding support for CAN
ST SPEAr: Adding support for DDR in clock framework
ST SPEAr: replace readl, writel with readl_relaxed, writel_relaxed in
uncompress.h
SPEAr1310: Adding Static Mapping for RAS Area
SPEAr: Adding and Updating Clock definitions
ST SPEAr3xx: Passing pmx devices address from machine *.c files ST SPEAr Clock Framework: Updating for single image solution ST SPEAr: Appending spear3** with global structures
ST SPEAr3xx: Updating plgpio and emi source to make it compliant with
single image strategy
SPEAr6xx: Rework Kconfig for single image solution
ST SPEAR6xx: renaming spear600_defconfig as spear6xx_defconfig ST SPEAr13xx: Pass default padmux settings as parameter to
spear13**_init routine
ST SPEAr: Adding devices & clocks
ST SPEAr: Updating defconfigs
Documentation/arm/SPEAr/overview.txt | 34 +- MAINTAINERS | 6 + arch/arm/Kconfig | 6 +- arch/arm/Makefile | 2 + arch/arm/configs/spear13xx_defconfig | 127 ++ arch/arm/configs/spear300_defconfig | 51 - arch/arm/configs/spear310_defconfig | 52 - arch/arm/configs/spear320_defconfig | 52 - arch/arm/configs/spear3xx_defconfig | 119 ++ arch/arm/configs/spear600_defconfig | 49 - arch/arm/configs/spear6xx_defconfig | 109 ++ arch/arm/include/asm/hardware/sp810.h | 3 + arch/arm/mach-spear13xx/Kconfig | 32 + arch/arm/mach-spear13xx/Makefile | 23 + arch/arm/mach-spear13xx/Makefile.boot | 3 + arch/arm/mach-spear13xx/clock.c | 1204 ++++++++++++++++++++ arch/arm/mach-spear13xx/headsmp.S | 96 ++ arch/arm/mach-spear13xx/hotplug.c | 121 ++ arch/arm/mach-spear13xx/include/mach/clkdev.h | 19 + arch/arm/mach-spear13xx/include/mach/debug-macro.S | 14 + arch/arm/mach-spear13xx/include/mach/entry-macro.S | 22 + arch/arm/mach-spear13xx/include/mach/generic.h | 275 +++++ arch/arm/mach-spear13xx/include/mach/gpio.h | 37 + arch/arm/mach-spear13xx/include/mach/hardware.h | 37 + arch/arm/mach-spear13xx/include/mach/io.h | 19 + arch/arm/mach-spear13xx/include/mach/irqs.h | 153 +++ arch/arm/mach-spear13xx/include/mach/memory.h | 19 + arch/arm/mach-spear13xx/include/mach/misc_regs.h | 386 +++++++ arch/arm/mach-spear13xx/include/mach/pcie.h | 170 +++ arch/arm/mach-spear13xx/include/mach/smp.h | 25 + arch/arm/mach-spear13xx/include/mach/spear.h | 95 ++ arch/arm/mach-spear13xx/include/mach/spear1300.h | 21 + arch/arm/mach-spear13xx/include/mach/spear1310.h | 64 + arch/arm/mach-spear13xx/include/mach/suspend.h | 47 + arch/arm/mach-spear13xx/include/mach/system.h | 35 + arch/arm/mach-spear13xx/include/mach/timex.h | 19 + arch/arm/mach-spear13xx/include/mach/uncompress.h | 19 + arch/arm/mach-spear13xx/include/mach/vmalloc.h | 18 + arch/arm/mach-spear13xx/localtimer.c | 25 + arch/arm/mach-spear13xx/pcie.c | 861 ++++++++++++++ arch/arm/mach-spear13xx/platsmp.c | 165 +++ arch/arm/mach-spear13xx/pm.c | 107 ++ arch/arm/mach-spear13xx/sleep.S | 435 +++++++ arch/arm/mach-spear13xx/spear1300.c | 38 + arch/arm/mach-spear13xx/spear1300_evb.c | 146 +++ arch/arm/mach-spear13xx/spear1310.c | 516 +++++++++ arch/arm/mach-spear13xx/spear1310_evb.c | 166 +++ arch/arm/mach-spear13xx/spear13xx.c | 1057 +++++++++++++++++ arch/arm/mach-spear3xx/Kconfig | 30 +- arch/arm/mach-spear3xx/Kconfig300 | 17 - arch/arm/mach-spear3xx/Kconfig310 | 17 - arch/arm/mach-spear3xx/Kconfig320 | 17 - arch/arm/mach-spear3xx/Makefile | 4 + arch/arm/mach-spear3xx/clock.c | 576 ++++++++-- arch/arm/mach-spear3xx/emi.c | 117 ++ arch/arm/mach-spear3xx/include/mach/emi.h | 65 ++ arch/arm/mach-spear3xx/include/mach/generic.h | 280 +++-- arch/arm/mach-spear3xx/include/mach/gpio.h | 143 +++ arch/arm/mach-spear3xx/include/mach/irqs.h | 206 ++-- arch/arm/mach-spear3xx/include/mach/misc_regs.h | 12 +- arch/arm/mach-spear3xx/include/mach/spear.h | 134 +-- arch/arm/mach-spear3xx/include/mach/spear300.h | 86 +- arch/arm/mach-spear3xx/include/mach/spear310.h | 85 +- arch/arm/mach-spear3xx/include/mach/spear320.h | 121 +-- arch/arm/mach-spear3xx/include/mach/suspend.h | 44 + arch/arm/mach-spear3xx/spear300.c | 640 ++++++++--- arch/arm/mach-spear3xx/spear300_evb.c | 109 ++- arch/arm/mach-spear3xx/spear310.c | 423 ++++++-- arch/arm/mach-spear3xx/spear310_evb.c | 135 ++- arch/arm/mach-spear3xx/spear320.c | 844 +++++++++++---- arch/arm/mach-spear3xx/spear320_evb.c | 120 ++- arch/arm/mach-spear3xx/spear3xx.c | 741 ++++++++++--- arch/arm/mach-spear6xx/Kconfig | 15 +- arch/arm/mach-spear6xx/Kconfig600 | 17 - arch/arm/mach-spear6xx/clock.c | 438 ++++++-- arch/arm/mach-spear6xx/include/mach/generic.h | 19 +- arch/arm/mach-spear6xx/include/mach/gpio.h | 27 + arch/arm/mach-spear6xx/include/mach/misc_regs.h | 12 +- arch/arm/mach-spear6xx/include/mach/spear.h | 174 +--- arch/arm/mach-spear6xx/include/mach/suspend.h | 44 + arch/arm/mach-spear6xx/spear600_evb.c | 35 +- arch/arm/mach-spear6xx/spear6xx.c | 344 ++++++- arch/arm/mm/Kconfig | 2 +- arch/arm/plat-spear/Kconfig | 17 + arch/arm/plat-spear/Makefile | 21 +- arch/arm/plat-spear/clcd.c | 114 ++ arch/arm/plat-spear/clock.c | 905 +++++++++++++--- arch/arm/plat-spear/cpufreq.c | 159 +++ arch/arm/plat-spear/i2c_eval_board.c | 29 + arch/arm/plat-spear/include/plat/clock.h | 187 +++- arch/arm/plat-spear/include/plat/fsmc.h | 36 + arch/arm/plat-spear/include/plat/gpio.h | 35 + arch/arm/plat-spear/include/plat/padmux.h | 34 +- arch/arm/plat-spear/include/plat/spi.h | 74 ++ arch/arm/plat-spear/include/plat/uncompress.h | 4 +- arch/arm/plat-spear/include/plat/vmalloc.h | 2 +- arch/arm/plat-spear/padmux.c | 54 +- arch/arm/plat-spear/plgpio.c | 474 ++++++++ arch/arm/plat-spear/pll_clk.S | 187 +++ arch/arm/plat-spear/pm.c | 104 ++ arch/arm/plat-spear/pwm.c | 484 ++++++++ arch/arm/plat-spear/sleep.S | 288 +++++ arch/arm/plat-spear/time.c | 21 +- drivers/rtc/Kconfig | 8 + drivers/rtc/Makefile | 1 + drivers/rtc/rtc-spear.c | 534 +++++++++ drivers/video/Kconfig | 14 +- 107 files changed, 14992 insertions(+), 1986 deletions(-) create mode 100644 arch/arm/configs/spear13xx_defconfig delete mode 100644 arch/arm/configs/spear300_defconfig delete mode 100644 arch/arm/configs/spear310_defconfig delete mode 100644 arch/arm/configs/spear320_defconfig create mode 100644 arch/arm/configs/spear3xx_defconfig delete mode 100644 arch/arm/configs/spear600_defconfig create mode 100644 arch/arm/configs/spear6xx_defconfig create mode 100644 arch/arm/mach-spear13xx/Kconfig create mode 100644 arch/arm/mach-spear13xx/Makefile create mode 100644 arch/arm/mach-spear13xx/Makefile.boot create mode 100644 arch/arm/mach-spear13xx/clock.c create mode 100644 arch/arm/mach-spear13xx/headsmp.S create mode 100644 arch/arm/mach-spear13xx/hotplug.c create mode 100644 arch/arm/mach-spear13xx/include/mach/clkdev.h create mode 100644 arch/arm/mach-spear13xx/include/mach/debug-macro.S create mode 100644 arch/arm/mach-spear13xx/include/mach/entry-macro.S create mode 100644 arch/arm/mach-spear13xx/include/mach/generic.h create mode 100644 arch/arm/mach-spear13xx/include/mach/gpio.h create mode 100644 arch/arm/mach-spear13xx/include/mach/hardware.h create mode 100644 arch/arm/mach-spear13xx/include/mach/io.h create mode 100644 arch/arm/mach-spear13xx/include/mach/irqs.h create mode 100644 arch/arm/mach-spear13xx/include/mach/memory.h create mode 100644 arch/arm/mach-spear13xx/include/mach/misc_regs.h create mode 100644 arch/arm/mach-spear13xx/include/mach/pcie.h create mode 100644 arch/arm/mach-spear13xx/include/mach/smp.h create mode 100644 arch/arm/mach-spear13xx/include/mach/spear.h create mode 100644 arch/arm/mach-spear13xx/include/mach/spear1300.h create mode 100644 arch/arm/mach-spear13xx/include/mach/spear1310.h create mode 100644 arch/arm/mach-spear13xx/include/mach/suspend.h create mode 100644 arch/arm/mach-spear13xx/include/mach/system.h create mode 100644 arch/arm/mach-spear13xx/include/mach/timex.h create mode 100644 arch/arm/mach-spear13xx/include/mach/uncompress.h create mode 100644 arch/arm/mach-spear13xx/include/mach/vmalloc.h create mode 100644 arch/arm/mach-spear13xx/localtimer.c create mode 100644 arch/arm/mach-spear13xx/pcie.c create mode 100644 arch/arm/mach-spear13xx/platsmp.c create mode 100644 arch/arm/mach-spear13xx/pm.c create mode 100644 arch/arm/mach-spear13xx/sleep.S create mode 100644 arch/arm/mach-spear13xx/spear1300.c create mode 100644 arch/arm/mach-spear13xx/spear1300_evb.c create mode 100644 arch/arm/mach-spear13xx/spear1310.c create mode 100644 arch/arm/mach-spear13xx/spear1310_evb.c create mode 100644 arch/arm/mach-spear13xx/spear13xx.c delete mode 100644 arch/arm/mach-spear3xx/Kconfig300 delete mode 100644 arch/arm/mach-spear3xx/Kconfig310 delete mode 100644 arch/arm/mach-spear3xx/Kconfig320 create mode 100644 arch/arm/mach-spear3xx/emi.c create mode 100644 arch/arm/mach-spear3xx/include/mach/emi.h create mode 100644 arch/arm/mach-spear3xx/include/mach/suspend.h delete mode 100644 arch/arm/mach-spear6xx/Kconfig600 create mode 100644 arch/arm/mach-spear6xx/include/mach/suspend.h create mode 100644 arch/arm/plat-spear/clcd.c create mode 100644 arch/arm/plat-spear/cpufreq.c create mode 100644 arch/arm/plat-spear/i2c_eval_board.c create mode 100644 arch/arm/plat-spear/include/plat/fsmc.h create mode 100644 arch/arm/plat-spear/include/plat/spi.h create mode 100644 arch/arm/plat-spear/plgpio.c create mode 100644 arch/arm/plat-spear/pll_clk.S create mode 100644 arch/arm/plat-spear/pm.c create mode 100644 arch/arm/plat-spear/pwm.c create mode 100644 arch/arm/plat-spear/sleep.S create mode 100644 drivers/rtc/rtc-spear.c
Signature · 1 line
1.7.2.2
PATCH v4 1/62 spear/vmalloc.h: Appending UL to VMALLOC_END
This patch fixes following warning:mm/init.c:606: warning: format '%08lx' expects type 'long unsigned int', but argument 12 has type 'unsigned int'
by appending UL to VMALLOC_END's Number.
--- arch/arm/plat-spear/include/plat/vmalloc.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
arch/arm/plat-spear/include/plat/vmalloc.h +1 -1
@@ -14,6 +14,6 @@#ifndef __PLAT_VMALLOC_H#define __PLAT_VMALLOC_H -#define VMALLOC_END 0xF0000000 +#define VMALLOC_END 0xF0000000UL#endif /* __PLAT_VMALLOC_H */
Signature · 1 line
1.7.2.2
PATCH v4 2/62 sp810 Fix: Switch to slow mode before sysctl_soft_reset
In reply to Viresh KumarFrom: Shiraz Hashim <[email protected]>
Before resetting system from system controller, switching to slow mode is required.
--- arch/arm/include/asm/hardware/sp810.h | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-)
arch/arm/include/asm/hardware/sp810.h +3 -0
@@ -52,6 +52,9 @@static inline void sysctl_soft_reset (void __iomem *base) { +/* switch to slow mode */ +writel (0x2 , base +SCCTRL ); +/* writing any value to SCSYSSTAT reg will reset system */ writel (0 , base +SCSYSSTAT ); }
Signature · 1 line
1.7.2.2
PATCH v4 3/62 ST SPEAr: Padmux code Updated
In reply to Viresh Kumar- compiling padmux only for spear3xx
- padmux initialization code rearranged in evaluation board and machine files.
--- arch/arm/mach-spear3xx/include/mach/generic.h | 7 ------- arch/arm/mach-spear3xx/spear300.c | 14 ++++++++++---- arch/arm/mach-spear3xx/spear300_evb.c | 9 ++++----- arch/arm/mach-spear3xx/spear310.c | 11 ++++++----- arch/arm/mach-spear3xx/spear310_evb.c | 9 ++++----- arch/arm/mach-spear3xx/spear320.c | 11 ++++++----- arch/arm/mach-spear3xx/spear320_evb.c | 9 ++++----- arch/arm/mach-spear3xx/spear3xx.c | 21 --------------------- arch/arm/plat-spear/Makefile | 4 ++-- 9 files changed, 36 insertions(+), 59 deletions(-)
arch/arm/mach-spear3xx/include/mach/generic.h +0 -7
@@ -40,7 +40,6 @@ void __init clk_init(void);void __init spear3xx_map_io (void );void __init spear3xx_init_irq (void );void __init spear3xx_init (void ); -void spear_pmx_init (struct pmx_driver *pmx_driver,uint base,uint size);/* pad mux declarations */ #define PMX_FIRDA_MASK (1 << 14)
@@ -133,8 +132,6 @@ extern struct pmx_dev pmx_telecom_sdio_4bit;extern struct pmx_dev pmx_telecom_sdio_8bit;extern struct pmx_dev pmx_gpio1; -void spear300_pmx_init (void ); -/* Add spear300 machine function declarations here */ void __init spear300_init (void );
@@ -154,8 +151,6 @@ extern struct pmx_dev pmx_fsmc;extern struct pmx_dev pmx_rs485_0_1;extern struct pmx_dev pmx_tdm0; -void spear310_pmx_init (void ); -/* Add spear310 machine function declarations here */ void __init spear310_init (void );
@@ -195,8 +190,6 @@ extern struct pmx_dev pmx_smii0;extern struct pmx_dev pmx_smii1;extern struct pmx_dev pmx_i2c1; -void spear320_pmx_init (void ); -/* Add spear320 machine function declarations here */ void __init spear320_init (void );
arch/arm/mach-spear3xx/spear300.c +10 -4
@@ -459,10 +459,16 @@ void __init spear300_init(void)if (ret)printk (KERN_ERR "Error registering Shared IRQ\n" ); } -} -void spear300_pmx_init (void ) -{ -spear_pmx_init (&pmx_driver,SPEAR300_SOC_CONFIG_BASE , +/* pmx initialization */ + pmx_driver.base =ioremap (SPEAR300_SOC_CONFIG_BASE ,SPEAR300_SOC_CONFIG_SIZE ); +if (pmx_driver.base) { + ret =pmx_register (&pmx_driver); +if (ret) +printk (KERN_ERR "padmux: registeration failed. err no" +": %d\n" , ret); +/* Free Mapping, device selection already done */ +iounmap (pmx_driver.base); + } }
arch/arm/mach-spear3xx/spear300_evb.c +4 -5
@@ -51,14 +51,13 @@ static void __init spear300_evb_init(void) {unsigned int i; -/* call spear300 machine init function */ -spear300_init (); - -/* padmux initialization */ +/* padmux initialization, must be done before spear300_init */ pmx_driver.mode = &photo_frame_mode; pmx_driver.devs = pmx_devs; pmx_driver.devs_count =ARRAY_SIZE (pmx_devs); -spear300_pmx_init (); + +/* call spear300 machine init function */ +spear300_init ();/* Add Platform Devices */ platform_add_devices (plat_devs,ARRAY_SIZE (plat_devs));
arch/arm/mach-spear3xx/spear310.c +6 -5
@@ -293,10 +293,11 @@ void __init spear310_init(void)if (ret)printk (KERN_ERR "Error registering Shared IRQ 4\n" ); } -} -void spear310_pmx_init (void ) -{ -spear_pmx_init (&pmx_driver,SPEAR310_SOC_CONFIG_BASE , -SPEAR310_SOC_CONFIG_SIZE ); +/* pmx initialization */ + pmx_driver.base = base; + ret =pmx_register (&pmx_driver); +if (ret) +printk (KERN_ERR "padmux: registeration failed. err no: %d\n" , + ret); }
arch/arm/mach-spear3xx/spear310_evb.c +4 -5
@@ -58,14 +58,13 @@ static void __init spear310_evb_init(void) {unsigned int i; -/* call spear310 machine init function */ -spear310_init (); - -/* padmux initialization */ +/* padmux initialization, must be done before spear310_init */ pmx_driver.mode =NULL ; pmx_driver.devs = pmx_devs; pmx_driver.devs_count =ARRAY_SIZE (pmx_devs); -spear310_pmx_init (); + +/* call spear310 machine init function */ +spear310_init ();/* Add Platform Devices */ platform_add_devices (plat_devs,ARRAY_SIZE (plat_devs));
arch/arm/mach-spear3xx/spear320.c +6 -5
@@ -540,10 +540,11 @@ void __init spear320_init(void)if (ret)printk (KERN_ERR "Error registering Shared IRQ 4\n" ); } -} -void spear320_pmx_init (void ) -{ -spear_pmx_init (&pmx_driver,SPEAR320_SOC_CONFIG_BASE , -SPEAR320_SOC_CONFIG_SIZE ); +/* pmx initialization */ + pmx_driver.base = base; + ret =pmx_register (&pmx_driver); +if (ret) +printk (KERN_ERR "padmux: registeration failed. err no: %d\n" , + ret); }
arch/arm/mach-spear3xx/spear320_evb.c +4 -5
@@ -55,14 +55,13 @@ static void __init spear320_evb_init(void) {unsigned int i; -/* call spear320 machine init function */ -spear320_init (); - -/* padmux initialization */ +/* padmux initialization, must be done before spear320_init */ pmx_driver.mode = &auto_net_mii_mode; pmx_driver.devs = pmx_devs; pmx_driver.devs_count =ARRAY_SIZE (pmx_devs); -spear320_pmx_init (); + +/* call spear320 machine init function */ +spear320_init ();/* Add Platform Devices */ platform_add_devices (plat_devs,ARRAY_SIZE (plat_devs));
arch/arm/mach-spear3xx/spear3xx.c +0 -21
@@ -525,24 +525,3 @@ struct pmx_dev pmx_plgpio_45_46_49_50 = { };#endif - -/* spear padmux initialization function */ -void spear_pmx_init (struct pmx_driver *pmx_driver,uint base,uint size) -{ -int ret =0 ; - -/* pad mux initialization */ - pmx_driver->base =ioremap (base, size); -if (!pmx_driver->base) { - ret = -ENOMEM ; - goto pmx_fail; - } - - ret =pmx_register (pmx_driver); -iounmap (pmx_driver->base); - -pmx_fail: -if (ret) -printk (KERN_ERR "padmux: registration failed. err no: %d\n" , - ret); -}
arch/arm/plat-spear/Makefile +2 -2
@@ -3,6 +3,6 @@ # # Common support -obj-y := clock.o padmux.o time.o +obj-y := clock.o time.o -obj-$(CONFIG_ARCH_SPEAR3XX) += shirq.o +obj-$(CONFIG_ARCH_SPEAR3XX) += shirq.o padmux.o
Signature · 1 line
1.7.2.2
PATCH v4 4/62 ST SPEAr: Making clock functions more generic
In reply to Viresh KumarModifications include:
- Adding dummy clk_set_rate function. Required for compilation of few drivers
- Making function present in plat-spear/clock.c more generic over all platforms
- Added div_factor filed in struct clk for clks with .recalc = follow_parent
--- arch/arm/mach-spear3xx/clock.c | 66 ++++++++++++++++++++++++++---- arch/arm/mach-spear6xx/clock.c | 67 ++++++++++++++++++++++++++---- arch/arm/plat-spear/clock.c | 59 ++++++++++++++++++-------- arch/arm/plat-spear/include/plat/clock.h | 64 ++++++++++++++++++++++++---- 4 files changed, 212 insertions(+), 44 deletions(-)
arch/arm/mach-spear3xx/clock.c +58 -8
@@ -39,10 +39,25 @@ static struct clk rtc_clk = { };/* clock derived from 24 MHz osc clk */ +/* pll masks structure */ +static struct pll_clk_masks pll1_masks = { + .mode_mask =PLL_MODE_MASK , + .mode_shift =PLL_MODE_SHIFT , + .norm_fdbk_m_mask =PLL_NORM_FDBK_M_MASK , + .norm_fdbk_m_shift =PLL_NORM_FDBK_M_SHIFT , + .dith_fdbk_m_mask =PLL_DITH_FDBK_M_MASK , + .dith_fdbk_m_shift =PLL_DITH_FDBK_M_SHIFT , + .div_p_mask =PLL_DIV_P_MASK , + .div_p_shift =PLL_DIV_P_SHIFT , + .div_n_mask =PLL_DIV_N_MASK , + .div_n_shift =PLL_DIV_N_SHIFT , +}; +/* pll1 configuration structure */ static struct pll_clk_config pll1_config = { .mode_reg =PLL1_CTR , .cfg_reg =PLL1_FRQ , + .masks = &pll1_masks, };/* PLL1 clock */
@@ -50,7 +65,7 @@ static struct clk pll1_clk = { .pclk = &osc_24m_clk, .en_reg = PLL1_CTR, .en_reg_bit = PLL_ENABLE, - .recalc = &pll1_clk_recalc, + .recalc = &pll_clk_recalc, .private_data = &pll1_config, };
@@ -76,11 +91,16 @@ static struct clk cpu_clk = { .recalc = &follow_parent, }; +/* ahb masks structure */ +static struct bus_clk_masks ahb_masks = { + .mask =PLL_HCLK_RATIO_MASK , + .shift =PLL_HCLK_RATIO_SHIFT , +}; +/* ahb configuration structure */ static struct bus_clk_config ahb_config = { .reg =CORE_CLK_CFG , - .mask =PLL_HCLK_RATIO_MASK , - .shift =PLL_HCLK_RATIO_SHIFT , + .masks = &ahb_masks, };/* ahb clock */
@@ -91,9 +111,22 @@ static struct clk ahb_clk = { .private_data = &ahb_config, }; +/* auxiliary synthesizers masks */ +static struct aux_clk_masks aux_masks = { + .eq_sel_mask =AUX_EQ_SEL_MASK , + .eq_sel_shift =AUX_EQ_SEL_SHIFT , + .eq1_mask =AUX_EQ1_SEL , + .eq2_mask =AUX_EQ2_SEL , + .xscale_sel_mask =AUX_XSCALE_MASK , + .xscale_sel_shift =AUX_XSCALE_SHIFT , + .yscale_sel_mask =AUX_YSCALE_MASK , + .yscale_sel_shift =AUX_YSCALE_SHIFT , +}; +/* uart configurations */ static struct aux_clk_config uart_config = { .synth_reg =UART_CLK_SYNT , + .masks = &aux_masks, };/* uart parents */
@@ -130,6 +163,7 @@ static struct clk uart_clk = {/* firda configurations */ static struct aux_clk_config firda_config = { .synth_reg =FIRDA_CLK_SYNT , + .masks = &aux_masks, };/* firda parents */
@@ -184,9 +218,18 @@ static struct pclk_sel gpt_pclk_sel = { .pclk_sel_mask = GPT_CLK_MASK, }; +/* gpt synthesizer masks */ +static struct gpt_clk_masks gpt_masks = { + .mscale_sel_mask =GPT_MSCALE_MASK , + .mscale_sel_shift =GPT_MSCALE_SHIFT , + .nscale_sel_mask =GPT_NSCALE_MASK , + .nscale_sel_shift =GPT_NSCALE_SHIFT , +}; +/* gpt0 configurations */ -static struct aux_clk_config gpt0_config = { +static struct gpt_clk_config gpt0_config = { .synth_reg =PRSC1_CLK_CFG , + .masks = &gpt_masks, };/* gpt0 timer clock */
@@ -199,8 +242,9 @@ static struct clk gpt0_clk = { };/* gpt1 configurations */ -static struct aux_clk_config gpt1_config = { +static struct gpt_clk_config gpt1_config = { .synth_reg =PRSC2_CLK_CFG , + .masks = &gpt_masks, };/* gpt1 timer clock */
@@ -214,8 +258,9 @@ static struct clk gpt1_clk = { };/* gpt2 configurations */ -static struct aux_clk_config gpt2_config = { +static struct gpt_clk_config gpt2_config = { .synth_reg =PRSC3_CLK_CFG , + .masks = &gpt_masks, };/* gpt2 timer clock */
@@ -253,11 +298,16 @@ static struct clk clcd_clk = { };/* clock derived from ahb clk */ +/* apb masks structure */ +static struct bus_clk_masks apb_masks = { + .mask =HCLK_PCLK_RATIO_MASK , + .shift =HCLK_PCLK_RATIO_SHIFT , +}; +/* apb configuration structure */ static struct bus_clk_config apb_config = { .reg =CORE_CLK_CFG , - .mask =HCLK_PCLK_RATIO_MASK , - .shift =HCLK_PCLK_RATIO_SHIFT , + .masks = &apb_masks, };/* apb clock */
arch/arm/mach-spear6xx/clock.c +59 -8
144 lines not on this page · raw message
arch/arm/plat-spear/clock.c +41 -18
141 lines not on this page · raw message
arch/arm/plat-spear/include/plat/clock.h +54 -10
96 lines not on this page · raw message
Signature · 1 line
1.7.2.2
PATCH v4 4/62 ST SPEAr: Making clock functions more generic
Quoted 8 lines · Viresh Kumar
/* pll1 configuration structure */
static structpll_clk_configpll1_config= {arch/arm/mach-spear3xx/clock.c +1
-0.mode_reg = PLL1_CTR, .cfg_reg = PLL1_FRQ, + .masks = &pll1_masks, };/* PLL1 clock */
...
Quoted 5 lines
arch/arm/plat-spear/clock.c +2
-2- mode = (readl (config->mode_reg) >>PLL_MODE_SHIFT ) & -PLL_MODE_MASK ; + mode = (readl (config->mode_reg) >> config->masks->mode_shift) & + config->masks->mode_mask;
...
arch/arm/plat-spear/include/plat/clock.h struct clk { · line 116
Quoted 7 lines
struct
pll_clk_config{arch/arm/plat-spear/include/plat/clock.h +3
-2-unsigned int *mode_reg; -unsigned int *cfg_reg; +u32 *mode_reg; +u32 *cfg_reg; +struct pll_clk_masks *masks; };
Registers should have an __iomem attribute on them. Preferably, but not absolutely necessary, should be void to prevent any direct dereferencing.
PATCH v4 4/62 ST SPEAr: Making clock functions more generic
Quoted 16 lines · Russell King - ARM Linux
Quoted 8 lines · Viresh Kumar
/* pll1 configuration structure */
static structpll_clk_configpll1_config= {arch/arm/mach-spear3xx/clock.c +1
-0.mode_reg = PLL1_CTR, .cfg_reg = PLL1_FRQ, + .masks = &pll1_masks, };/* PLL1 clock */ ...
Quoted 5 lines
arch/arm/plat-spear/clock.c +2
-2- mode = (readl (config->mode_reg) >>PLL_MODE_SHIFT ) & -PLL_MODE_MASK ; + mode = (readl (config->mode_reg) >> config->masks->mode_shift) & + config->masks->mode_mask;...
Quoted 13 lines
arch/arm/plat-spear/include/plat/clock.h struct clk { · line 116
Quoted 7 lines
struct
pll_clk_config{arch/arm/plat-spear/include/plat/clock.h +3
-2-unsigned int *mode_reg; -unsigned int *cfg_reg; +u32 *mode_reg; +u32 *cfg_reg; +struct pll_clk_masks *masks; };Registers should have an
__iomemattribute on them. Preferably, but not absolutely necessary, should be void to prevent any direct dereferencing.
.
Yes, it should be void __iomem *
Signature · 1 line
viresh
PATCH v4 5/62 ST SPEAr: Formalized timer support
In reply to Viresh KumarFrom: Shiraz Hashim <[email protected]>
Arch specific timer initialization code is moved into Arch specific file.
--- arch/arm/mach-spear3xx/include/mach/generic.h | 3 +- arch/arm/mach-spear3xx/spear300_evb.c | 2 +- arch/arm/mach-spear3xx/spear310_evb.c | 2 +- arch/arm/mach-spear3xx/spear320_evb.c | 2 +- arch/arm/mach-spear3xx/spear3xx.c | 32 ++++++++++++++++++++++++- arch/arm/mach-spear6xx/include/mach/generic.h | 3 +- arch/arm/mach-spear6xx/spear600_evb.c | 3 +- arch/arm/mach-spear6xx/spear6xx.c | 31 ++++++++++++++++++++++++ arch/arm/plat-spear/time.c | 21 ++++++---------- 9 files changed, 79 insertions(+), 20 deletions(-)
arch/arm/mach-spear3xx/include/mach/generic.h +2 -1
@@ -33,10 +33,11 @@/* Add spear3xx family device structure declarations here */ extern struct amba_device gpio_device;extern struct amba_device uart_device; -extern struct sys_timer spear_sys_timer; +extern struct sys_timer spear3xx_timer;/* Add spear3xx family function declarations here */ void __init clk_init (void ); +void __init spear_setup_timer (void );void __init spear3xx_map_io (void );void __init spear3xx_init_irq (void );void __init spear3xx_init (void );
arch/arm/mach-spear3xx/spear300_evb.c +1 -1
@@ -71,6 +71,6 @@ MACHINE_START(SPEAR300, "ST-SPEAR300-EVB") .boot_params = 0x00000100, .map_io = spear3xx_map_io, .init_irq = spear3xx_init_irq, - .timer = &spear_sys_timer, + .timer = &spear3xx_timer, .init_machine = spear300_evb_init,MACHINE_END
arch/arm/mach-spear3xx/spear310_evb.c +1 -1
@@ -78,6 +78,6 @@ MACHINE_START(SPEAR310, "ST-SPEAR310-EVB") .boot_params = 0x00000100, .map_io = spear3xx_map_io, .init_irq = spear3xx_init_irq, - .timer = &spear_sys_timer, + .timer = &spear3xx_timer, .init_machine = spear310_evb_init,MACHINE_END
arch/arm/mach-spear3xx/spear320_evb.c +1 -1
@@ -75,6 +75,6 @@ MACHINE_START(SPEAR320, "ST-SPEAR320-EVB") .boot_params = 0x00000100, .map_io = spear3xx_map_io, .init_irq = spear3xx_init_irq, - .timer = &spear_sys_timer, + .timer = &spear3xx_timer, .init_machine = spear320_evb_init,MACHINE_END
arch/arm/mach-spear3xx/spear3xx.c +31 -1
@@ -523,5 +523,35 @@ struct pmx_dev pmx_plgpio_45_46_49_50 = { .mode_count = ARRAY_SIZE(pmx_plgpio_45_46_49_50_modes), .enb_on_reset = 1, }; +#endif /* CONFIG_MACH_SPEAR310 || CONFIG_MACH_SPEAR320 */ -#endif +static void __init spear3xx_timer_init (void ) +{ +char pclk_name[] ="pll3_48m_clk" ; +struct clk *gpt_clk, *pclk; + +/* get the system timer clock */ + gpt_clk =clk_get_sys ("gpt0" ,NULL ); +if (!gpt_clk) { +pr_err ("%s:couldn't get clk for gpt\n" , __func__); +BUG (); + } + +/* get the suitable parent clock for timer*/ + pclk =clk_get (NULL , pclk_name); +if (!pclk) { +pr_err ("%s:couldn't get %s as parent for gpt\n" , + __func__, pclk_name); +BUG (); + } + +clk_set_parent (gpt_clk, pclk); +clk_put (gpt_clk); +clk_put (pclk); + +spear_setup_timer (); +} + +struct sys_timer spear3xx_timer = { + .init = spear3xx_timer_init, +};
arch/arm/mach-spear6xx/include/mach/generic.h +2 -1
@@ -31,9 +31,10 @@/* Add spear6xx family device structure declarations here */ extern struct amba_device gpio_device[];extern struct amba_device uart_device[]; -extern struct sys_timer spear_sys_timer; +extern struct sys_timer spear6xx_timer;/* Add spear6xx family function declarations here */ +void __init spear_setup_timer (void );void __init spear6xx_map_io (void );void __init spear6xx_init_irq (void );void __init spear6xx_init (void );
arch/arm/mach-spear6xx/spear600_evb.c +2 -1
@@ -42,10 +42,11 @@ static void __init spear600_evb_init(void)amba_device_register (amba_devs[i], &iomem_resource); } +MACHINE_START (SPEAR600 ,"ST-SPEAR600-EVB" ) .boot_params = 0x00000100, .map_io = spear6xx_map_io, .init_irq = spear6xx_init_irq, - .timer = &spear_sys_timer, + .timer = &spear6xx_timer, .init_machine = spear600_evb_init,MACHINE_END
arch/arm/mach-spear6xx/spear6xx.c +31 -0
@@ -155,3 +155,34 @@ void __init spear6xx_map_io(void)/* This will initialize clock framework */ clk_init (); } + +static void __init spear6xx_timer_init (void ) +{ +char pclk_name[] ="pll3_48m_clk" ; +struct clk *gpt_clk, *pclk; + +/* get the system timer clock */ + gpt_clk =clk_get_sys ("gpt0" ,NULL ); +if (!gpt_clk) { +pr_err ("%s:couldn't get clk for gpt\n" , __func__); +BUG (); + } + +/* get the suitable parent clock for timer*/ + pclk =clk_get (NULL , pclk_name); +if (!pclk) { +pr_err ("%s:couldn't get %s as parent for gpt\n" , + __func__, pclk_name); +BUG (); + } + +clk_set_parent (gpt_clk, pclk); +clk_put (gpt_clk); +clk_put (pclk); + +spear_setup_timer (); +} + +struct sys_timer spear6xx_timer = { + .init = spear6xx_timer_init, +};
arch/arm/plat-spear/time.c +8 -13
@@ -1,7 +1,7 @@/* * arch/arm/plat-spear/time.c * -* Copyright (C) 2009 ST Microelectronics +* Copyright (C) 2010 ST Microelectronics * Shiraz Hashim<[email protected]> * * This file is licensed under the terms of the GNU General Public
@@ -211,7 +211,7 @@ static void __init spear_clockevent_init(void)void __init spear_setup_timer (void ) { -struct clk *pll3_clk; +int ret;if (!request_mem_region (SPEAR_GPT0_BASE ,SZ_1K ,"gpt0" )) {pr_err ("%s:cannot get IO addr\n" , __func__);
@@ -230,26 +230,21 @@ void __init spear_setup_timer(void) goto err_iomap; } - pll3_clk =clk_get (NULL ,"pll3_48m_clk" ); -if (!pll3_clk) { -pr_err ("%s:couldn't get PLL3 as parent for gpt\n" , __func__); - goto err_iomap; + ret =clk_enable (gpt_clk); +if (ret <0 ) { +pr_err ("%s:couldn't enable gpt clock\n" , __func__); + goto err_clk; } -clk_set_parent (gpt_clk, pll3_clk); -spear_clockevent_init ();spear_clocksource_init ();return ; +err_clk: +clk_put (gpt_clk); err_iomap:iounmap (gpt_base); - err_mem:release_mem_region (SPEAR_GPT0_BASE ,SZ_1K ); } - -struct sys_timer spear_sys_timer = { - .init = spear_setup_timer, -};
Signature · 1 line
1.7.2.2
PATCH v4 5/62 ST SPEAr: Formalized timer support
Hi,
Quoted 18 lines · Viresh Kumar
arch/arm/mach-spear3xx/spear3xx.c +10
-1@@ -523,5 +523,35 @@ struct pmx_dev pmx_plgpio_45_46_49_50 = { .mode_count = ARRAY_SIZE(pmx_plgpio_45_46_49_50_modes), .enb_on_reset = 1, }; +#endif /* CONFIG_MACH_SPEAR310 || CONFIG_MACH_SPEAR320 */ -#endif +static void __init spear3xx_timer_init (void ) +{ +char pclk_name[] ="pll3_48m_clk" ; +struct clk *gpt_clk, *pclk; + +/* get the system timer clock */ + gpt_clk =clk_get_sys ("gpt0" ,NULL ); +if (!gpt_clk) { +pr_err ("%s:couldn't get clk for gpt\n" , __func__);
arch/arm/mach-spear3xx/spear3xx.c struct pmx_dev pmx_plgpio_45_46_49_50 = { · line 546
Quoted 10 lines
arch/arm/mach-spear3xx/spear3xx.c +10
-0+BUG (); + } + +/* get the suitable parent clock for timer*/ + pclk =clk_get (NULL , pclk_name); +if (!pclk) { +pr_err ("%s:couldn't get %s as parent for gpt\n" , + __func__, pclk_name); +BUG (); + }
These should probably be using IS_ERR() rather than checking against NULL to be consistent with the API.
[...]
arch/arm/mach-spear6xx/spear600_evb.c static void __init spear600_evb_init(void) · line 45
Quoted 9 lines
arch/arm/mach-spear6xx/spear600_evb.c +1
-0@@ -42,10 +42,11 @@ static void __init spear600_evb_init(void)amba_device_register (amba_devs[i], &iomem_resource); } +
Nitpick, why the extra newline?
Quoted 26 lines
arch/arm/mach-spear6xx/spear600_evb.c +1
-1MACHINE_START (SPEAR600 ,"ST-SPEAR600-EVB" ) .boot_params = 0x00000100, .map_io = spear6xx_map_io, .init_irq = spear6xx_init_irq, - .timer = &spear_sys_timer, + .timer = &spear6xx_timer, .init_machine = spear600_evb_init,MACHINE_END arch/arm/mach-spear6xx/spear6xx.c +10
-0@@ -155,3 +155,34 @@ void __init spear6xx_map_io(void)/* This will initialize clock framework */ clk_init (); } + +static void __init spear6xx_timer_init (void ) +{ +char pclk_name[] ="pll3_48m_clk" ; +struct clk *gpt_clk, *pclk; + +/* get the system timer clock */ + gpt_clk =clk_get_sys ("gpt0" ,NULL ); +if (!gpt_clk) { +pr_err ("%s:couldn't get clk for gpt\n" , __func__);
arch/arm/mach-spear6xx/spear6xx.c void __init spear6xx_map_io(void) · line 177
Quoted 10 lines
arch/arm/mach-spear6xx/spear6xx.c +10
-0+BUG (); + } + +/* get the suitable parent clock for timer*/ + pclk =clk_get (NULL , pclk_name); +if (!pclk) { +pr_err ("%s:couldn't get %s as parent for gpt\n" , + __func__, pclk_name); +BUG (); + }
As above, IS_ERR() would be better here.
Jamie
PATCH v4 5/62 ST SPEAr: Formalized timer support
Jamie,
Thanks for reviewing our patches.
Quoted 26 lines · Jamie Iles
Hi,
Quoted 23 lines · Viresh Kumar
arch/arm/mach-spear3xx/spear3xx.c +15
-1@@ -523,5 +523,35 @@ struct pmx_dev pmx_plgpio_45_46_49_50 = { .mode_count = ARRAY_SIZE(pmx_plgpio_45_46_49_50_modes), .enb_on_reset = 1, }; +#endif /* CONFIG_MACH_SPEAR310 || CONFIG_MACH_SPEAR320 */ -#endif +static void __init spear3xx_timer_init (void ) +{ +char pclk_name[] ="pll3_48m_clk" ; +struct clk *gpt_clk, *pclk; + +/* get the system timer clock */ + gpt_clk =clk_get_sys ("gpt0" ,NULL ); +if (!gpt_clk) { +pr_err ("%s:couldn't get clk for gpt\n" , __func__); +BUG (); + } + +/* get the suitable parent clock for timer*/ + pclk =clk_get (NULL , pclk_name);
Quoted 9 lines
arch/arm/mach-spear3xx/spear3xx.c struct pmx_dev pmx_plgpio_45_46_49_50 = { · line 546
Quoted 5 lines
arch/arm/mach-spear3xx/spear3xx.c +5
-0+if (!pclk) { +pr_err ("%s:couldn't get %s as parent for gpt\n" , + __func__, pclk_name); +BUG (); + }These should probably be using
IS_ERR()rather than checking against NULL to be consistent with the API.
Ok.
Quoted 9 lines
[...]
Quoted 8 lines
arch/arm/mach-spear6xx/spear600_evb.c +0
-0@@ -42,10 +42,11 @@ static void __init spear600_evb_init(void)amba_device_register (amba_devs[i], &iomem_resource); }
Quoted 4 lines
arch/arm/mach-spear6xx/spear600_evb.c static void __init spear600_evb_init(void) · line 45
Quoted 1 line
arch/arm/mach-spear6xx/spear600_evb.c +1
-0+Nitpick, why the extra newline?
Will be removed.
Quoted 30 lines
Quoted 30 lines
arch/arm/mach-spear6xx/spear600_evb.c +1
-1MACHINE_START (SPEAR600 ,"ST-SPEAR600-EVB" ) .boot_params = 0x00000100, .map_io = spear6xx_map_io, .init_irq = spear6xx_init_irq, - .timer = &spear_sys_timer, + .timer = &spear6xx_timer, .init_machine = spear600_evb_init,MACHINE_END arch/arm/mach-spear6xx/spear6xx.c +14
-0@@ -155,3 +155,34 @@ void __init spear6xx_map_io(void)/* This will initialize clock framework */ clk_init (); } + +static void __init spear6xx_timer_init (void ) +{ +char pclk_name[] ="pll3_48m_clk" ; +struct clk *gpt_clk, *pclk; + +/* get the system timer clock */ + gpt_clk =clk_get_sys ("gpt0" ,NULL ); +if (!gpt_clk) { +pr_err ("%s:couldn't get clk for gpt\n" , __func__); +BUG (); + } + +/* get the suitable parent clock for timer*/
Quoted 9 lines
arch/arm/mach-spear6xx/spear6xx.c void __init spear6xx_map_io(void) · line 177
Quoted 6 lines
arch/arm/mach-spear6xx/spear6xx.c +6
-0+ pclk =clk_get (NULL , pclk_name); +if (!pclk) { +pr_err ("%s:couldn't get %s as parent for gpt\n" , + __func__, pclk_name); +BUG (); + }As above,
IS_ERR()would be better here.
Ok.
Signature · 1 line
viresh
PATCH v4 6/62 ST SPEAr13XX: Adding machine specific header files
In reply to Viresh KumarFrom: Shiraz Hashim <[email protected]>
--- arch/arm/mach-spear13xx/include/mach/clkdev.h | 19 ++ arch/arm/mach-spear13xx/include/mach/debug-macro.S | 14 + arch/arm/mach-spear13xx/include/mach/entry-macro.S | 22 ++ arch/arm/mach-spear13xx/include/mach/generic.h | 46 +++ arch/arm/mach-spear13xx/include/mach/gpio.h | 19 ++ arch/arm/mach-spear13xx/include/mach/hardware.h | 25 ++ arch/arm/mach-spear13xx/include/mach/io.h | 19 ++ arch/arm/mach-spear13xx/include/mach/irqs.h | 91 ++++++ arch/arm/mach-spear13xx/include/mach/memory.h | 19 ++ arch/arm/mach-spear13xx/include/mach/misc_regs.h | 306 ++++++++++++++++++++ arch/arm/mach-spear13xx/include/mach/smp.h | 25 ++ arch/arm/mach-spear13xx/include/mach/spear.h | 93 ++++++ arch/arm/mach-spear13xx/include/mach/spear1300.h | 21 ++ arch/arm/mach-spear13xx/include/mach/system.h | 35 +++ arch/arm/mach-spear13xx/include/mach/timex.h | 19 ++ arch/arm/mach-spear13xx/include/mach/uncompress.h | 19 ++ arch/arm/mach-spear13xx/include/mach/vmalloc.h | 18 ++ 17 files changed, 810 insertions(+), 0 deletions(-) create mode 100644 arch/arm/mach-spear13xx/include/mach/clkdev.h create mode 100644 arch/arm/mach-spear13xx/include/mach/debug-macro.S create mode 100644 arch/arm/mach-spear13xx/include/mach/entry-macro.S create mode 100644 arch/arm/mach-spear13xx/include/mach/generic.h create mode 100644 arch/arm/mach-spear13xx/include/mach/gpio.h create mode 100644 arch/arm/mach-spear13xx/include/mach/hardware.h create mode 100644 arch/arm/mach-spear13xx/include/mach/io.h create mode 100644 arch/arm/mach-spear13xx/include/mach/irqs.h create mode 100644 arch/arm/mach-spear13xx/include/mach/memory.h create mode 100644 arch/arm/mach-spear13xx/include/mach/misc_regs.h create mode 100644 arch/arm/mach-spear13xx/include/mach/smp.h create mode 100644 arch/arm/mach-spear13xx/include/mach/spear.h create mode 100644 arch/arm/mach-spear13xx/include/mach/spear1300.h create mode 100644 arch/arm/mach-spear13xx/include/mach/system.h create mode 100644 arch/arm/mach-spear13xx/include/mach/timex.h create mode 100644 arch/arm/mach-spear13xx/include/mach/uncompress.h create mode 100644 arch/arm/mach-spear13xx/include/mach/vmalloc.h
arch/arm/mach-spear13xx/include/mach/clkdev.h new file +19 -0
@@ -0,0 +1,19 @@ +/* +* arch/arm/mach-spear13xx/include/mach/clkdev.h +* +* Clock Dev framework definitions for spear13xx machine family +* +* Copyright (C) 2010 ST Microelectronics +* Shiraz Hashim <[email protected]> +* +* This file is licensed under the terms of the GNU General Public +* License version 2. This program is licensed "as is" without any +* warranty of any kind, whether express or implied. +*/ + +#ifndef __MACH_CLKDEV_H +#define __MACH_CLKDEV_H + +#include <plat/clkdev.h> + +#endif /* __MACH_CLKDEV_H */
arch/arm/mach-spear13xx/include/mach/debug-macro.S new file +14 -0
@@ -0,0 +1,14 @@ +/* + * arch/arm/mach-spear13xx/include/mach/debug-macro.S + * + * Debugging macro include header spear13xx machine family + * + * Copyright (C) 2009 ST Microelectronics + * Shiraz Hashim <[email protected]> + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#include <plat/debug-macro.S>
arch/arm/mach-spear13xx/include/mach/entry-macro.S new file +22 -0
@@ -0,0 +1,22 @@ +/* + * arch/arm/mach-spear13xx/include/mach/entry-macro.S + * + * Copyright (C) 2009 ST Microelectronics + * Shiraz Hashim <[email protected]> + * + * Copy of RealView platform implementation + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#include <mach/hardware.h> +#include <asm/hardware/entry-macro-gic.S> + + .macro disable_fiq + .endm + + .macro arch_ret_to_user, tmp1, tmp2 + .endm +
arch/arm/mach-spear13xx/include/mach/generic.h new file +46 -0
46 lines not on this page · raw message
arch/arm/mach-spear13xx/include/mach/gpio.h new file +19 -0
@@ -0,0 +1,19 @@ +/* +* arch/arm/mach-spear13xx/include/mach/gpio.h +* +* GPIO macros for spear13xx machine family +* +* Copyright (C) 2010 ST Microelectronics +* Shiraz Hashim <[email protected]> +* +* This file is licensed under the terms of the GNU General Public +* License version 2. This program is licensed "as is" without any +* warranty of any kind, whether express or implied. +*/ + +#ifndef __MACH_GPIO_H +#define __MACH_GPIO_H + +#include <plat/gpio.h> + +#endif /* __MACH_GPIO_H */
arch/arm/mach-spear13xx/include/mach/hardware.h new file +25 -0
@@ -0,0 +1,25 @@ +/* +* arch/arm/mach-spear13xx/include/mach/hardware.h +* +* Hardware definitions for spear13xx machine family +* +* Copyright (C) 2010 ST Microelectronics +* Shiraz Hashim <[email protected]> +* +* This file is licensed under the terms of the GNU General Public +* License version 2. This program is licensed "as is" without any +* warranty of any kind, whether express or implied. +*/ + +#ifndef __MACH_HARDWARE_H +#define __MACH_HARDWARE_H + +#include <mach/spear.h> + +/* Vitual to physical translation of statically mapped space */ +#define IO_ADDRESS (x) (x | 0xF0000000) + +/* typesafe io address */ +#define __io_address (n) __io(IO_ADDRESS(n)) + +#endif /* __MACH_HARDWARE_H */
arch/arm/mach-spear13xx/include/mach/io.h new file +19 -0
@@ -0,0 +1,19 @@ +/* +* arch/arm/mach-spear13xx/include/mach/io.h +* +* IO definitions for spear13xx machine family +* +* Copyright (C) 2010 ST Microelectronics +* Shiraz Hashim <[email protected]> +* +* This file is licensed under the terms of the GNU General Public +* License version 2. This program is licensed "as is" without any +* warranty of any kind, whether express or implied. +*/ + +#ifndef __MACH_IO_H +#define __MACH_IO_H + +#include <plat/io.h> + +#endif /* __MACH_IO_H */
arch/arm/mach-spear13xx/include/mach/irqs.h new file +91 -0
91 lines not on this page · raw message
arch/arm/mach-spear13xx/include/mach/memory.h new file +19 -0
@@ -0,0 +1,19 @@ +/* +* arch/arm/mach-spear13xx/include/mach/memory.h +* +* Memory map for spear13xx machine family +* +* Copyright (C) 2010 ST Microelectronics +* Shiraz Hashim <[email protected]> +* +* This file is licensed under the terms of the GNU General Public +* License version 2. This program is licensed "as is" without any +* warranty of any kind, whether express or implied. +*/ + +#ifndef __MACH_MEMORY_H +#define __MACH_MEMORY_H + +#include <plat/memory.h> + +#endif /* __MACH_MEMORY_H */
arch/arm/mach-spear13xx/include/mach/misc_regs.h new file +306 -0
306 lines not on this page · raw message
arch/arm/mach-spear13xx/include/mach/smp.h new file +25 -0
@@ -0,0 +1,25 @@ +/* +* arch/arm/mach-spear13xx/include/mach/smp.h +* +* Few SMP related definitions for spear13xx machine family +* +* Copyright (C) 2010 ST Microelectronics +* Shiraz Hashim <[email protected]> +* +* This file is licensed under the terms of the GNU General Public +* License version 2. This program is licensed "as is" without any +* warranty of any kind, whether express or implied. +*/ + +#ifndef __MACH_SMP_H +#define __MACH_SMP_H + +#include <asm/hardware/gic.h> + +/* We use IRQ1 as the IPI */ +static inline void smp_cross_call (const struct cpumask *mask,int ipi) +{ +gic_raise_softirq (mask, ipi); +} + +#endif
arch/arm/mach-spear13xx/include/mach/spear.h new file +93 -0
93 lines not on this page · raw message
arch/arm/mach-spear13xx/include/mach/spear1300.h new file +21 -0
@@ -0,0 +1,21 @@ +/* +* arch/arm/mach-spear13xx/include/mach/spear1300.h +* +* SPEAr1300 Machine specific definition +* +* Copyright (C) 2010 ST Microelectronics +* Shiraz Hashim <[email protected]> +* +* This file is licensed under the terms of the GNU General Public +* License version 2. This program is licensed "as is" without any +* warranty of any kind, whether express or implied. +*/ + +#ifdef CONFIG_MACH_SPEAR1300 + +#ifndef __MACH_SPEAR1300_H +#define __MACH_SPEAR1300_H + +#endif /* __MACH_SPEAR1300_H */ + +#endif /* CONFIG_MACH_SPEAR1300 */
arch/arm/mach-spear13xx/include/mach/system.h new file +35 -0
@@ -0,0 +1,35 @@ +/* +* arch/arm/mach-spear13xx/include/mach/system.h +* +* spear13xx Machine family specific architecture functions +* +* Copyright (C) 2010 ST Microelectronics +* Shiraz Hashim <[email protected]> +* +* This file is licensed under the terms of the GNU General Public +* License version 2. This program is licensed "as is" without any +* warranty of any kind, whether express or implied. +*/ + +#ifndef __MACH_SYSTEM_H +#define __MACH_SYSTEM_H + +#include <linux/io.h> +#include <mach/hardware.h> +#include <mach/misc_regs.h> + +static inline void arch_idle (void ) +{ +/* +* This should do all the clock switching +* and wait for interrupt tricks +*/ +cpu_do_idle (); +} + +static inline void arch_reset (char mode,const char *cmd) +{ +writel (0x01 ,SYS_SW_RES ); +} + +#endif /* __MACH_SYSTEM_H */
arch/arm/mach-spear13xx/include/mach/timex.h new file +19 -0
@@ -0,0 +1,19 @@ +/* +* arch/arm/mach-spear13xx/include/mach/timex.h +* +* spear13xx machine family specific timex definitions +* +* Copyright (C) 2010 ST Microelectronics +* Shiraz Hashim <[email protected]> +* +* This file is licensed under the terms of the GNU General Public +* License version 2. This program is licensed "as is" without any +* warranty of any kind, whether express or implied. +*/ + +#ifndef __MACH_TIMEX_H +#define __MACH_TIMEX_H + +#define CLOCK_TICK_RATE 24000000 + +#endif /* __MACH_TIMEX_H */
arch/arm/mach-spear13xx/include/mach/uncompress.h new file +19 -0
@@ -0,0 +1,19 @@ +/* +* arch/arm/mach-spear13xx/include/mach/uncompress.h +* +* Serial port stubs for kernel decompress status messages +* +* Copyright (C) 2010 ST Microelectronics +* Shiraz Hashim <[email protected]> +* +* This file is licensed under the terms of the GNU General Public +* License version 2. This program is licensed "as is" without any +* warranty of any kind, whether express or implied. +*/ + +#ifndef __MACH_UNCOMPRESS_H +#define __MACH_UNCOMPRESS_H + +#include <plat/uncompress.h> + +#endif /* __MACH_UNCOMPRESS_H */
arch/arm/mach-spear13xx/include/mach/vmalloc.h new file +18 -0
@@ -0,0 +1,18 @@ +/* +* arch/arm/mach-spear13xx/include/mach/vmalloc.h +* +* Defining Vmalloc area for spear13xx machine family +* +* Copyright (C) 2010 ST Microelectronics +* +* This file is licensed under the terms of the GNU General Public +* License version 2. This program is licensed "as is" without any +* warranty of any kind, whether express or implied. +*/ + +#ifndef __MACH_VMALLOC_H +#define __MACH_VMALLOC_H + +#include <plat/vmalloc.h> + +#endif /* __MACH_VMALLOC_H */
Signature · 1 line
1.7.2.2
PATCH v4 6/62 ST SPEAr13XX: Adding machine specific header files
arch/arm/mach-spear13xx/include/mach/misc_regs.h line 23
Quoted 5 lines · Viresh Kumar
arch/arm/mach-spear13xx/include/mach/misc_regs.h new file +5
-0+#define MISC_BASE VA_SPEAR13XX_MISC_BASE + +/* General Configuration */ +#define SOC_CFG ((unsigned int *)(MISC_BASE + 0x000)) +#define BOOTSTRAP_CFG ((unsigned int *)(MISC_BASE + 0x004))
You could really do with an IOMEM() macro, thus:
#ifndef __ASSEMBLY__
#define IOMEM(x) ((void __iomem __force *)(x))
#else
#define IOMEM(x) (x)
#endif
You can then use that for stuff like VA_SPEAR13XX_MISC_BASE, and all these definitions then become:
#define SOC_CFG (MISC_BASE + 0x000)
because GCC allows void pointer arithmetic (treats it as char).
PATCH v4 6/62 ST SPEAr13XX: Adding machine specific header files
Quoted 15 lines · Russell King - ARM Linux
arch/arm/mach-spear13xx/include/mach/misc_regs.h line 23
Quoted 5 lines · Viresh Kumar
arch/arm/mach-spear13xx/include/mach/misc_regs.h new file +5
-0+#define MISC_BASE VA_SPEAR13XX_MISC_BASE + +/* General Configuration */ +#define SOC_CFG ((unsigned int *)(MISC_BASE + 0x000)) +#define BOOTSTRAP_CFG ((unsigned int *)(MISC_BASE + 0x004))You could really do with an
IOMEM()macro, thus:#ifndef
__ASSEMBLY__
#define IOMEM(x) ((void__iomem__force*)(x))
#else
#define IOMEM(x) (x)
#endif
Quoted 7 lines
You can then use that for stuff like
VA_SPEAR13XX_MISC_BASE, and all these definitions then become:#define
SOC_CFG(MISC_BASE+0x000)because GCC allows void pointer arithmetic (treats it as char).
Yes. I agree with this solution.
Actually the VA* macros are like:
#define VA_SPEAR13XX_MISC_BASE IO_ADDRESS(SPEAR13XX_MISC_BASE)
Adding IOMEM() over IO_ADDRESS(SPEAR13XX_MISC_BASE) will make it too long. And might cross 80 columns. Can we modify IO_ADDRESS() to use IOMEM()?
Signature · 1 line
viresh
PATCH v4 6/62 ST SPEAr13XX: Adding machine specific header files
Quoted 24 lines · viresh kumar
Quoted 15 lines · Russell King - ARM Linux
arch/arm/mach-spear13xx/include/mach/misc_regs.h line 23
Quoted 5 lines · Viresh Kumar
arch/arm/mach-spear13xx/include/mach/misc_regs.h new file +5
-0+#define MISC_BASE VA_SPEAR13XX_MISC_BASE + +/* General Configuration */ +#define SOC_CFG ((unsigned int *)(MISC_BASE + 0x000)) +#define BOOTSTRAP_CFG ((unsigned int *)(MISC_BASE + 0x004))You could really do with an
IOMEM()macro, thus:#ifndef
__ASSEMBLY__
#define IOMEM(x) ((void__iomem__force*)(x))
#else
#define IOMEM(x) (x)
#endifQuoted 7 lines
You can then use that for stuff like
VA_SPEAR13XX_MISC_BASE, and all these definitions then become:#define
SOC_CFG(MISC_BASE+0x000)because GCC allows void pointer arithmetic (treats it as char).
Quoted 7 lines
Yes. I agree with this solution.
Actually the VA* macros are like:
#defineVA_SPEAR13XX_MISC_BASEIO_ADDRESS(SPEAR13XX_MISC_BASE)Adding
IOMEM()overIO_ADDRESS(SPEAR13XX_MISC_BASE)will make it too long. And might cross 80 columns. Can we modifyIO_ADDRESS()to useIOMEM()?
Russell,
I tried to change IO_ADDRESS() to use IOMEM. But even this doesn't seem to be a good enough solution. __typesafe_io expects unsigned long and we have:
define __io_address(n) __io(IO_ADDRESS(n)).
Also, struct map_desc, .virtual field expects unsigned long, where we are getting warnings.
I tried looking at what others did, and found either they are using (unsigned int *) (as earlier done by us) or casting with (unsigned long) for new warnings mentioned above.
Both didn't seem to be good enough to me. Maybe we can use IOMEM only for MISC_BASE and similar places, where we had been using (unsigned int *).
I will do this in V5, unless you suggest something better.
Signature · 1 line
viresh
PATCH v4 7/62 ST SPEAr13XX: Adding machine specific src files
In reply to Viresh KumarFrom: Shiraz Hashim <[email protected]>
--- arch/arm/mach-spear13xx/Kconfig | 21 ++ arch/arm/mach-spear13xx/Makefile | 14 ++ arch/arm/mach-spear13xx/Makefile.boot | 3 + arch/arm/mach-spear13xx/clock.c | 353 +++++++++++++++++++++++++++++++ arch/arm/mach-spear13xx/headsmp.S | 96 +++++++++ arch/arm/mach-spear13xx/localtimer.c | 25 +++ arch/arm/mach-spear13xx/platsmp.c | 165 ++++++++++++++ arch/arm/mach-spear13xx/spear1300.c | 23 ++ arch/arm/mach-spear13xx/spear1300_evb.c | 48 +++++ arch/arm/mach-spear13xx/spear13xx.c | 121 +++++++++++ 10 files changed, 869 insertions(+), 0 deletions(-) create mode 100644 arch/arm/mach-spear13xx/Kconfig create mode 100644 arch/arm/mach-spear13xx/Makefile create mode 100644 arch/arm/mach-spear13xx/Makefile.boot create mode 100644 arch/arm/mach-spear13xx/clock.c create mode 100644 arch/arm/mach-spear13xx/headsmp.S create mode 100644 arch/arm/mach-spear13xx/localtimer.c create mode 100644 arch/arm/mach-spear13xx/platsmp.c create mode 100644 arch/arm/mach-spear13xx/spear1300.c create mode 100644 arch/arm/mach-spear13xx/spear1300_evb.c create mode 100644 arch/arm/mach-spear13xx/spear13xx.c
arch/arm/mach-spear13xx/Kconfig new file +21 -0
@@ -0,0 +1,21 @@ +# +# SPEAr13XX Machine configuration file +# + +if ARCH_SPEAR13XX + +menu "SPEAr13xx Implementations" +config BOARD_SPEAR1300_EVB + bool "SPEAr1300 Evaluation Board" + select MACH_SPEAR1300 + help + Supports ST SPEAr1300 Evaluation Board + +endmenu + +config MACH_SPEAR1300 + bool "SPEAr1300" + help + Supports ST SPEAr1300 Machine + +endif #ARCH_SPEAR13XX
arch/arm/mach-spear13xx/Makefile new file +14 -0
@@ -0,0 +1,14 @@ +# +# Makefile for SPEAr13XX machine series +# + +# common files +obj-y += spear13xx.o clock.o +obj-$(CONFIG_SMP) += platsmp.o headsmp.o +obj-$(CONFIG_LOCAL_TIMERS) += localtimer.o + +# spear1300 specific files +obj-$(CONFIG_MACH_SPEAR1300) += spear1300.o + +# spear1300 boards files +obj-$(CONFIG_BOARD_SPEAR1300_EVB) += spear1300_evb.o
arch/arm/mach-spear13xx/Makefile.boot new file +3 -0
@@ -0,0 +1,3 @@ +zreladdr-y := 0x00008000 +params_phys-y := 0x00000100 +initrd_phys-y := 0x00800000
arch/arm/mach-spear13xx/clock.c new file +353 -0
353 lines not on this page · raw message
arch/arm/mach-spear13xx/headsmp.S new file +96 -0
96 lines not on this page · raw message
arch/arm/mach-spear13xx/localtimer.c new file +25 -0
@@ -0,0 +1,25 @@ +/* +* arch/arm/mach-spear13xx/localtimer.c +* Directly picked from realview +* +* Copyright (C) 2010 ST Microelectronics Ltd. +* Shiraz Hashim <[email protected]> +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License version 2 as +* published by the Free Software Foundation. +*/ + +#include <linux/init.h> +#include <linux/smp.h> +#include <linux/clockchips.h> +#include <asm/irq.h> +#include <asm/smp_twd.h> +#include <asm/localtimer.h> + +/* Setup the local clock events for a CPU. */ +void __cpuinit local_timer_setup (struct clock_event_device *evt) +{ + evt->irq =IRQ_LOCALTIMER ; +twd_timer_setup (evt); +}
arch/arm/mach-spear13xx/platsmp.c new file +165 -0
165 lines not on this page · raw message
arch/arm/mach-spear13xx/spear1300.c new file +23 -0
@@ -0,0 +1,23 @@ +/* +* arch/arm/mach-spear13xx/spear1300.c +* +* SPEAr1300 machine source file +* +* Copyright (C) 2010 ST Microelectronics +* Shiraz Hashim <[email protected]> +* +* This file is licensed under the terms of the GNU General Public +* License version 2. This program is licensed "as is" without any +* warranty of any kind, whether express or implied. +*/ + +#include <mach/generic.h> +#include <mach/spear.h> + +/* Add spear1300 specific devices here */ + +void __init spear1300_init (void ) +{ +/* call spear13xx family common init function */ +spear13xx_init (); +}
arch/arm/mach-spear13xx/spear1300_evb.c new file +48 -0
48 lines not on this page · raw message
arch/arm/mach-spear13xx/spear13xx.c new file +121 -0
121 lines not on this page · raw message
Signature · 1 line
1.7.2.2
PATCH v4 7/62 ST SPEAr13XX: Adding machine specific src files
Quoted 12 lines · Viresh Kumar
arch/arm/mach-spear13xx/headsmp.S new file +6
-0@@ -0,0 +1,96 @@ +/* + * arch/arm/mach-spear13XX/headsmp.S + * + * Picked from realview + * Copyright (c) 2010 ST Microelectronics Limited + * Shiraz Hashim <[email protected]>
arch/arm/mach-spear13xx/headsmp.S line 16
Quoted 10 lines
arch/arm/mach-spear13xx/headsmp.S new file +10
-0+ * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include <linux/linkage.h> +#include <linux/init.h> + + __INIT
Is this ever called after the kernel text is thrown away? What if we add support in the generic code to start with secondary CPUs offline as a power saving or boot time feature?
Quoted 34 lines
arch/arm/mach-spear13xx/headsmp.S new file +34
-0+ +/* + * This one is picked from Tegra :- + * + * The secondary kernel init calls v7_flush_dcache_all before it enables + * the L1; however, the L1 comes out of reset in an undefined state, so + * the clean + invalidate performed by v7_flush_dcache_all causes a bunch + * of cache lines with uninitialized data and uninitialized tags to get + * written out to memory, which does really unpleasant things to the ain + * processor. We fix this by performing an invalidate, rather than a + * clean + invalidate, before jumping into the kernel. + */ +ENTRY(v7_invalidate_l1) + mov r0, #0 + mcr p15, 2, r0, c0, c0, 0 + mrc p15, 1, r0, c0, c0, 0 + + ldr r1, =0x7fff + and r2, r1, r0, lsr #13 + + ldr r1, =0x3ff + + and r3, r1, r0, lsr #3 @ NumWays - 1 + add r2, r2, #1 @ NumSets + + and r0, r0, #0x7 + add r0, r0, #4 @ SetShift + + clz r1, r3 @ WayShift + add r4, r3, #1 @ NumWays +1: sub r2, r2, #1 @ NumSets-- + mov r3, r4 @ Temp = NumWays +2: subs r3, r3, #1 @ Temp-- + mov r5, r3, lsl r1
arch/arm/mach-spear13xx/headsmp.S line 60
Quoted 10 lines
arch/arm/mach-spear13xx/headsmp.S new file +10
-0+ mov r6, r2, lsl r0 + orr r5, r5, r6 @ Reg = Temp<<WayShift)|(NumSets<<SetShift) + mcr p15, 0, r5, c7, c6, 2 + bgt 2b + cmp r2, #0 + bgt 1b + dsb + isb + mov pc, lr +ENDPROC(v7_invalidate_l1)
This code appears to have its only caller commented out. Should it be removed?
Quoted 36 lines
arch/arm/mach-spear13xx/headsmp.S new file +36
-0+ +/* + * spear13xx specific entry point for secondary CPUs. This provides + * a "holding pen" into which all secondary cores are held until we're + * ready for them to initialise. + */ +ENTRY(spear13xx_secondary_startup) + /* If we don't do this then we have a crash */ + + /* + * Since now this is being called from xloader so removing it + * here + */ +#if 0 + bl v7_invalidate_l1 +#endif + + mrc p15, 0, r0, c0, c0, 5 + and r0, r0, #15 + adr r4, 1f + ldmia r4, {r5, r6} + sub r4, r4, r5 + add r6, r6, r4 +pen: ldr r7, [r6] + cmp r7, r0 + bne pen + + /* + * we've been released from the holding pen: secondary_stack + * should now contain the SVC stack for this core + */ + b secondary_startup + + .align +1: .long . + .long pen_release
...
Quoted 90 lines
arch/arm/mach-spear13xx/headsmp.S new file +90
-0+volatile int __cpuinitdata pen_release = -1; +static DEFINE_SPINLOCK(boot_lock); + +/* + * Write pen_release in a way that is guaranteed to be visible to all + * observers, irrespective of whether they're taking part in coherency + * or not. This is necessary for the hotplug code to work reliably. + */ +static void write_pen_release(int val) +{ + pen_release = val; + smp_wmb(); + __cpuc_flush_dcache_area((void *)&pen_release, sizeof(pen_release)); + outer_clean_range(__pa(&pen_release), __pa(&pen_release + 1)); +} + +static void __iomem *scu_base_addr(void) +{ + return __io_address(SPEAR13XX_SCU_BASE); +} + +void __cpuinit platform_secondary_init(unsigned int cpu) +{ + /* + * if any interrupts are already enabled for the primary + * core (e.g. timer irq), then they will not have been enabled + * for us: do so + */ + gic_secondary_init(0); + + /* + * let the primary processor know we're out of the + * pen, then head off into the C entry point + */ + write_pen_release(-1); + + /* + * Synchronise with the boot thread. + */ + spin_lock(&boot_lock); + spin_unlock(&boot_lock); +} + +int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) +{ + unsigned long timeout; + + /* + * set synchronisation state between this boot processor + * and the secondary one + */ + spin_lock(&boot_lock); + + /* + * The secondary processor is waiting to be released from + * the holding pen - release it, then wait for it to flag + * that it has been released by resetting pen_release. + * + * Note that "pen_release" is the hardware CPU ID, whereas + * "cpu" is Linux's internal ID. + */ + write_pen_release(cpu); + + timeout = jiffies + (1 * HZ); + while (time_before(jiffies, timeout)) { + smp_rmb(); + if (pen_release == -1) + break; + + udelay(10); + } + + /* + * now the secondary core is starting up let it run its + * calibrations, then wait for it to finish + */ + spin_unlock(&boot_lock); + + return pen_release != -1 ? -ENOSYS : 0; +} + +/* + * Initialise the CPU possible map early - this describes the CPUs + * which may be present or become present in the system. + */ +void __init smp_init_cpus(void) +{ + void __iomem *scu_base = scu_base_addr(); + unsigned int i, ncores; +
arch/arm/mach-spear13xx/headsmp.S
Quoted 10 lines
arch/arm/mach-spear13xx/headsmp.S new file +10
-0+ ncores = scu_base ? scu_get_core_count(scu_base) : 1; + + for (i = 0; i < ncores; i++) + set_cpu_possible(i, true); +} + +static void __init wakeup_secondary(void) +{ + /* nobody is to be released from the pen yet */ + pen_release = -1;
But pen_release starts off as -1, so is this really needed?
arch/arm/mach-spear13xx/headsmp.S
Quoted 11 lines
arch/arm/mach-spear13xx/headsmp.S new file +11
-0+ + /* + * Write the address of secondary startup into the system-wide + * location (presently it is in SRAM). The BootMonitor waits + * for this register to become non-zero. + * We must also send an sev to wake it up + */ + __raw_writel(BSYM(virt_to_phys(spear13xx_secondary_startup)), + __io_address(SPEAR13XX_SYS_LOCATION)); + + mb();
Do you really need to sync back to L2, or will a dsb() do here - and as the spinlock code uses dsb() + sev() together, would it make sense to combine the two? (dsb() is required to ensure all previous writes are visible prior to the sev() executing.)
PATCH v4 7/62 ST SPEAr13XX: Adding machine specific src files
Hello Russell,
Quoted 19 lines · Russell King - ARM Linux
Quoted 18 lines · Viresh Kumar
arch/arm/mach-spear13xx/headsmp.S new file +12
-0@@ -0,0 +1,96 @@ +/* + * arch/arm/mach-spear13XX/headsmp.S + * + * Picked from realview + * Copyright (c) 2010 ST Microelectronics Limited + * Shiraz Hashim <[email protected]> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +
Quoted 9 lines
arch/arm/mach-spear13xx/headsmp.S line 16
Quoted 4 lines
arch/arm/mach-spear13xx/headsmp.S new file +4
-0+#include <linux/linkage.h> +#include <linux/init.h> + + __INITIs this ever called after the kernel text is thrown away? What if we add support in the generic code to start with secondary CPUs offline as a power saving or boot time feature?
No. SPEAr platform has no additional feature to explicitly control this aspect of secondary CPUs. Does ARMv7 itself provdes some features for power management of secondary CPUs ?
Quoted 39 lines
Quoted 39 lines
arch/arm/mach-spear13xx/headsmp.S new file +39
-0+ +/* + * This one is picked from Tegra :- + * + * The secondary kernel init calls v7_flush_dcache_all before it enables + * the L1; however, the L1 comes out of reset in an undefined state, so + * the clean + invalidate performed by v7_flush_dcache_all causes a bunch + * of cache lines with uninitialized data and uninitialized tags to get + * written out to memory, which does really unpleasant things to the ain + * processor. We fix this by performing an invalidate, rather than a + * clean + invalidate, before jumping into the kernel. + */ +ENTRY(v7_invalidate_l1) + mov r0, #0 + mcr p15, 2, r0, c0, c0, 0 + mrc p15, 1, r0, c0, c0, 0 + + ldr r1, =0x7fff + and r2, r1, r0, lsr #13 + + ldr r1, =0x3ff + + and r3, r1, r0, lsr #3 @ NumWays - 1 + add r2, r2, #1 @ NumSets + + and r0, r0, #0x7 + add r0, r0, #4 @ SetShift + + clz r1, r3 @ WayShift + add r4, r3, #1 @ NumWays +1: sub r2, r2, #1 @ NumSets-- + mov r3, r4 @ Temp = NumWays +2: subs r3, r3, #1 @ Temp-- + mov r5, r3, lsl r1 + mov r6, r2, lsl r0 + orr r5, r5, r6 @ Reg = Temp<<WayShift)|(NumSets<<SetShift) + mcr p15, 0, r5, c7, c6, 2 + bgt 2b + cmp r2, #0
Quoted 9 lines
arch/arm/mach-spear13xx/headsmp.S line 60
Quoted 5 lines
arch/arm/mach-spear13xx/headsmp.S new file +5
-0+ bgt 1b + dsb + isb + mov pc, lr +ENDPROC(v7_invalidate_l1)This code appears to have its only caller commented out. Should it be removed?
yes, would remove it.
Quoted 131 lines
Quoted 36 lines
arch/arm/mach-spear13xx/headsmp.S new file +36
-0+ +/* + * spear13xx specific entry point for secondary CPUs. This provides + * a "holding pen" into which all secondary cores are held until we're + * ready for them to initialise. + */ +ENTRY(spear13xx_secondary_startup) + /* If we don't do this then we have a crash */ + + /* + * Since now this is being called from xloader so removing it + * here + */ +#if 0 + bl v7_invalidate_l1 +#endif + + mrc p15, 0, r0, c0, c0, 5 + and r0, r0, #15 + adr r4, 1f + ldmia r4, {r5, r6} + sub r4, r4, r5 + add r6, r6, r4 +pen: ldr r7, [r6] + cmp r7, r0 + bne pen + + /* + * we've been released from the holding pen: secondary_stack + * should now contain the SVC stack for this core + */ + b secondary_startup + + .align +1: .long . + .long pen_release...
Quoted 94 lines
arch/arm/mach-spear13xx/headsmp.S new file +94
-0+volatile int __cpuinitdata pen_release = -1; +static DEFINE_SPINLOCK(boot_lock); + +/* + * Write pen_release in a way that is guaranteed to be visible to all + * observers, irrespective of whether they're taking part in coherency + * or not. This is necessary for the hotplug code to work reliably. + */ +static void write_pen_release(int val) +{ + pen_release = val; + smp_wmb(); + __cpuc_flush_dcache_area((void *)&pen_release, sizeof(pen_release)); + outer_clean_range(__pa(&pen_release), __pa(&pen_release + 1)); +} + +static void __iomem *scu_base_addr(void) +{ + return __io_address(SPEAR13XX_SCU_BASE); +} + +void __cpuinit platform_secondary_init(unsigned int cpu) +{ + /* + * if any interrupts are already enabled for the primary + * core (e.g. timer irq), then they will not have been enabled + * for us: do so + */ + gic_secondary_init(0); + + /* + * let the primary processor know we're out of the + * pen, then head off into the C entry point + */ + write_pen_release(-1); + + /* + * Synchronise with the boot thread. + */ + spin_lock(&boot_lock); + spin_unlock(&boot_lock); +} + +int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) +{ + unsigned long timeout; + + /* + * set synchronisation state between this boot processor + * and the secondary one + */ + spin_lock(&boot_lock); + + /* + * The secondary processor is waiting to be released from + * the holding pen - release it, then wait for it to flag + * that it has been released by resetting pen_release. + * + * Note that "pen_release" is the hardware CPU ID, whereas + * "cpu" is Linux's internal ID. + */ + write_pen_release(cpu); + + timeout = jiffies + (1 * HZ); + while (time_before(jiffies, timeout)) { + smp_rmb(); + if (pen_release == -1) + break; + + udelay(10); + } + + /* + * now the secondary core is starting up let it run its + * calibrations, then wait for it to finish + */ + spin_unlock(&boot_lock); + + return pen_release != -1 ? -ENOSYS : 0; +} + +/* + * Initialise the CPU possible map early - this describes the CPUs + * which may be present or become present in the system. + */ +void __init smp_init_cpus(void) +{ + void __iomem *scu_base = scu_base_addr(); + unsigned int i, ncores; + + ncores = scu_base ? scu_get_core_count(scu_base) : 1; + + for (i = 0; i < ncores; i++) + set_cpu_possible(i, true);
Quoted 9 lines
arch/arm/mach-spear13xx/headsmp.S
Quoted 6 lines
arch/arm/mach-spear13xx/headsmp.S new file +6
-0+} + +static void __init wakeup_secondary(void) +{ + /* nobody is to be released from the pen yet */ + pen_release = -1;But
pen_releasestarts off as -1, so is this really needed?
Not required, would remove.
Quoted 8 lines
Quoted 8 lines
arch/arm/mach-spear13xx/headsmp.S new file +8
-0+ + /* + * Write the address of secondary startup into the system-wide + * location (presently it is in SRAM). The BootMonitor waits + * for this register to become non-zero. + * We must also send an sev to wake it up + */ + __raw_writel(BSYM(virt_to_phys(spear13xx_secondary_startup)),
Quoted 8 lines
arch/arm/mach-spear13xx/headsmp.S
Quoted 3 lines
arch/arm/mach-spear13xx/headsmp.S new file +3
-0+ __io_address(SPEAR13XX_SYS_LOCATION)); + + mb();Do you really need to sync back to L2, or will a
dsb()do here - and as the spinlock code usesdsb()+sev()together, would it make sense to combine the two? (dsb()is required to ensure all previous writes are visible prior to thesev()executing.)
Presently L2 cache is initialized after we bootup secondary CPU but one can have the possibility of initializing L2 earlier also. So this would be safer.
Signature · 2 lines
regards Shiraz
PATCH v4 7/62 ST SPEAr13XX: Adding machine specific src files
Quoted 11 lines · Shiraz Hashim
Hello Russell,
Quoted 4 lines · Russell King - ARM Linux
Do you really need to sync back to L2, or will a
dsb()do here - and as the spinlock code usesdsb()+sev()together, would it make sense to combine the two? (dsb()is required to ensure all previous writes are visible prior to thesev()executing.)Presently L2 cache is initialized after we bootup secondary CPU but one can have the possibility of initializing L2 earlier also. So this would be safer.
It shouldn't make any difference as we explicitly flush the required data for the secondary while it is incoherent out of L2 into RAM - that being secondary_data and pen_release.
PATCH v4 7/62 ST SPEAr13XX: Adding machine specific src files
Quoted 9 lines · Russell King - ARM Linux
Quoted 8 lines · Shiraz Hashim
Hello Russell,
Quoted 4 lines · Russell King - ARM Linux
Do you really need to sync back to L2, or will a
dsb()do here - and as the spinlock code usesdsb()+sev()together, would it make sense to combine the two? (dsb()is required to ensure all previous writes are visible prior to thesev()executing.)
Quoted 7 lines
Quoted 3 lines
Presently L2 cache is initialized after we bootup secondary CPU but one can have the possibility of initializing L2 earlier also. So this would be safer.
It shouldn't make any difference as we explicitly flush the required data for the secondary while it is incoherent out of L2 into RAM - that being
secondary_dataandpen_release.
OK, but sev must follow after the SPEAR13XX_SYS_LOCATION has been updated as secondary CPU boot code is in wfe and expects the location to be updated when it is woken.
Signature · 2 lines
regards Shiraz
PATCH v4 8/62 ST SPEAr: Adding support for SPEAr13xx SoC in spear generic plat/
In reply to Viresh KumarFrom: Shiraz Hashim <[email protected]>
--- arch/arm/plat-spear/Kconfig | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-)
arch/arm/plat-spear/Kconfig +8 -0
@@ -8,6 +8,13 @@ choice prompt "ST SPEAr Family" default ARCH_SPEAR3XX +config ARCH_SPEAR13XX + bool "SPEAr13XX" + select ARM_GIC + select CPU_V7 + help + Supports for ARM's SPEAR13XX family + config ARCH_SPEAR3XX bool "SPEAr3XX" select ARM_VIC
@@ -25,6 +32,7 @@ config ARCH_SPEAR6XX endchoice # Adding SPEAr machine specific configuration files +source "arch/arm/mach-spear13xx/Kconfig" source "arch/arm/mach-spear3xx/Kconfig" source "arch/arm/mach-spear6xx/Kconfig"
Signature · 1 line
1.7.2.2
PATCH v4 9/62 ST SPEAr13XX: Added compilation support in arch/arm/
In reply to Viresh KumarFrom: Shiraz Hashim <[email protected]>
This patch adds compilation support for ST Microelectronics SPEAr13xx machines. SPEAr13xx SOC's are based on Arm CortexA9 CPUs.
--- arch/arm/Kconfig | 4 ++-- arch/arm/Makefile | 1 + 2 files changed, 3 insertions(+), 2 deletions(-)
arch/arm/Kconfig +2 -2
@@ -1253,8 +1253,8 @@ config SMP depends on GENERIC_CLOCKEVENTS depends on REALVIEW_EB_ARM11MP || REALVIEW_EB_A9MP || \ MACH_REALVIEW_PB11MP || MACH_REALVIEW_PBX || ARCH_OMAP4 || \ - ARCH_S5PV310 || ARCH_TEGRA || ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || \ - ARCH_MSM_SCORPIONMP || ARCH_SHMOBILE + ARCH_S5PV310 || ARCH_SPEAR13XX || ARCH_TEGRA || ARCH_U8500 || \ + ARCH_VEXPRESS_CA9X4 || ARCH_MSM_SCORPIONMP || ARCH_SHMOBILE select USE_GENERIC_SMP_HELPERS select HAVE_ARM_SCU if !ARCH_MSM_SCORPIONMP help
arch/arm/Makefile +1 -0
@@ -193,6 +193,7 @@ machine-$(CONFIG_ARCH_VEXPRESS) := vexpress machine-$(CONFIG_ARCH_W90X900) := w90x900 machine-$(CONFIG_ARCH_NUC93X) := nuc93x machine-$(CONFIG_FOOTBRIDGE) := footbridge +machine-$(CONFIG_MACH_SPEAR1300) := spear13xx machine-$(CONFIG_MACH_SPEAR300) := spear3xx machine-$(CONFIG_MACH_SPEAR310) := spear3xx machine-$(CONFIG_MACH_SPEAR320) := spear3xx
Signature · 1 line
1.7.2.2
PATCH v4 10/62 ST SPEAr13xx: Adding default config file
In reply to Viresh KumarFrom: Shiraz Hashim <[email protected]>
--- arch/arm/configs/spear13xx_defconfig | 60 ++++++++++++++++++++++++++++++++++ 1 files changed, 60 insertions(+), 0 deletions(-) create mode 100644 arch/arm/configs/spear13xx_defconfig
arch/arm/configs/spear13xx_defconfig new file +60 -0
@@ -0,0 +1,60 @@ +CONFIG_EXPERIMENTAL=y +CONFIG_SYSVIPC=y +CONFIG_BSD_PROCESS_ACCT=y +CONFIG_BLK_DEV_INITRD=y +CONFIG_KALLSYMS_EXTRA_PASS=y +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODVERSIONS=y +CONFIG_PLAT_SPEAR=y +CONFIG_ARCH_SPEAR13XX=y +CONFIG_BOARD_SPEAR1300_EVB=y +CONFIG_SMP=y +CONFIG_NR_CPUS=2 +CONFIG_AEABI=y +CONFIG_BINFMT_MISC=y +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_MTD=y +CONFIG_MTD_CONCAT=y +CONFIG_MTD_PARTITIONS=y +CONFIG_MTD_CMDLINE_PARTS=y +CONFIG_MTD_CHAR=y +CONFIG_MTD_BLOCK=y +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=16384 +CONFIG_INPUT_FF_MEMLESS=y +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +# CONFIG_INPUT_KEYBOARD is not set +# CONFIG_INPUT_MOUSE is not set +CONFIG_SERIAL_AMBA_PL011=y +CONFIG_SERIAL_AMBA_PL011_CONSOLE=y +# CONFIG_LEGACY_PTYS is not set +CONFIG_RAW_DRIVER=y +CONFIG_MAX_RAW_DEVS=8192 +# CONFIG_HWMON is not set +# CONFIG_HID_SUPPORT is not set +# CONFIG_USB_SUPPORT is not set +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_SECURITY=y +CONFIG_EXT3_FS=y +# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set +CONFIG_EXT3_FS_SECURITY=y +CONFIG_AUTOFS4_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_IOCHARSET="ascii" +CONFIG_TMPFS=y +CONFIG_JFFS2_FS=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="utf8" +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_ASCII=m +CONFIG_MAGIC_SYSRQ=y +CONFIG_DEBUG_FS=y +CONFIG_DEBUG_KERNEL=y +CONFIG_DETECT_HUNG_TASK=y +CONFIG_DEBUG_SPINLOCK=y +CONFIG_DEBUG_SPINLOCK_SLEEP=y +CONFIG_DEBUG_INFO=y
Signature · 1 line
1.7.2.2
PATCH v4 11/62 ST SPEAr: Adding support for CLCD on SPEAr3xx/6xx
In reply to Viresh KumarFrom: Vipul-kumar Samar <[email protected]>
SPEAr 3xx and 6xx have ARM PL110 CLCD controller. This patch adds supports for CLCD in these machines.
--- arch/arm/mach-spear3xx/include/mach/generic.h | 6 ++ arch/arm/mach-spear3xx/spear300.c | 17 ++++ arch/arm/mach-spear3xx/spear300_evb.c | 1 + arch/arm/mach-spear3xx/spear320.c | 16 ++++ arch/arm/mach-spear3xx/spear320_evb.c | 1 + arch/arm/mach-spear6xx/include/mach/generic.h | 4 + arch/arm/mach-spear6xx/spear600_evb.c | 1 + arch/arm/mach-spear6xx/spear6xx.c | 17 ++++ arch/arm/plat-spear/Makefile | 2 +- arch/arm/plat-spear/clcd.c | 114 +++++++++++++++++++++++++ drivers/video/Kconfig | 14 +++- 11 files changed, 191 insertions(+), 2 deletions(-) create mode 100644 arch/arm/plat-spear/clcd.c
arch/arm/mach-spear3xx/include/mach/generic.h +6 -0
@@ -100,6 +100,7 @@ extern struct pmx_driver pmx_driver;/* spear300 declarations */ #ifdef CONFIG_MACH_SPEAR300 /* Add spear300 machine device structure declarations here */ +extern struct amba_device clcd_device;extern struct amba_device gpio1_device;/* pad mux modes */
@@ -136,6 +137,8 @@ extern struct pmx_dev pmx_gpio1;/* Add spear300 machine function declarations here */ void __init spear300_init (void ); +/* Add misc structure declarations here */ +extern struct clcd_board clcd_plat_data;#endif /* CONFIG_MACH_SPEAR300 */ /* spear310 declarations */
@@ -160,6 +163,7 @@ void __init spear310_init(void);/* spear320 declarations */ #ifdef CONFIG_MACH_SPEAR320 /* Add spear320 machine device structure declarations here */ +extern struct amba_device clcd_device;/* pad mux modes */ extern struct pmx_mode auto_net_smii_mode;
@@ -194,6 +198,8 @@ extern struct pmx_dev pmx_i2c1;/* Add spear320 machine function declarations here */ void __init spear320_init (void ); +/* Add misc structure declarations here */ +extern struct clcd_board clcd_plat_data;#endif /* CONFIG_MACH_SPEAR320 */ #endif /* __MACH_GENERIC_H */
arch/arm/mach-spear3xx/spear300.c +17 -0
@@ -371,6 +371,23 @@ struct pmx_driver pmx_driver = { };/* Add spear300 specific devices here */ + +/* CLCD device registration */ +struct amba_device clcd_device = { + .dev = { + .init_name ="clcd" , + .coherent_dma_mask = ~0 , + .platform_data = &clcd_plat_data, + }, + .res = { + .start =SPEAR300_CLCD_BASE , + .end =SPEAR300_CLCD_BASE +SPEAR300_CLCD_SIZE -1 , + .flags =IORESOURCE_MEM , + }, + .dma_mask = ~0 , + .irq = {IRQ_CLCD ,NO_IRQ }, +}; +/* arm gpio1 device registration */ static struct pl061_platform_data gpio1_plat_data = { .gpio_base =8 ,
arch/arm/mach-spear3xx/spear300_evb.c +1 -0
@@ -38,6 +38,7 @@ static struct amba_device *amba_devs[] __initdata = { &uart_device,/* spear300 specific devices */ + &clcd_device, &gpio1_device, };
arch/arm/mach-spear3xx/spear320.c +16 -0
@@ -386,6 +386,22 @@ struct pmx_driver pmx_driver = {/* Add spear320 specific devices here */ +/* CLCD device registration */ +struct amba_device clcd_device = { + .dev = { + .init_name ="clcd" , + .coherent_dma_mask = ~0 , + .platform_data = &clcd_plat_data, + }, + .res = { + .start =SPEAR320_CLCD_BASE , + .end =SPEAR320_CLCD_BASE +SPEAR320_CLCD_SIZE -1 , + .flags =IORESOURCE_MEM , + }, + .dma_mask = ~0 , + .irq = {VIRQ_CLCD ,NO_IRQ }, +}; +/* spear3xx shared irq */ struct shirq_dev_config shirq_ras1_config[] = { {
arch/arm/mach-spear3xx/spear320_evb.c +1 -0
@@ -43,6 +43,7 @@ static struct amba_device *amba_devs[] __initdata = { &uart_device,/* spear320 specific devices */ + &clcd_device, }; static struct platform_device *plat_devs[] __initdata = {
arch/arm/mach-spear6xx/include/mach/generic.h +4 -0
@@ -29,6 +29,7 @@#define SPEAR_GPT0_CHAN1_IRQ IRQ_CPU_GPT1_2/* Add spear6xx family device structure declarations here */ +extern struct amba_device clcd_device;extern struct amba_device gpio_device[];extern struct amba_device uart_device[];extern struct sys_timer spear6xx_timer;
@@ -43,4 +44,7 @@ void __init clk_init(void);/* Add spear600 machine device structure declarations here */ +/* Add misc structure declarations here */ +extern struct clcd_board clcd_plat_data; +#endif /* __MACH_GENERIC_H */
arch/arm/mach-spear6xx/spear600_evb.c +1 -0
@@ -17,6 +17,7 @@#include <mach/spear.h> static struct amba_device *amba_devs[]__initdata = { + &clcd_device, &gpio_device[0 ], &gpio_device[1 ], &gpio_device[2 ],
arch/arm/mach-spear6xx/spear6xx.c +17 -0
@@ -23,6 +23,23 @@#include <mach/spear.h> /* Add spear6xx machines common devices here */ + +/* CLCD device registration */ +struct amba_device clcd_device = { + .dev = { + .init_name ="clcd" , + .coherent_dma_mask = ~0 , + .platform_data = &clcd_plat_data, + }, + .res = { + .start =SPEAR6XX_ICM3_CLCD_BASE , + .end =SPEAR6XX_ICM3_CLCD_BASE +SPEAR6XX_ICM3_CLCD_SIZE -1 , + .flags =IORESOURCE_MEM , + }, + .dma_mask = ~0 , + .irq = {IRQ_BASIC_CLCD ,NO_IRQ }, +}; +/* uart device registration */ struct amba_device uart_device[] = { {
arch/arm/plat-spear/Makefile +1 -1
@@ -3,6 +3,6 @@ # # Common support -obj-y := clock.o time.o +obj-y := clcd.o clock.o time.o obj-$(CONFIG_ARCH_SPEAR3XX) += shirq.o padmux.o
arch/arm/plat-spear/clcd.c new file +114 -0
114 lines not on this page · raw message
drivers/video/Kconfig +13 -1
@@ -324,10 +324,22 @@ config FB_ARMCLCD choice - depends on FB_ARMCLCD && (ARCH_LH7A40X || ARCH_LH7952X) + depends on FB_ARMCLCD && (ARCH_LH7A40X || ARCH_LH7952X || ARCH_SPEAR6XX || MACH_SPEAR300 || MACH_SPEAR320) prompt "LCD Panel" default FB_ARMCLCD_SHARP_LQ035Q7DB02 +config FB_ARMCLCD_SHARP_LQ043T1DG01 + bool "SHARP LQ043T1DG01 CLCD 4.2\" TFT(480x272)" + help + This is an implementation of the Sharp LQ043T1DG01, a 4.2" + color TFT panel. The native resolution is 480x272. + +config FB_ARMCLCD_SAMSUNG_LMS700 + bool "SAMSUNG CLCD 7\" TFT(800x480)" + help + This is an implementation of the Samsung LMS700, a 7" + color TFT panel. The native resolution is 800x480. + config FB_ARMCLCD_SHARP_LQ035Q7DB02_HRTFT bool "LogicPD LCD 3.5\" QVGA w/HRTFT IC" help
Signature · 1 line
1.7.2.2
PATCH v4 12/62 ST SPEAr: Updating Clock Support
In reply to Viresh Kumar- Adding support for divisor per parent clock
- Adding ENABLED_ON_INIT feature in clk
- Adding clk_set_rate
- Simplified clk_recalc functions
- Added/updating clock definitions
--- arch/arm/mach-spear13xx/clock.c | 621 +++++++++++++++++++- arch/arm/mach-spear13xx/include/mach/misc_regs.h | 101 ++-- arch/arm/mach-spear3xx/clock.c | 431 ++++++++++++-- arch/arm/mach-spear3xx/include/mach/misc_regs.h | 5 +- arch/arm/mach-spear6xx/clock.c | 331 ++++++++--- arch/arm/mach-spear6xx/include/mach/misc_regs.h | 5 +- arch/arm/plat-spear/clock.c | 675 +++++++++++++++++----- arch/arm/plat-spear/include/plat/clock.h | 94 +++- 8 files changed, 1888 insertions(+), 375 deletions(-)
arch/arm/mach-spear13xx/clock.c +595 -26
@@ -53,10 +53,10 @@ static struct clk rtc_clk = {static struct pclk_info pll_pclk_info[] = { { .pclk = &osc1_24m_clk, - .pclk_mask =OSC_24M_MASK , + .pclk_val =OSC_24M_VAL , }, { .pclk = &osc3_25m_clk, - .pclk_mask =OSC_25M_MASK , + .pclk_val =OSC_25M_VAL , }, };
@@ -88,16 +88,45 @@ static struct pll_clk_config pll1_config = { .masks = &pll_masks, }; +/* pll rate configuration table, in ascending order of rates */ +struct pll_rate_tbl pll_rtbl[] = { +/* PCLK 24MHz */ + {.mode =0 , .m =0x7D , .n =0x03 , .p =0x2 },/* 500 MHz */ + {.mode =0 , .m =0xA6 , .n =0x03 , .p =0x2 },/* 664 MHz */ + {.mode =0 , .m =0xC8 , .n =0x03 , .p =0x2 },/* 800 MHz */ + {.mode =0 , .m =0xFA , .n =0x06 , .p =0x1 },/* 1000 MHz */ +}; +/* pll1 clock */ static struct clk pll1_clk = { + .flags =ENABLED_ON_INIT , .pclk_sel = &pll_pclk_sel, .pclk_sel_shift =PLL1_CLK_SHIFT , .en_reg =PLL1_CTR , .en_reg_bit =PLL_ENABLE , + .calc_rate = &pll_calc_rate, .recalc = &pll_clk_recalc, + .set_rate = &pll_clk_set_rate, + .rate_config = {pll_rtbl,ARRAY_SIZE (pll_rtbl),3 }, .private_data = &pll1_config, }; +/* pll1div2 clock */ +static struct clk pll1div2_clk = { + .flags =ALWAYS_ENABLED , + .pclk = &pll1_clk, + .div_factor =2 , + .recalc = &follow_parent, +}; + +/* pll1div4 clock */ +static struct clk pll1div4_clk = { + .flags =ALWAYS_ENABLED , + .pclk = &pll1_clk, + .div_factor =4 , + .recalc = &follow_parent, +}; +/* pll2 configuration structure */ static struct pll_clk_config pll2_config = { .mode_reg =PLL2_CTR ,
@@ -111,7 +140,10 @@ static struct clk pll2_clk = { .pclk_sel_shift = PLL2_CLK_SHIFT, .en_reg = PLL2_CTR, .en_reg_bit = PLL_ENABLE, + .calc_rate = &pll_calc_rate, .recalc = &pll_clk_recalc, + .set_rate = &pll_clk_set_rate, + .rate_config = {pll_rtbl, ARRAY_SIZE(pll_rtbl), 3}, .private_data = &pll2_config, };
@@ -128,7 +160,10 @@ static struct clk pll3_clk = { .pclk_sel_shift = PLL3_CLK_SHIFT, .en_reg = PLL3_CTR, .en_reg_bit = PLL_ENABLE, + .calc_rate = &pll_calc_rate, .recalc = &pll_clk_recalc, + .set_rate = &pll_clk_set_rate, + .rate_config = {pll_rtbl, ARRAY_SIZE(pll_rtbl), 3}, .private_data = &pll3_config, };
@@ -139,12 +174,24 @@ static struct pll_clk_config pll4_config = { .masks = &pll_masks, }; +/* pll4 rate configuration table, in ascending order of rates */ +struct pll_rate_tbl pll4_rtbl[] = { + {.mode =0 , .m =0x7D , .n =0x03 , .p =0x2 },/* 500 MHz */ + {.mode =0 , .m =0xA6 , .n =0x03 , .p =0x2 },/* 664 MHz */ + {.mode =0 , .m =0xC8 , .n =0x03 , .p =0x2 },/* 800 MHz */ + {.mode =0 , .m =0xFA , .n =0x06 , .p =0x1 },/* 1000 MHz */ +}; +/* pll4 (DDR) clock */ static struct clk pll4_clk = { + .flags =ENABLED_ON_INIT , .pclk = &osc1_24m_clk, .en_reg =PLL4_CTR , .en_reg_bit =PLL_ENABLE , + .calc_rate = &pll_calc_rate, .recalc = &pll_clk_recalc, + .set_rate = &pll_clk_set_rate, + .rate_config = {pll4_rtbl,ARRAY_SIZE (pll4_rtbl),3 }, .private_data = &pll4_config, };
@@ -192,10 +239,10 @@ static struct clk apb_clk = {static struct pclk_info gpt_pclk_info[] = { { .pclk = &osc1_24m_clk, - .pclk_mask =GPT_OSC24_MASK , + .pclk_val =GPT_OSC24_VAL , }, { .pclk = &apb_clk, - .pclk_mask =GPT_APB_MASK , + .pclk_val =GPT_APB_VAL , }, };
@@ -246,15 +293,8 @@ static struct clk gpt3_clk = {/* watch dog timer clock */ static struct clk wdt_clk = { .flags =ALWAYS_ENABLED , - .pclk = &apb_clk, - .recalc = &follow_parent, -}; - -/* smi clock */ -static struct clk smi_clk = { - .pclk = &ahb_clk, - .en_reg =PERIP1_CLK_ENB , - .en_reg_bit =SMI_CLK_ENB , + .pclk = &cpu_clk, + .div_factor =2 , .recalc = &follow_parent, };
@@ -270,22 +310,42 @@ static struct aux_clk_masks aux_masks = { .yscale_sel_shift = AUX_YSCALE_SHIFT, }; +/* clocks derived multiple parents (pll1, pll5, synthesizers or others) */ /* uart configurations */ -static struct aux_clk_config uart_config = { +static struct aux_clk_config uart_synth_config = { .synth_reg =UART_CLK_SYNT , .masks = &aux_masks, }; -/* clocks derived from pll1 or pll5 */ +/* aux rate configuration table, in ascending order of rates */ +struct aux_rate_tbl aux_rtbl[] = { +/* For PLL1div2 = 500 MHz */ + {.xscale =1 , .yscale =6 , .eq =1 },/* 83 MHz */ + {.xscale =1 , .yscale =4 , .eq =1 },/* 125 MHz */ + {.xscale =1 , .yscale =3 , .eq =1 },/* 166 MHz */ + {.xscale =1 , .yscale =2 , .eq =1 },/* 250 MHz */ +}; + +/* uart synth clock */ +static struct clk uart_synth_clk = { + .en_reg =UART_CLK_SYNT , + .en_reg_bit =AUX_SYNT_ENB , + .pclk = &pll1div2_clk, + .calc_rate = &aux_calc_rate, + .recalc = &aux_clk_recalc, + .set_rate = &aux_clk_set_rate, + .rate_config = {aux_rtbl,ARRAY_SIZE (aux_rtbl),0 }, + .private_data = &uart_synth_config, +}; +/* uart parents */ static struct pclk_info uart_pclk_info[] = { { .pclk = &pll5_clk, - .pclk_mask =AUX_CLK_PLL5_MASK , + .pclk_val =AUX_CLK_PLL5_VAL , }, { - .pclk = &pll1_clk, - .pclk_mask =AUX_CLK_PLL1_MASK , - .scalable =1 , + .pclk = &uart_synth_clk, + .pclk_val =AUX_CLK_SYNT_VAL , }, };
@@ -303,10 +363,469 @@ static struct clk uart_clk = { .en_reg_bit = UART_CLK_ENB, .pclk_sel = &uart_pclk_sel, .pclk_sel_shift = UART_CLK_SHIFT, + .recalc = &follow_parent, +}; + +/* sdhci configurations */ +static struct aux_clk_config sdhci_synth_config = { + .synth_reg =SDHCI_CLK_SYNT , + .masks = &aux_masks, +}; + +/* sdhci synth clock */ +static struct clk sdhci_synth_clk = { + .en_reg =SDHCI_CLK_SYNT , + .en_reg_bit =AUX_SYNT_ENB , + .pclk = &pll1div2_clk, + .calc_rate = &aux_calc_rate, + .recalc = &aux_clk_recalc, + .set_rate = &aux_clk_set_rate, + .rate_config = {aux_rtbl,ARRAY_SIZE (aux_rtbl),2 }, + .private_data = &sdhci_synth_config, +}; + +/* sdhci clock */ +static struct clk sdhci_clk = { + .en_reg =PERIP1_CLK_ENB , + .en_reg_bit =SDHCI_CLK_ENB , + .pclk = &sdhci_synth_clk, + .recalc = &follow_parent, +}; + +/* cfxd configurations */ +static struct aux_clk_config cfxd_synth_config = { + .synth_reg =CFXD_CLK_SYNT , + .masks = &aux_masks, +}; + +/* cfxd synth clock */ +static struct clk cfxd_synth_clk = { + .en_reg =CFXD_CLK_SYNT , + .en_reg_bit =AUX_SYNT_ENB , + .pclk = &pll1div2_clk, + .calc_rate = &aux_calc_rate, + .recalc = &aux_clk_recalc, + .set_rate = &aux_clk_set_rate, + .rate_config = {aux_rtbl,ARRAY_SIZE (aux_rtbl),2 }, + .private_data = &cfxd_synth_config, +}; + +/* cfxd clock */ +static struct clk cfxd_clk = { + .en_reg =PERIP1_CLK_ENB , + .en_reg_bit =CFXD_CLK_ENB , + .pclk = &cfxd_synth_clk, + .recalc = &follow_parent, +}; + +/* C3 clk configurations */ +static struct aux_clk_config c3_synth_config = { + .synth_reg =C3_CLK_SYNT , + .masks = &aux_masks, +}; + +/* c3 synth clock */ +static struct clk c3_synth_clk = { + .en_reg =C3_CLK_SYNT , + .en_reg_bit =AUX_SYNT_ENB , + .pclk = &pll1div2_clk, + .calc_rate = &aux_calc_rate, + .recalc = &aux_clk_recalc, + .set_rate = &aux_clk_set_rate, + .rate_config = {aux_rtbl,ARRAY_SIZE (aux_rtbl),0 }, + .private_data = &c3_synth_config, +}; + +/* c3 parents */ +static struct pclk_info c3_pclk_info[] = { + { + .pclk = &pll5_clk, + .pclk_val =AUX_CLK_PLL5_VAL , + }, { + .pclk = &c3_synth_clk, + .pclk_val =AUX_CLK_SYNT_VAL , + }, +}; + +/* c3 parent select structure */ +static struct pclk_sel c3_pclk_sel = { + .pclk_info = c3_pclk_info, + .pclk_count =ARRAY_SIZE (c3_pclk_info), + .pclk_sel_reg =PERIP_CLK_CFG , + .pclk_sel_mask =C3_CLK_MASK , +}; + +/* c3 clock */ +static struct clk c3_clk = { + .en_reg =PERIP1_CLK_ENB , + .en_reg_bit =C3_CLK_ENB , + .pclk_sel = &c3_pclk_sel, + .pclk_sel_shift =C3_CLK_SHIFT , + .recalc = &follow_parent, +}; + +/* gmac phy clk configurations */ +static struct aux_clk_config gmac_phy_synth_config = { + .synth_reg =GMAC_CLK_SYNT , + .masks = &aux_masks, +}; + +/* gmii external pad clock for phy operation */ +static struct clk gmii_txclk125_pad = { + .flags =ALWAYS_ENABLED , + .rate =125000000 , +}; + +/* gmac phy set of input clks*/ +static struct pclk_info gmac_phy_input_pclk_info[] = { + { + .pclk = &gmii_txclk125_pad, + .pclk_val =GMAC_PHY_PAD_VAL , + }, { + .pclk = &pll2_clk, + .pclk_val =GMAC_PHY_PLL2_VAL , + }, { + .pclk = &osc3_25m_clk, + .pclk_val =GMAC_PHY_OSC3_VAL , + }, +}; + +static struct pclk_sel gmac_phy_input_pclk_sel = { + .pclk_info = gmac_phy_input_pclk_info, + .pclk_count =ARRAY_SIZE (gmac_phy_input_pclk_info), + .pclk_sel_reg =GMAC_CLK_CFG , + .pclk_sel_mask =GMAC_PHY_INPUT_CLK_MASK , +}; + +static struct clk gmac_phy_input_clk = { + .flags =ALWAYS_ENABLED , + .pclk_sel = &gmac_phy_input_pclk_sel, + .pclk_sel_shift =GMAC_PHY_INPUT_CLK_SHIFT , + .recalc = &follow_parent, +}; + +/* gmac rate configuration table, in ascending order of rates */ +struct aux_rate_tbl gmac_rtbl[] = { +/* For gmac phy input clk */ + {.xscale =1 , .yscale =6 , .eq =1 },/* divided by 6 */ + {.xscale =1 , .yscale =4 , .eq =1 },/* divided by 4 */ + {.xscale =1 , .yscale =3 , .eq =1 },/* divided by 3 */ + {.xscale =1 , .yscale =2 , .eq =1 },/* divided by 2 */ +}; + +static struct clk gmac_phy_synth_clk = { + .en_reg =GMAC_CLK_CFG , + .en_reg_bit =GMAC_PHY_SYNT_ENB , + .pclk = &gmac_phy_input_clk, + .calc_rate = &aux_calc_rate, .recalc = &aux_clk_recalc, - .private_data = &uart_config, + .set_rate = &aux_clk_set_rate, + .rate_config = {gmac_rtbl,ARRAY_SIZE (gmac_rtbl),0 }, + .private_data = &gmac_phy_synth_config, +}; + +/* gmac phy parents */ +static struct pclk_info gmac_phy_pclk_info[] = { + { + .pclk = &gmac_phy_input_clk, + .pclk_val =0 , + }, { + .pclk = &gmac_phy_synth_clk, + .pclk_val =1 , + } +}; + +/* gmac phy parent select structure */ +static struct pclk_sel gmac_phy_pclk_sel = { + .pclk_info = gmac_phy_pclk_info, + .pclk_count =ARRAY_SIZE (gmac_phy_pclk_info), + .pclk_sel_reg =GMAC_CLK_CFG , + .pclk_sel_mask =GMAC_PHY_CLK_MASK , +}; + +/* gmac phy clock */ +static struct clk gmac_phy_clk = { + .flags =ALWAYS_ENABLED , + .pclk_sel = &gmac_phy_pclk_sel, + .pclk_sel_shift =GMAC_PHY_CLK_SHIFT , + .recalc = &follow_parent, +}; + +/* clcd synthesizers masks */ +static struct clcd_synth_masks clcd_masks = { + .div_factor_mask =CLCD_SYNT_DIV_FACTOR_MASK , + .div_factor_shift =CLCD_SYNT_DIV_FACTOR_SHIFT , +}; + +static struct clcd_clk_config clcd_synth_config = { + .synth_reg =CLCD_CLK_SYNT , + .masks = &clcd_masks, +}; + +/* clcd synth parents */ +static struct pclk_info clcd_synth_pclk_info[] = { + { + .pclk = &pll1div4_clk, + .pclk_val =CLCD_SYNT_PLL1_DIV4_VAL , + }, { + .pclk = &pll2_clk, + .pclk_val =CLCD_SYNT_PLL2_VAL , + }, +}; + +/* clcd synth parent select structure */ +static struct pclk_sel clcd_synth_pclk_sel = { + .pclk_info = clcd_synth_pclk_info, + .pclk_count =ARRAY_SIZE (clcd_synth_pclk_info), + .pclk_sel_reg =PLL_CFG , + .pclk_sel_mask =CLCD_SYNT_CLK_MASK , +}; + +/* clcd rate configuration table, in ascending order of rates */ +struct clcd_rate_tbl clcd_rtbl[] = { +/* For pll1div4 = 250 MHz */ + {.div =0x4000 },/* 62.5 MHz */ + {.div =0x2000 },/* 125 MHz */ +}; + +/* clcd synth clock */ +static struct clk clcd_synth_clk = { + .en_reg =CLCD_CLK_SYNT , + .en_reg_bit =CLCD_SYNT_ENB , + .pclk_sel = &clcd_synth_pclk_sel, + .pclk_sel_shift =CLCD_SYNT_CLK_SHIFT , + .calc_rate = &clcd_calc_rate, + .recalc = &clcd_clk_recalc, + .set_rate = &clcd_clk_set_rate, + .rate_config = {clcd_rtbl,ARRAY_SIZE (clcd_rtbl),1 }, + .private_data = &clcd_synth_config, +}; + +/* clcd clock parents */ +static struct pclk_info clcd_pclk_info[] = { + { + .pclk = &pll5_clk, + .pclk_val =AUX_CLK_PLL5_VAL , + }, { + .pclk = &clcd_synth_clk, + .pclk_val =AUX_CLK_SYNT_VAL , + }, +}; + +/* clcd parent select structure */ +static struct pclk_sel clcd_pclk_sel = { + .pclk_info = clcd_pclk_info, + .pclk_count =ARRAY_SIZE (clcd_pclk_info), + .pclk_sel_reg =PERIP_CLK_CFG , + .pclk_sel_mask =CLCD_CLK_MASK , +}; + +/* clcd clock */ +static struct clk clcd_clk = { + .en_reg =PERIP1_CLK_ENB , + .en_reg_bit =CLCD_CLK_ENB , + .pclk_sel = &clcd_pclk_sel, + .pclk_sel_shift =CLCD_CLK_SHIFT , + .recalc = &follow_parent, +}; + +/* clock derived from ahb clk */ + +/* i2c clock */ +static struct clk i2c_clk = { + .pclk = &ahb_clk, + .en_reg =PERIP1_CLK_ENB , + .en_reg_bit =I2C_CLK_ENB , + .recalc = &follow_parent, +}; + +/* dma clock */ +static struct clk dma0_clk = { + .pclk = &ahb_clk, + .en_reg =PERIP1_CLK_ENB , + .en_reg_bit =DMA0_CLK_ENB , + .recalc = &follow_parent, +}; + +static struct clk dma1_clk = { + .pclk = &ahb_clk, + .en_reg =PERIP1_CLK_ENB , + .en_reg_bit =DMA1_CLK_ENB , + .recalc = &follow_parent, +}; + +/* jpeg clock */ +static struct clk jpeg_clk = { + .pclk = &ahb_clk, + .en_reg =PERIP1_CLK_ENB , + .en_reg_bit =JPEG_CLK_ENB , + .recalc = &follow_parent, +}; + +/* gmac clock */ +static struct clk gmac_clk = { + .pclk = &ahb_clk, + .en_reg =PERIP1_CLK_ENB , + .en_reg_bit =GMAC_CLK_ENB , + .recalc = &follow_parent, +}; + +/* fsmc clock */ +static struct clk fsmc_clk = { + .pclk = &ahb_clk, + .en_reg =PERIP1_CLK_ENB , + .en_reg_bit =FSMC_CLK_ENB , + .recalc = &follow_parent, +}; + +/* smi clock */ +static struct clk smi_clk = { + .pclk = &ahb_clk, + .en_reg =PERIP1_CLK_ENB , + .en_reg_bit =SMI_CLK_ENB , + .recalc = &follow_parent, +}; + +/* uhc0 clock */ +static struct clk uhci0_clk = { + .pclk = &ahb_clk, + .en_reg =PERIP1_CLK_ENB , + .en_reg_bit =UHC0_CLK_ENB , + .recalc = &follow_parent, +}; + +/* uhc1 clock */ +static struct clk uhci1_clk = { + .pclk = &ahb_clk, + .en_reg =PERIP1_CLK_ENB , + .en_reg_bit =UHC1_CLK_ENB , + .recalc = &follow_parent, +}; + +/* usbd clock */ +static struct clk usbd_clk = { + .pclk = &ahb_clk, + .en_reg =PERIP1_CLK_ENB , + .en_reg_bit =USBD_CLK_ENB , + .recalc = &follow_parent, +}; + +/* pci clocks */ +static struct clk pcie0_clk = { + .pclk = &ahb_clk, + .en_reg =PERIP1_CLK_ENB , + .en_reg_bit =PCIE0_CLK_ENB , + .recalc = &follow_parent, +}; + +static struct clk pcie1_clk = { + .pclk = &ahb_clk, + .en_reg =PERIP1_CLK_ENB , + .en_reg_bit =PCIE1_CLK_ENB , + .recalc = &follow_parent, }; +static struct clk pcie2_clk = { + .pclk = &ahb_clk, + .en_reg =PERIP1_CLK_ENB , + .en_reg_bit =PCIE2_CLK_ENB , + .recalc = &follow_parent, +}; + +/* sysram clocks */ +static struct clk sysram0_clk = { + .pclk = &ahb_clk, + .en_reg =PERIP1_CLK_ENB , + .en_reg_bit =SYSRAM0_CLK_ENB , + .recalc = &follow_parent, +}; + +static struct clk sysram1_clk = { + .pclk = &ahb_clk, + .en_reg =PERIP1_CLK_ENB , + .en_reg_bit =SYSRAM1_CLK_ENB , + .recalc = &follow_parent, +}; + +/* clock derived from apb clk */ +/* adc clock */ +static struct clk adc_clk = { + .pclk = &apb_clk, + .en_reg =PERIP1_CLK_ENB , + .en_reg_bit =ADC_CLK_ENB , + .recalc = &follow_parent, +}; + +/* ssp clock */ +static struct clk ssp_clk = { + .pclk = &apb_clk, + .en_reg =PERIP1_CLK_ENB , + .en_reg_bit =SSP_CLK_ENB , + .recalc = &follow_parent, +}; + +/* gpio clock */ +static struct clk gpio0_clk = { + .pclk = &apb_clk, + .en_reg =PERIP1_CLK_ENB , + .en_reg_bit =GPIO0_CLK_ENB , + .recalc = &follow_parent, +}; + +/* gpio clock */ +static struct clk gpio1_clk = { + .pclk = &apb_clk, + .en_reg =PERIP1_CLK_ENB , + .en_reg_bit =GPIO1_CLK_ENB , + .recalc = &follow_parent, +}; + +/* i2s0 clock */ +static struct clk i2s0_clk = { + .pclk = &apb_clk, + .en_reg =PERIP1_CLK_ENB , + .en_reg_bit =I2S0_CLK_ENB , + .recalc = &follow_parent, +}; + +/* i2s1 clock */ +static struct clk i2s1_clk = { + .pclk = &apb_clk, + .en_reg =PERIP1_CLK_ENB , + .en_reg_bit =I2S1_CLK_ENB , + .recalc = &follow_parent, +}; + +/* keyboard clock */ +static struct clk kbd_clk = { + .pclk = &apb_clk, + .en_reg =PERIP2_CLK_ENB , + .en_reg_bit =KBD_CLK_ENB , + .recalc = &follow_parent, +}; + +/* spear1300 machine specific clock structures */ +#ifdef CONFIG_MACH_SPEAR1300 + +#endif + +/* spear1310 machine specific clock structures */ +#ifdef CONFIG_MACH_SPEAR1310 +/* can0 clock */ +static struct clk can0_clk = { + .flags =ALWAYS_ENABLED , + .pclk = &apb_clk, + .recalc = &follow_parent, +}; + +/* can1 clock */ +static struct clk can1_clk = { + .flags =ALWAYS_ENABLED , + .pclk = &apb_clk, + .recalc = &follow_parent, +}; +#endif +/* array of all spear 13xx clock lookups */ static struct clk_lookup spear_clk_lookups[] = {/* root clks */
@@ -315,7 +834,7 @@ static struct clk_lookup spear_clk_lookups[] = { {.con_id = "osc3_25m_clk", .clk = &osc3_25m_clk}, /* clock derived from 32 KHz osc clk */ - {.dev_id = "rtc", .clk = &rtc_clk}, + {.dev_id = "rtc-spear", .clk = &rtc_clk}, /* clock derived from 24/25 MHz osc1/osc3 clk */ {.con_id = "pll1_clk", .clk = &pll1_clk},
@@ -328,18 +847,68 @@ static struct clk_lookup spear_clk_lookups[] = {/* clock derived from pll1 clk */ {.con_id = "cpu_clk", .clk = &cpu_clk}, {.con_id = "ahb_clk", .clk = &ahb_clk}, - { .con_id = "apb_clk", .clk = &apb_clk}, + {.con_id = "apb_clk", .clk = &apb_clk}, + + /* synthesizers/prescaled clocks */ + {.con_id = "pll1div2_clk", .clk = &pll1div2_clk}, + {.con_id = "pll1div4_clk", .clk = &pll1div4_clk}, + {.con_id = "c3_synth_clk", .clk = &c3_synth_clk}, + {.con_id = "gmii_txclk123_pad_clk", .clk = &gmii_txclk125_pad}, + {.con_id = "clcd_synth_clk", .clk = &clcd_synth_clk}, + {.con_id = "uart_synth_clk", .clk = &uart_synth_clk}, + {.con_id = "sdhci_synth_clk", .clk = &sdhci_synth_clk}, + {.con_id = "cfxd_synth_clk", .clk = &cfxd_synth_clk}, + {.con_id = "gmac_phy_input_clk", .clk = &gmac_phy_input_clk}, + {.con_id = "gmac_phy_synth_clk", .clk = &gmac_phy_synth_clk}, + {.con_id = "gmac_phy_clk", .clk = &gmac_phy_clk}, /* clocks having multiple parent source from above clocks */ - {.dev_id = "uart", .clk = &uart_clk}, + {.dev_id = "clcd", .clk = &clcd_clk}, {.dev_id = "gpt0", .clk = &gpt0_clk}, {.dev_id = "gpt1", .clk = &gpt1_clk}, {.dev_id = "gpt2", .clk = &gpt2_clk}, {.dev_id = "gpt3", .clk = &gpt3_clk}, + {.dev_id = "uart", .clk = &uart_clk}, - /* clock derived from ahb/apb clk */ - { .dev_id = "smi", .clk = &smi_clk}, - { .dev_id = "wdt", .clk = &wdt_clk}, + /* clock derived from ahb clk */ + {.dev_id = "smi", .clk = &smi_clk}, + {.con_id = "usbh.0_clk", .clk = &uhci0_clk}, + {.con_id = "usbh.1_clk", .clk = &uhci1_clk}, + {.dev_id = "usbd", .clk = &usbd_clk}, + {.dev_id = "i2c_designware.0", .clk = &i2c_clk}, + {.dev_id = "dma0", .clk = &dma0_clk}, + {.dev_id = "dma1", .clk = &dma1_clk}, + {.dev_id = "jpeg", .clk = &jpeg_clk}, + {.dev_id = "gmac", .clk = &gmac_clk}, + {.dev_id = "c3", .clk = &c3_clk}, + {.dev_id = "pcie0", .clk = &pcie0_clk}, + {.dev_id = "pcie1", .clk = &pcie1_clk}, + {.dev_id = "pcie2", .clk = &pcie2_clk}, + {.dev_id = "cfxd", .clk = &cfxd_clk}, + {.dev_id = "sdhci", .clk = &sdhci_clk}, + {.con_id = "fsmc", .clk = &fsmc_clk}, + {.dev_id = "sysram0", .clk = &sysram0_clk}, + {.dev_id = "sysram1", .clk = &sysram1_clk}, + + /* clock derived from apb clk */ + {.dev_id = "i2s0", .clk = &i2s0_clk}, + {.dev_id = "i2s1", .clk = &i2s1_clk}, + {.dev_id = "adc", .clk = &adc_clk}, + {.dev_id = "ssp-pl022", .clk = &ssp_clk}, + {.dev_id = "gpio0", .clk = &gpio0_clk}, + {.dev_id = "gpio1", .clk = &gpio1_clk}, + {.dev_id = "keyboard", .clk = &kbd_clk}, + {.dev_id = "wdt", .clk = &wdt_clk}, + +/* spear1300 machine specific clock structures */ +#ifdef CONFIG_MACH_SPEAR1300 +#endif + + /* spear1310 machine specific clock structures */ +#ifdef CONFIG_MACH_SPEAR1310 + {.dev_id = "c_can_platform.0", .clk = &can0_clk}, + {.dev_id = "c_can_platform.1", .clk = &can1_clk}, +#endif };void __init clk_init (void )
arch/arm/mach-spear13xx/include/mach/misc_regs.h +64 -37
149 lines not on this page · raw message
arch/arm/mach-spear3xx/clock.c +366 -65
588 lines not on this page · raw message
arch/arm/mach-spear3xx/include/mach/misc_regs.h +3 -2
@@ -63,8 +63,8 @@#define GPT1_CLK_SHIFT 11#define GPT2_CLK_SHIFT 12#define GPT_CLK_MASK 0x1 -#define AUX_CLK_PLL3_MASK 0 -#define AUX_CLK_PLL1_MASK 1 +#define AUX_CLK_PLL3_VAL 0 +#define AUX_CLK_PLL1_VAL 1#define PERIP1_CLK_ENB ((unsigned int *)(MISC_BASE + 0x02C))/* PERIP1_CLK_ENB register masks */
@@ -113,6 +113,7 @@#define RAS3_CLK_SYNT ((unsigned int *)(MISC_BASE + 0x074))#define RAS4_CLK_SYNT ((unsigned int *)(MISC_BASE + 0x078))/* aux clk synthesiser register masks for irda to ras4 */ +#define AUX_SYNT_ENB 31#define AUX_EQ_SEL_SHIFT 30#define AUX_EQ_SEL_MASK 1#define AUX_EQ1_SEL 0
arch/arm/mach-spear6xx/clock.c +238 -93
487 lines not on this page · raw message
arch/arm/mach-spear6xx/include/mach/misc_regs.h +3 -2
@@ -66,8 +66,8 @@#define GPT2_CLK_SHIFT 11#define GPT3_CLK_SHIFT 12#define GPT_CLK_MASK 0x1 -#define AUX_CLK_PLL3_MASK 0 -#define AUX_CLK_PLL1_MASK 1 +#define AUX_CLK_PLL3_VAL 0 +#define AUX_CLK_PLL1_VAL 1#define PERIP1_CLK_ENB ((unsigned int *)(MISC_BASE + 0x02C))/* PERIP1_CLK_ENB register masks */
@@ -123,6 +123,7 @@#define RAS3_CLK_SYNT ((unsigned int *)(MISC_BASE + 0x074))#define RAS4_CLK_SYNT ((unsigned int *)(MISC_BASE + 0x078))/* aux clk synthesiser register masks for irda to ras4 */ +#define AUX_SYNT_ENB 31#define AUX_EQ_SEL_SHIFT 30#define AUX_EQ_SEL_MASK 1#define AUX_EQ1_SEL 0
arch/arm/plat-spear/clock.c +537 -138
844 lines not on this page · raw message
arch/arm/plat-spear/include/plat/clock.h +82 -12
154 lines not on this page · raw message
Signature · 1 line
1.7.2.2
PATCH v4 13/62 ST SPEAr: Adding Debugfs support on clock framework
In reply to Viresh KumarFrom: Shiraz Hashim <[email protected]>
--- arch/arm/plat-spear/clock.c | 116 ++++++++++++++++++++++++++++++ arch/arm/plat-spear/include/plat/clock.h | 8 ++ 2 files changed, 124 insertions(+), 0 deletions(-)
arch/arm/plat-spear/clock.c +116 -0
@@ -13,6 +13,7 @@#include <linux/bug.h> #include <linux/clk.h> +#include <linux/debugfs.h> #include <linux/err.h> #include <linux/io.h> #include <linux/list.h>
@@ -22,8 +23,14 @@static DEFINE_SPINLOCK (clocks_lock);static LIST_HEAD (root_clks); +#ifdef CONFIG_DEBUG_FS +static LIST_HEAD (clocks); +#endif static void propagate_rate (struct clk *,int on_init); +#ifdef CONFIG_DEBUG_FS +static int clk_debugfs_reparent (struct clk *); +#endif static int generic_clk_enable (struct clk *clk) {
@@ -96,6 +103,10 @@ static void clk_reparent(struct clk *clk, struct pclk_info *pclk_info) clk->pclk = pclk_info->pclk;spin_unlock_irqrestore (&clocks_lock, flags); + +#ifdef CONFIG_DEBUG_FS +clk_debugfs_reparent (clk); +#endif }static void do_clk_disable (struct clk *clk)
@@ -336,6 +347,12 @@ void clk_register(struct clk_lookup *cl)spin_unlock_irqrestore (&clocks_lock, flags); +/* debugfs specific */ +#ifdef CONFIG_DEBUG_FS +list_add (&clk->node, &clocks); + clk->cl = cl; +#endif +/* add clock to arm clockdev framework */ clkdev_add (cl); }
@@ -855,3 +872,102 @@ void recalc_root_clocks(void) }spin_unlock_irqrestore (&clocks_lock, flags); } + +#ifdef CONFIG_DEBUG_FS +/* +* debugfs support to trace clock tree hierarchy and attributes +*/ +static struct dentry *clk_debugfs_root; +static int clk_debugfs_register_one (struct clk *c) +{ +int err; +struct dentry *d, *child; +struct clk *pa = c->pclk; +char s[255 ]; +char *p = s; + +if (c) { +if (c->cl->con_id) + p +=sprintf (p,"%s" , c->cl->con_id); +if (c->cl->dev_id) + p +=sprintf (p,"%s" , c->cl->dev_id); + } + d =debugfs_create_dir (s, pa ? pa->dent : clk_debugfs_root); +if (!d) +return -ENOMEM ; + c->dent = d; + + d =debugfs_create_u32 ("usage_count" ,S_IRUGO , c->dent, + (u32 *)&c->usage_count); +if (!d) { + err = -ENOMEM ; + goto err_out; + } + d =debugfs_create_u32 ("rate" ,S_IRUGO , c->dent, (u32 *)&c->rate); +if (!d) { + err = -ENOMEM ; + goto err_out; + } + d =debugfs_create_x32 ("flags" ,S_IRUGO , c->dent, (u32 *)&c->flags); +if (!d) { + err = -ENOMEM ; + goto err_out; + } +return 0 ; + +err_out: + d = c->dent; +list_for_each_entry (child, &d->d_subdirs, d_u.d_child) +debugfs_remove (child); +debugfs_remove (c->dent); +return err; +} + +static int clk_debugfs_register (struct clk *c) +{ +int err; +struct clk *pa = c->pclk; + +if (pa && !pa->dent) { + err =clk_debugfs_register (pa); +if (err) +return err; + } + +if (!c->dent) { + err =clk_debugfs_register_one (c); +if (err) +return err; + } +return 0 ; +} + +static int __init clk_debugfs_init (void ) +{ +struct clk *c; +struct dentry *d; +int err; + + d =debugfs_create_dir ("clock" ,NULL ); +if (!d) +return -ENOMEM ; + clk_debugfs_root = d; + +list_for_each_entry (c, &clocks, node) { + err =clk_debugfs_register (c); +if (err) + goto err_out; + } +return 0 ; +err_out: +debugfs_remove_recursive (clk_debugfs_root); +return err; +} +late_initcall (clk_debugfs_init); + +static int clk_debugfs_reparent (struct clk *c) +{ +debugfs_remove (c->dent); +return clk_debugfs_register_one (c); +} +#endif /* CONFIG_DEBUG_FS */
arch/arm/plat-spear/include/plat/clock.h +8 -0
@@ -88,6 +88,9 @@ struct rate_config {* @children: list for childrens or this clock * @sibling: node for list of clocks having same parents * @private_data: clock specific private data +* @node: list to maintain clocks linearly +* @cl: clocklook up assoicated with this clock +* @dent: object for debugfs */ struct clk {unsigned int usage_count;
@@ -109,6 +112,11 @@ struct clk {struct list_head children;struct list_head sibling;void *private_data; +#ifdef CONFIG_DEBUG_FS +struct list_head node; +struct clk_lookup *cl; +struct dentry *dent; +#endif };/* pll configuration structure */
Signature · 1 line
1.7.2.2
PATCH v4 14/62 ST SPEAr: Correcting SOC Config base address for spear320
In reply to Viresh Kumar--- arch/arm/mach-spear3xx/include/mach/spear320.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
arch/arm/mach-spear3xx/include/mach/spear320.h +1 -1
@@ -62,7 +62,7 @@#define SPEAR320_SMII1_BASE 0xAB000000#define SPEAR320_SMII1_SIZE 0x01000000 -#define SPEAR320_SOC_CONFIG_BASE 0xB4000000 +#define SPEAR320_SOC_CONFIG_BASE 0xB3000000#define SPEAR320_SOC_CONFIG_SIZE 0x00000070/* Interrupt registers offsets and masks */ #define INT_STS_MASK_REG 0x04
Signature · 1 line
1.7.2.2
PATCH v4 15/62 ST SPEAr: Adding PLGPIO driver for spear platform
In reply to Viresh KumarPlgpio pads on few spear machines can be configured as gpios. This patch add support for configuring these PLGPIOs.
--- arch/arm/mach-spear3xx/include/mach/generic.h | 2 + arch/arm/mach-spear3xx/include/mach/gpio.h | 141 ++++++++ arch/arm/mach-spear3xx/include/mach/irqs.h | 9 +- arch/arm/mach-spear3xx/spear310.c | 69 ++++ arch/arm/mach-spear3xx/spear310_evb.c | 1 + arch/arm/mach-spear3xx/spear320.c | 30 ++- arch/arm/mach-spear3xx/spear320_evb.c | 1 + arch/arm/mach-spear6xx/include/mach/gpio.h | 27 ++ arch/arm/plat-spear/Makefile | 2 + arch/arm/plat-spear/include/plat/gpio.h | 35 ++ arch/arm/plat-spear/plgpio.c | 452 +++++++++++++++++++++++++ 11 files changed, 764 insertions(+), 5 deletions(-) create mode 100644 arch/arm/plat-spear/plgpio.c
arch/arm/mach-spear3xx/include/mach/generic.h +2 -0
@@ -144,6 +144,7 @@ extern struct clcd_board clcd_plat_data;/* spear310 declarations */ #ifdef CONFIG_MACH_SPEAR310 /* Add spear310 machine device structure declarations here */ +extern struct platform_device plgpio_device;/* pad mux devices */ extern struct pmx_dev pmx_emi_cs_0_1_4_5;
@@ -164,6 +165,7 @@ void __init spear310_init(void);#ifdef CONFIG_MACH_SPEAR320 /* Add spear320 machine device structure declarations here */ extern struct amba_device clcd_device; +extern struct platform_device plgpio_device;/* pad mux modes */ extern struct pmx_mode auto_net_smii_mode;
arch/arm/mach-spear3xx/include/mach/gpio.h +141 -0
145 lines not on this page · raw message
arch/arm/mach-spear3xx/include/mach/irqs.h +5 -4
@@ -141,12 +141,13 @@#endif /* PLGPIO Virtual IRQs */ +#define SPEAR_PLGPIO_COUNT 102#if defined(CONFIG_MACH_SPEAR310 ) || defined(CONFIG_MACH_SPEAR320 ) -#define SPEAR_PLGPIO_INT_BASE (SPEAR_GPIO_INT_BASE + 8) -#define SPEAR_GPIO_INT_END (SPEAR_PLGPIO_INT_BASE + 102) +#define SPEAR_PLGPIO_INT_BASE (SPEAR_GPIO_INT_BASE + 8) +#define SPEAR_GPIO_INT_END (SPEAR_PLGPIO_INT_BASE + SPEAR_PLGPIO_COUNT)#endif -#define VIRQ_END SPEAR_GPIO_INT_END -#define NR_IRQS VIRQ_END +#define VIRQ_END SPEAR_GPIO_INT_END +#define NR_IRQS VIRQ_END#endif /* __MACH_IRQS_H */
arch/arm/mach-spear3xx/spear310.c +69 -0
81 lines not on this page · raw message
arch/arm/mach-spear3xx/spear310_evb.c +1 -0
@@ -52,6 +52,7 @@ static struct platform_device *plat_devs[] __initdata = {/* spear3xx specific devices */ /* spear310 specific devices */ + &plgpio_device, };static void __init spear310_evb_init (void )
arch/arm/mach-spear3xx/spear320.c +29 -1
@@ -15,6 +15,7 @@#include <asm/irq.h> #include <mach/generic.h> #include <mach/spear.h> +#include <plat/gpio.h> #include <plat/shirq.h> /* pad multiplexing support */
@@ -385,7 +386,6 @@ struct pmx_driver pmx_driver = { };/* Add spear320 specific devices here */ -/* CLCD device registration */ struct amba_device clcd_device = { .dev = {
@@ -402,6 +402,34 @@ struct amba_device clcd_device = { .irq = {VIRQ_CLCD, NO_IRQ}, }; +/* plgpio device registeration */ +static struct plgpio_platform_data plgpio_plat_data = { + .gpio_base = 8, + .irq_base = SPEAR_PLGPIO_INT_BASE, + .gpio_count = SPEAR_PLGPIO_COUNT, +}; + +static struct resource plgpio_resources[] = { + { + .start = SPEAR320_SOC_CONFIG_BASE, + .end = SPEAR320_SOC_CONFIG_BASE + SZ_4K - 1, + .flags = IORESOURCE_MEM, + }, { + .start = VIRQ_PLGPIO, + .flags = IORESOURCE_IRQ, + }, +}; + +struct platform_device plgpio_device = { + .name = "plgpio", + .id = -1, + .dev = { + .platform_data = &plgpio_plat_data, + }, + .num_resources = ARRAY_SIZE(plgpio_resources), + .resource = plgpio_resources, +}; + /* spear3xx shared irq */ struct shirq_dev_config shirq_ras1_config[] = { {
arch/arm/mach-spear3xx/spear320_evb.c +1 -0
@@ -50,6 +50,7 @@ static struct platform_device *plat_devs[] __initdata = {/* spear3xx specific devices */ /* spear320 specific devices */ + &plgpio_device, };static void __init spear320_evb_init (void )
arch/arm/mach-spear6xx/include/mach/gpio.h +27 -0
@@ -16,4 +16,31 @@#include <plat/gpio.h> +#define CPU_GPIO_0 0 +#define CPU_GPIO_1 1 +#define CPU_GPIO_2 2 +#define CPU_GPIO_3 3 +#define CPU_GPIO_4 4 +#define CPU_GPIO_5 5 +#define CPU_GPIO_6 6 +#define CPU_GPIO_7 7 + +#define BASIC_GPIO_0 8 +#define BASIC_GPIO_1 9 +#define BASIC_GPIO_2 10 +#define BASIC_GPIO_3 11 +#define BASIC_GPIO_4 12 +#define BASIC_GPIO_5 13 +#define BASIC_GPIO_6 14 +#define BASIC_GPIO_7 15 + +#define APPL_GPIO_0 16 +#define APPL_GPIO_1 17 +#define APPL_GPIO_2 18 +#define APPL_GPIO_3 19 +#define APPL_GPIO_4 20 +#define APPL_GPIO_5 21 +#define APPL_GPIO_6 22 +#define APPL_GPIO_7 23 +#endif /* __MACH_GPIO_H */
arch/arm/plat-spear/Makefile +2 -0
@@ -6,3 +6,5 @@ obj-y := clcd.o clock.o time.o obj-$(CONFIG_ARCH_SPEAR3XX) += shirq.o padmux.o +obj-$(CONFIG_MACH_SPEAR310) += plgpio.o +obj-$(CONFIG_MACH_SPEAR320) += plgpio.o
arch/arm/plat-spear/include/plat/gpio.h +35 -0
@@ -21,4 +21,39 @@#define gpio_cansleep __gpio_cansleep#define gpio_to_irq __gpio_to_irq +/* plgpio driver declarations */ +/* +* plgpio pins in all machines are not one to one mapped, bitwise with +* registers bits. These set of macros define register masks for which below +* functions (pin_to_offset and offset_to_pin) are required to be called. +*/ +#define PTO_ENB_REG 0x001 +#define PTO_WDATA_REG 0x002 +#define PTO_DIR_REG 0x004 +#define PTO_IE_REG 0x008 +#define PTO_RDATA_REG 0x010 +#define PTO_MIS_REG 0x020 + +/* functions for converting pin to correct offset in register and vice versa */ +/** +* struct plgpio_platform_data: plgpio driver platform data +* +* gpio_base: gpio start number of plgpios +* irq_base: irq number of plgpio0 +* gpio_count: total count of plgpios +* p2o: function ptr for pin to offset conversion. This is required only for +* machines where mapping b/w pin and offset is not 1-to-1. +* o2p: function ptr for offset to pin conversion. This is required only for +* machines where mapping b/w pin and offset is not 1-to-1. +* p2o_regs: mask of registers for which p2o and o2p are applicable +*/ +struct plgpio_platform_data { +u32 gpio_base; +u32 irq_base; +u32 gpio_count; +int (*p2o)(int pin);/* pin_to_offset */ +int (*o2p)(int offset);/* offset_to_pin */ +u32 p2o_regs; +}; +#endif /* __PLAT_GPIO_H */
arch/arm/plat-spear/plgpio.c new file +452 -0
452 lines not on this page · raw message
Signature · 1 line
1.7.2.2
PATCH v4 17/62 ST SPEAr: Adding machine support for rtc-spear
In reply to Viresh KumarFrom: Rajeev Kumar <[email protected]>
--- arch/arm/mach-spear13xx/include/mach/generic.h | 1 + arch/arm/mach-spear13xx/spear1300_evb.c | 1 + arch/arm/mach-spear13xx/spear13xx.c | 19 +++++++++++++++++++ arch/arm/mach-spear3xx/include/mach/generic.h | 1 + arch/arm/mach-spear3xx/spear300_evb.c | 1 + arch/arm/mach-spear3xx/spear310_evb.c | 1 + arch/arm/mach-spear3xx/spear320_evb.c | 1 + arch/arm/mach-spear3xx/spear3xx.c | 19 +++++++++++++++++++ arch/arm/mach-spear6xx/include/mach/generic.h | 1 + arch/arm/mach-spear6xx/spear600_evb.c | 1 + arch/arm/mach-spear6xx/spear6xx.c | 19 +++++++++++++++++++ 11 files changed, 65 insertions(+), 0 deletions(-)
arch/arm/mach-spear13xx/include/mach/generic.h +1 -0
@@ -30,6 +30,7 @@/* Add spear13xx family device structure declarations here */ extern struct amba_device spear13xx_uart_device; +extern struct platform_device spear13xx_rtc_device;extern struct sys_timer spear13xx_timer;/* Add spear1300 machine device structure declarations here */
arch/arm/mach-spear13xx/spear1300_evb.c +1 -0
@@ -22,6 +22,7 @@ static struct amba_device *amba_devs[] __initdata = { };static struct platform_device *plat_devs[]__initdata = { + &spear13xx_rtc_device, };static void __init spear1300_evb_init (void )
arch/arm/mach-spear13xx/spear13xx.c +19 -0
@@ -37,6 +37,25 @@ struct amba_device spear13xx_uart_device = { .irq = {IRQ_UART, NO_IRQ}, }; +/* rtc device registration */ +static struct resource rtc_resources[] = { + { + .start =SPEAR13XX_RTC_BASE , + .end =SPEAR13XX_RTC_BASE +SZ_4K -1 , + .flags =IORESOURCE_MEM , + }, { + .start =IRQ_RTC , + .flags =IORESOURCE_IRQ , + }, +}; + +struct platform_device spear13xx_rtc_device = { + .name ="rtc-spear" , + .id =-1 , + .num_resources =ARRAY_SIZE (rtc_resources), + .resource = rtc_resources, +}; +/* Do spear13xx familiy common initialization part here */ void __init spear13xx_init (void ) {
arch/arm/mach-spear3xx/include/mach/generic.h +1 -0
@@ -33,6 +33,7 @@/* Add spear3xx family device structure declarations here */ extern struct amba_device gpio_device;extern struct amba_device uart_device; +extern struct platform_device rtc_device;extern struct sys_timer spear3xx_timer;/* Add spear3xx family function declarations here */
arch/arm/mach-spear3xx/spear300_evb.c +1 -0
@@ -44,6 +44,7 @@ static struct amba_device *amba_devs[] __initdata = {static struct platform_device *plat_devs[]__initdata = {/* spear3xx specific devices */ + &rtc_device,/* spear300 specific devices */ };
arch/arm/mach-spear3xx/spear310_evb.c +1 -0
@@ -50,6 +50,7 @@ static struct amba_device *amba_devs[] __initdata = {static struct platform_device *plat_devs[]__initdata = {/* spear3xx specific devices */ + &rtc_device,/* spear310 specific devices */ &plgpio_device,
arch/arm/mach-spear3xx/spear320_evb.c +1 -0
@@ -48,6 +48,7 @@ static struct amba_device *amba_devs[] __initdata = {static struct platform_device *plat_devs[]__initdata = {/* spear3xx specific devices */ + &rtc_device,/* spear320 specific devices */ &plgpio_device,
arch/arm/mach-spear3xx/spear3xx.c +19 -0
@@ -54,6 +54,25 @@ struct amba_device uart_device = { .irq = {IRQ_UART, NO_IRQ}, }; +/* rtc device registration */ +static struct resource rtc_resources[] = { + { + .start =SPEAR3XX_ICM3_RTC_BASE , + .end =SPEAR3XX_ICM3_RTC_BASE +SZ_4K -1 , + .flags =IORESOURCE_MEM , + }, { + .start =IRQ_BASIC_RTC , + .flags =IORESOURCE_IRQ , + }, +}; + +struct platform_device rtc_device = { + .name ="rtc-spear" , + .id =-1 , + .num_resources =ARRAY_SIZE (rtc_resources), + .resource = rtc_resources, +}; +/* Do spear3xx familiy common initialization part here */ void __init spear3xx_init (void ) {
arch/arm/mach-spear6xx/include/mach/generic.h +1 -0
@@ -32,6 +32,7 @@extern struct amba_device clcd_device;extern struct amba_device gpio_device[];extern struct amba_device uart_device[]; +extern struct platform_device rtc_device;extern struct sys_timer spear6xx_timer;/* Add spear6xx family function declarations here */
arch/arm/mach-spear6xx/spear600_evb.c +1 -0
@@ -26,6 +26,7 @@ static struct amba_device *amba_devs[] __initdata = { };static struct platform_device *plat_devs[]__initdata = { + &rtc_device, };static void __init spear600_evb_init (void )
arch/arm/mach-spear6xx/spear6xx.c +19 -0
@@ -121,6 +121,25 @@ struct amba_device gpio_device[] = { } }; +/* rtc device registration */ +static struct resource rtc_resources[] = { + { + .start =SPEAR6XX_ICM3_RTC_BASE , + .end =SPEAR6XX_ICM3_RTC_BASE +SZ_4K -1 , + .flags =IORESOURCE_MEM , + }, { + .start =IRQ_BASIC_RTC , + .flags =IORESOURCE_IRQ , + }, +}; + +struct platform_device rtc_device = { + .name ="rtc-spear" , + .id =-1 , + .num_resources =ARRAY_SIZE (rtc_resources), + .resource = rtc_resources, +}; +/* This will add devices, and do machine specific tasks */ void __init spear6xx_init (void ) {
Signature · 1 line
1.7.2.2
PATCH v4 18/62 ST SPEAr: adding support for synopsis i2c designware
In reply to Viresh KumarFrom: Rajeev Kumar <[email protected]>
--- arch/arm/mach-spear13xx/include/mach/generic.h | 2 + arch/arm/mach-spear13xx/spear1300_evb.c | 4 +++ arch/arm/mach-spear13xx/spear13xx.c | 23 +++++++++++++++++++ arch/arm/mach-spear3xx/include/mach/generic.h | 3 ++ arch/arm/mach-spear3xx/include/mach/irqs.h | 2 +- arch/arm/mach-spear3xx/spear300_evb.c | 4 +++ arch/arm/mach-spear3xx/spear310_evb.c | 4 +++ arch/arm/mach-spear3xx/spear320.c | 24 +++++++++++++++++++- arch/arm/mach-spear3xx/spear320_evb.c | 5 ++++ arch/arm/mach-spear3xx/spear3xx.c | 22 ++++++++++++++++++ arch/arm/mach-spear6xx/include/mach/generic.h | 2 + arch/arm/mach-spear6xx/spear600_evb.c | 4 +++ arch/arm/mach-spear6xx/spear6xx.c | 22 ++++++++++++++++++ arch/arm/plat-spear/Makefile | 6 +++++ arch/arm/plat-spear/i2c_eval_board.c | 29 ++++++++++++++++++++++++ 15 files changed, 154 insertions(+), 2 deletions(-) create mode 100644 arch/arm/plat-spear/i2c_eval_board.c
arch/arm/mach-spear13xx/include/mach/generic.h +2 -0
@@ -30,6 +30,7 @@/* Add spear13xx family device structure declarations here */ extern struct amba_device spear13xx_uart_device; +extern struct platform_device spear13xx_i2c_device;extern struct platform_device spear13xx_rtc_device;extern struct sys_timer spear13xx_timer;
@@ -37,6 +38,7 @@ extern struct sys_timer spear13xx_timer;/* Add spear13xx family function declarations here */ void __init clk_init (void ); +void __init i2c_register_default_devices (void );void __init spear_setup_timer (void );void __init spear1300_init (void );void __init spear13xx_map_io (void );
arch/arm/mach-spear13xx/spear1300_evb.c +4 -0
@@ -22,6 +22,7 @@ static struct amba_device *amba_devs[] __initdata = { };static struct platform_device *plat_devs[]__initdata = { + &spear13xx_i2c_device, &spear13xx_rtc_device, };
@@ -32,6 +33,9 @@ static void __init spear1300_evb_init(void)/* call spear1300 machine init function */ spear1300_init (); +/* Register slave devices on the I2C buses */ +i2c_register_default_devices (); +/* Add Platform Devices */ platform_add_devices (plat_devs,ARRAY_SIZE (plat_devs));
arch/arm/mach-spear13xx/spear13xx.c +23 -0
@@ -24,6 +24,7 @@#include <mach/hardware.h> /* Add spear13xx machines common devices here */ +/* uart device registeration */ struct amba_device spear13xx_uart_device = { .dev = {
@@ -37,6 +38,28 @@ struct amba_device spear13xx_uart_device = { .irq = {IRQ_UART, NO_IRQ}, }; +/* i2c device registeration */ +static struct resource i2c_resources[] = { + { + .start = SPEAR13XX_I2C_BASE, + .end = SPEAR13XX_I2C_BASE + SZ_4K - 1, + .flags = IORESOURCE_MEM, + }, { + .start = IRQ_I2C, + .flags = IORESOURCE_IRQ, + }, +}; + +struct platform_device spear13xx_i2c_device = { + .name = "i2c_designware", + .id = 0, + .dev = { + .coherent_dma_mask = ~0, + }, + .num_resources = ARRAY_SIZE(i2c_resources), + .resource = i2c_resources, +}; + /* rtc device registration */ static struct resource rtc_resources[] = { {
arch/arm/mach-spear3xx/include/mach/generic.h +3 -0
@@ -33,11 +33,13 @@/* Add spear3xx family device structure declarations here */ extern struct amba_device gpio_device;extern struct amba_device uart_device; +extern struct platform_device i2c_device;extern struct platform_device rtc_device;extern struct sys_timer spear3xx_timer;/* Add spear3xx family function declarations here */ void __init clk_init (void ); +void __init i2c_register_default_devices (void );void __init spear_setup_timer (void );void __init spear3xx_map_io (void );void __init spear3xx_init_irq (void );
@@ -166,6 +168,7 @@ void __init spear310_init(void);#ifdef CONFIG_MACH_SPEAR320 /* Add spear320 machine device structure declarations here */ extern struct amba_device clcd_device; +extern struct platform_device i2c1_device;extern struct platform_device plgpio_device;/* pad mux modes */
arch/arm/mach-spear3xx/include/mach/irqs.h +1 -1
@@ -133,7 +133,7 @@#define VIRQ_MII1_SMII1 (VIRQ_START + 13)#define VIRQ_WAKEUP_SMII0 (VIRQ_START + 14)#define VIRQ_WAKEUP_MII1_SMII1 (VIRQ_START + 15) -#define VIRQ_I2C (VIRQ_START + 16) +#define VIRQ_I2C1 (VIRQ_START + 16)/* GPIO pins virtual irqs */ #define SPEAR_GPIO_INT_BASE (VIRQ_START + 17)
arch/arm/mach-spear3xx/spear300_evb.c +4 -0
@@ -44,6 +44,7 @@ static struct amba_device *amba_devs[] __initdata = {static struct platform_device *plat_devs[]__initdata = {/* spear3xx specific devices */ + &i2c_device, &rtc_device,/* spear300 specific devices */
@@ -61,6 +62,9 @@ static void __init spear300_evb_init(void)/* call spear300 machine init function */ spear300_init (); +/* Register slave devices on the I2C buses */ +i2c_register_default_devices (); +/* Add Platform Devices */ platform_add_devices (plat_devs,ARRAY_SIZE (plat_devs));
arch/arm/mach-spear3xx/spear310_evb.c +4 -0
@@ -50,6 +50,7 @@ static struct amba_device *amba_devs[] __initdata = {static struct platform_device *plat_devs[]__initdata = {/* spear3xx specific devices */ + &i2c_device, &rtc_device,/* spear310 specific devices */
@@ -68,6 +69,9 @@ static void __init spear310_evb_init(void)/* call spear310 machine init function */ spear310_init (); +/* Register slave devices on the I2C buses */ +i2c_register_default_devices (); +/* Add Platform Devices */ platform_add_devices (plat_devs,ARRAY_SIZE (plat_devs));
arch/arm/mach-spear3xx/spear320.c +23 -1
@@ -402,6 +402,28 @@ struct amba_device clcd_device = { .irq = {VIRQ_CLCD, NO_IRQ}, }; +/* i2c1 device registeration */ +static struct resource i2c1_resources[] = { + { + .start =SPEAR320_I2C_BASE , + .end =SPEAR320_I2C_BASE +SZ_4K -1 , + .flags =IORESOURCE_MEM , + }, { + .start =VIRQ_I2C1 , + .flags =IORESOURCE_IRQ , + }, +}; + +struct platform_device i2c1_device = { + .name ="i2c_designware" , + .id =1 , + .dev = { + .coherent_dma_mask = ~0 , + }, + .num_resources =ARRAY_SIZE (i2c1_resources), + .resource = i2c1_resources, +}; +/* plgpio device registeration */ static struct plgpio_platform_data plgpio_plat_data = { .gpio_base = 8,
@@ -535,7 +557,7 @@ struct shirq_dev_config shirq_intrcomm_ras_config[] = { .status_mask = WAKEUP_MII1_SMII1_IRQ_MASK, .clear_mask = WAKEUP_MII1_SMII1_IRQ_MASK, }, { - .virq = VIRQ_I2C, + .virq = VIRQ_I2C1, .status_mask = I2C1_IRQ_MASK, .clear_mask = I2C1_IRQ_MASK, },
arch/arm/mach-spear3xx/spear320_evb.c +5 -0
@@ -48,9 +48,11 @@ static struct amba_device *amba_devs[] __initdata = {static struct platform_device *plat_devs[]__initdata = {/* spear3xx specific devices */ + &i2c_device, &rtc_device,/* spear320 specific devices */ + &i2c1_device, &plgpio_device, };
@@ -66,6 +68,9 @@ static void __init spear320_evb_init(void)/* call spear320 machine init function */ spear320_init (); +/* Register slave devices on the I2C buses */ +i2c_register_default_devices (); +/* Add Platform Devices */ platform_add_devices (plat_devs,ARRAY_SIZE (plat_devs));
arch/arm/mach-spear3xx/spear3xx.c +22 -0
@@ -54,6 +54,28 @@ struct amba_device uart_device = { .irq = {IRQ_UART, NO_IRQ}, }; +/* i2c device registeration */ +static struct resource i2c_resources[] = { + { + .start = SPEAR3XX_ICM1_I2C_BASE, + .end = SPEAR3XX_ICM1_I2C_BASE + SZ_4K - 1, + .flags = IORESOURCE_MEM, + }, { + .start = IRQ_I2C, + .flags = IORESOURCE_IRQ, + }, +}; + +struct platform_device i2c_device = { + .name = "i2c_designware", + .id = 0, + .dev = { + .coherent_dma_mask = ~0, + }, + .num_resources = ARRAY_SIZE(i2c_resources), + .resource = i2c_resources, +}; + /* rtc device registration */ static struct resource rtc_resources[] = { {
arch/arm/mach-spear6xx/include/mach/generic.h +2 -0
@@ -32,10 +32,12 @@extern struct amba_device clcd_device;extern struct amba_device gpio_device[];extern struct amba_device uart_device[]; +extern struct platform_device i2c_device;extern struct platform_device rtc_device;extern struct sys_timer spear6xx_timer;/* Add spear6xx family function declarations here */ +void __init i2c_register_default_devices (void );void __init spear_setup_timer (void );void __init spear6xx_map_io (void );void __init spear6xx_init_irq (void );
arch/arm/mach-spear6xx/spear600_evb.c +4 -0
@@ -26,6 +26,7 @@ static struct amba_device *amba_devs[] __initdata = { };static struct platform_device *plat_devs[]__initdata = { + &i2c_device, &rtc_device, };
@@ -36,6 +37,9 @@ static void __init spear600_evb_init(void)/* call spear600 machine init function */ spear600_init (); +/* Register slave devices on the I2C buses */ +i2c_register_default_devices (); +/* Add Platform Devices */ platform_add_devices (plat_devs,ARRAY_SIZE (plat_devs));
arch/arm/mach-spear6xx/spear6xx.c +22 -0
@@ -121,6 +121,28 @@ struct amba_device gpio_device[] = { } }; +/* i2c device registeration */ +static struct resource i2c_resources[] = { + { + .start =SPEAR6XX_ICM1_I2C_BASE , + .end =SPEAR6XX_ICM1_I2C_BASE +SZ_4K -1 , + .flags =IORESOURCE_MEM , + }, { + .start =IRQ_I2C , + .flags =IORESOURCE_IRQ , + }, +}; + +struct platform_device i2c_device = { + .name ="i2c_designware" , + .id =0 , + .dev = { + .coherent_dma_mask = ~0 , + }, + .num_resources =ARRAY_SIZE (i2c_resources), + .resource = i2c_resources, +}; +/* rtc device registration */ static struct resource rtc_resources[] = { {
arch/arm/plat-spear/Makefile +6 -0
@@ -8,3 +8,9 @@ obj-y := clcd.o clock.o time.o obj-$(CONFIG_ARCH_SPEAR3XX) += shirq.o padmux.o obj-$(CONFIG_MACH_SPEAR310) += plgpio.o obj-$(CONFIG_MACH_SPEAR320) += plgpio.o + +obj-$(CONFIG_BOARD_SPEAR1300_EVB) += i2c_eval_board.o +obj-$(CONFIG_BOARD_SPEAR300_EVB) += i2c_eval_board.o +obj-$(CONFIG_BOARD_SPEAR310_EVB) += i2c_eval_board.o +obj-$(CONFIG_BOARD_SPEAR320_EVB) += i2c_eval_board.o +obj-$(CONFIG_BOARD_SPEAR600_EVB) += i2c_eval_board.o
arch/arm/plat-spear/i2c_eval_board.c new file +29 -0
@@ -0,0 +1,29 @@ +/* +* arch/arm/plat-spear/i2c_eval_board.c +* +* Copyright (C) 2010 ST Microelectronics +* Rajeev Kumar<[email protected]> +* +* This file is licensed under the terms of the GNU General Public +* License version 2. This program is licensed "as is" without any +* warranty of any kind, whether express or implied. +*/ + +#include <linux/i2c.h> +#include <linux/kernel.h> + +static struct i2c_board_info __initdata i2c_board_info[] = { + { + .type ="eeprom" , + .addr =0x50 , + }, { + .type ="eeprom" , + .addr =0x51 , + }, +}; + +void __init i2c_register_default_devices (void ) +{ +i2c_register_board_info (0 , i2c_board_info, +ARRAY_SIZE (i2c_board_info)); +}
Signature · 1 line
1.7.2.2
PATCH v4 19/62 ST SPEAr: Adding machine support for USB host
In reply to Viresh KumarFrom: Deepak Sikri <[email protected]>
--- arch/arm/mach-spear13xx/include/mach/generic.h | 4 + arch/arm/mach-spear13xx/spear1300_evb.c | 4 + arch/arm/mach-spear13xx/spear13xx.c | 106 +++++++++++++++++++++++ arch/arm/mach-spear3xx/include/mach/generic.h | 3 + arch/arm/mach-spear3xx/spear300_evb.c | 3 + arch/arm/mach-spear3xx/spear310_evb.c | 3 + arch/arm/mach-spear3xx/spear320_evb.c | 3 + arch/arm/mach-spear3xx/spear3xx.c | 80 +++++++++++++++++ arch/arm/mach-spear6xx/include/mach/generic.h | 4 + arch/arm/mach-spear6xx/spear600_evb.c | 4 + arch/arm/mach-spear6xx/spear6xx.c | 108 ++++++++++++++++++++++++ 11 files changed, 322 insertions(+), 0 deletions(-)
arch/arm/mach-spear13xx/include/mach/generic.h +4 -0
@@ -30,7 +30,11 @@/* Add spear13xx family device structure declarations here */ extern struct amba_device spear13xx_uart_device; +extern struct platform_device spear13xx_ehci0_device; +extern struct platform_device spear13xx_ehci1_device;extern struct platform_device spear13xx_i2c_device; +extern struct platform_device spear13xx_ohci0_device; +extern struct platform_device spear13xx_ohci1_device;extern struct platform_device spear13xx_rtc_device;extern struct sys_timer spear13xx_timer;
arch/arm/mach-spear13xx/spear1300_evb.c +4 -0
@@ -22,7 +22,11 @@ static struct amba_device *amba_devs[] __initdata = { };static struct platform_device *plat_devs[]__initdata = { + &spear13xx_ehci0_device, + &spear13xx_ehci1_device, &spear13xx_i2c_device, + &spear13xx_ohci0_device, + &spear13xx_ohci1_device, &spear13xx_rtc_device, };
arch/arm/mach-spear13xx/spear13xx.c +106 -0
112 lines not on this page · raw message
arch/arm/mach-spear3xx/include/mach/generic.h +3 -0
@@ -33,7 +33,10 @@/* Add spear3xx family device structure declarations here */ extern struct amba_device gpio_device;extern struct amba_device uart_device; +extern struct platform_device ehci_device;extern struct platform_device i2c_device; +extern struct platform_device ohci0_device; +extern struct platform_device ohci1_device;extern struct platform_device rtc_device;extern struct sys_timer spear3xx_timer;
arch/arm/mach-spear3xx/spear300_evb.c +3 -0
@@ -44,7 +44,10 @@ static struct amba_device *amba_devs[] __initdata = {static struct platform_device *plat_devs[]__initdata = {/* spear3xx specific devices */ + &ehci_device, &i2c_device, + &ohci0_device, + &ohci1_device, &rtc_device,/* spear300 specific devices */
arch/arm/mach-spear3xx/spear310_evb.c +3 -0
@@ -50,7 +50,10 @@ static struct amba_device *amba_devs[] __initdata = {static struct platform_device *plat_devs[]__initdata = {/* spear3xx specific devices */ + &ehci_device, &i2c_device, + &ohci0_device, + &ohci1_device, &rtc_device,/* spear310 specific devices */
arch/arm/mach-spear3xx/spear320_evb.c +3 -0
@@ -48,7 +48,10 @@ static struct amba_device *amba_devs[] __initdata = {static struct platform_device *plat_devs[]__initdata = {/* spear3xx specific devices */ + &ehci_device, &i2c_device, + &ohci0_device, + &ohci1_device, &rtc_device,/* spear320 specific devices */
arch/arm/mach-spear3xx/spear3xx.c +80 -0
86 lines not on this page · raw message
arch/arm/mach-spear6xx/include/mach/generic.h +4 -0
@@ -32,7 +32,11 @@extern struct amba_device clcd_device;extern struct amba_device gpio_device[];extern struct amba_device uart_device[]; +extern struct platform_device ehci0_device; +extern struct platform_device ehci1_device;extern struct platform_device i2c_device; +extern struct platform_device ohci0_device; +extern struct platform_device ohci1_device;extern struct platform_device rtc_device;extern struct sys_timer spear6xx_timer;
arch/arm/mach-spear6xx/spear600_evb.c +4 -0
@@ -26,7 +26,11 @@ static struct amba_device *amba_devs[] __initdata = { };static struct platform_device *plat_devs[]__initdata = { + &ehci0_device, + &ehci1_device, &i2c_device, + &ohci0_device, + &ohci1_device, &rtc_device, };
arch/arm/mach-spear6xx/spear6xx.c +108 -0
114 lines not on this page · raw message
Signature · 1 line
1.7.2.2
PATCH v4 20/62 ST SPEAr: Adding machine support for keyboard
In reply to Viresh KumarFrom: Rajeev Kumar <[email protected]>
--- arch/arm/mach-spear13xx/include/mach/generic.h | 1 + arch/arm/mach-spear13xx/spear1300_evb.c | 17 +++++++++++++++++ arch/arm/mach-spear13xx/spear13xx.c | 19 +++++++++++++++++++ arch/arm/mach-spear3xx/include/mach/generic.h | 1 + arch/arm/mach-spear3xx/spear300.c | 19 +++++++++++++++++++ arch/arm/mach-spear3xx/spear300_evb.c | 17 +++++++++++++++++ 6 files changed, 74 insertions(+), 0 deletions(-)
arch/arm/mach-spear13xx/include/mach/generic.h +1 -0
@@ -33,6 +33,7 @@ extern struct amba_device spear13xx_uart_device;extern struct platform_device spear13xx_ehci0_device;extern struct platform_device spear13xx_ehci1_device;extern struct platform_device spear13xx_i2c_device; +extern struct platform_device spear13xx_kbd_device;extern struct platform_device spear13xx_ohci0_device;extern struct platform_device spear13xx_ohci1_device;extern struct platform_device spear13xx_rtc_device;
arch/arm/mach-spear13xx/spear1300_evb.c +17 -0
@@ -16,6 +16,7 @@#include <asm/mach-types.h> #include <mach/generic.h> #include <mach/spear.h> +#include <plat/keyboard.h> static struct amba_device *amba_devs[]__initdata = { &spear13xx_uart_device,
@@ -25,15 +26,31 @@ static struct platform_device *plat_devs[] __initdata = { &spear13xx_ehci0_device, &spear13xx_ehci1_device, &spear13xx_i2c_device, + &spear13xx_kbd_device, &spear13xx_ohci0_device, &spear13xx_ohci1_device, &spear13xx_rtc_device, }; +/* keyboard specific platform data */ +static DECLARE_KEYMAP (keymap); +static struct matrix_keymap_data keymap_data = { + .keymap = keymap, + .keymap_size =ARRAY_SIZE (keymap), +}; + +static struct kbd_platform_data kbd_data = { + .keymap = &keymap_data, + .rep =1 , +}; +static void __init spear1300_evb_init (void ) {unsigned int i; +/* set keyboard plat data */ +kbd_set_plat_data (&spear13xx_kbd_device, &kbd_data); +/* call spear1300 machine init function */ spear1300_init ();
arch/arm/mach-spear13xx/spear13xx.c +19 -0
@@ -166,6 +166,25 @@ struct platform_device spear13xx_ohci1_device = { .resource = ohci1_resources, }; +/* keyboard device registration */ +static struct resource kbd_resources[] = { + { + .start =SPEAR13XX_KBD_BASE , + .end =SPEAR13XX_KBD_BASE +SZ_1K -1 , + .flags =IORESOURCE_MEM , + }, { + .start =IRQ_KBD , + .flags =IORESOURCE_IRQ , + }, +}; + +struct platform_device spear13xx_kbd_device = { + .name ="keyboard" , + .id =-1 , + .num_resources =ARRAY_SIZE (kbd_resources), + .resource = kbd_resources, +}; +/* rtc device registration */ static struct resource rtc_resources[] = { {
arch/arm/mach-spear3xx/include/mach/generic.h +1 -0
@@ -108,6 +108,7 @@ extern struct pmx_driver pmx_driver;/* Add spear300 machine device structure declarations here */ extern struct amba_device clcd_device;extern struct amba_device gpio1_device; +extern struct platform_device kbd_device;/* pad mux modes */ extern struct pmx_mode nand_mode;
arch/arm/mach-spear3xx/spear300.c +19 -0
@@ -407,6 +407,25 @@ struct amba_device gpio1_device = { .irq = {VIRQ_GPIO1, NO_IRQ}, }; +/* keyboard device registration */ +static struct resource kbd_resources[] = { + { + .start = SPEAR300_KEYBOARD_BASE, + .end = SPEAR300_KEYBOARD_BASE + SZ_1K - 1, + .flags = IORESOURCE_MEM, + }, { + .start = VIRQ_KEYBOARD, + .flags = IORESOURCE_IRQ, + }, +}; + +struct platform_device kbd_device = { + .name = "keyboard", + .id = -1, + .num_resources = ARRAY_SIZE(kbd_resources), + .resource = kbd_resources, +}; + /* spear3xx shared irq */ struct shirq_dev_config shirq_ras1_config[] = { {
arch/arm/mach-spear3xx/spear300_evb.c +17 -0
@@ -15,6 +15,7 @@#include <asm/mach-types.h> #include <mach/generic.h> #include <mach/spear.h> +#include <plat/keyboard.h> /* padmux devices to enable */ static struct pmx_dev *pmx_devs[] = {
@@ -51,6 +52,19 @@ static struct platform_device *plat_devs[] __initdata = { &rtc_device,/* spear300 specific devices */ + &kbd_device, +}; + +/* keyboard specific platform data */ +static DECLARE_KEYMAP (keymap); +static struct matrix_keymap_data keymap_data = { + .keymap = keymap, + .keymap_size =ARRAY_SIZE (keymap), +}; + +static struct kbd_platform_data kbd_data = { + .keymap = &keymap_data, + .rep =1 , };static void __init spear300_evb_init (void )
@@ -62,6 +76,9 @@ static void __init spear300_evb_init(void) pmx_driver.devs = pmx_devs; pmx_driver.devs_count =ARRAY_SIZE (pmx_devs); +/* set keyboard plat data */ +kbd_set_plat_data (&kbd_device, &kbd_data); +/* call spear300 machine init function */ spear300_init ();
Signature · 1 line
1.7.2.2
PATCH v4 21/62 ST SPEAr: Added ARM PL061 GPIO Support on SPEAr13xx and modified resource size
In reply to Viresh Kumar--- arch/arm/mach-spear13xx/include/mach/generic.h | 1 + arch/arm/mach-spear13xx/include/mach/gpio.h | 18 +++++++++++ arch/arm/mach-spear13xx/include/mach/irqs.h | 10 ++++++- arch/arm/mach-spear13xx/include/mach/spear.h | 4 +- arch/arm/mach-spear13xx/spear1300_evb.c | 2 + arch/arm/mach-spear13xx/spear13xx.c | 37 ++++++++++++++++++++++++ arch/arm/mach-spear3xx/spear300.c | 2 +- arch/arm/mach-spear3xx/spear3xx.c | 2 +- arch/arm/mach-spear6xx/spear6xx.c | 9 ++---- 9 files changed, 74 insertions(+), 11 deletions(-)
arch/arm/mach-spear13xx/include/mach/generic.h +1 -0
@@ -29,6 +29,7 @@#define SPEAR_GPT0_CHAN1_IRQ IRQ_GPT0_TMR1/* Add spear13xx family device structure declarations here */ +extern struct amba_device spear13xx_gpio_device[];extern struct amba_device spear13xx_uart_device;extern struct platform_device spear13xx_ehci0_device;extern struct platform_device spear13xx_ehci1_device;
arch/arm/mach-spear13xx/include/mach/gpio.h +18 -0
@@ -16,4 +16,22 @@#include <plat/gpio.h> +#define GPIO0_0 0 +#define GPIO0_1 1 +#define GPIO0_2 2 +#define GPIO0_3 3 +#define GPIO0_4 4 +#define GPIO0_5 5 +#define GPIO0_6 6 +#define GPIO0_7 7 + +#define GPIO1_0 8 +#define GPIO1_1 9 +#define GPIO1_2 10 +#define GPIO1_3 11 +#define GPIO1_4 12 +#define GPIO1_5 13 +#define GPIO1_6 14 +#define GPIO1_7 15 +#endif /* __MACH_GPIO_H */
arch/arm/mach-spear13xx/include/mach/irqs.h +9 -1
@@ -86,6 +86,14 @@#define IRQ_GIC_END (IRQ_SHPI_START + 128) -#define NR_IRQS IRQ_GIC_END +#define VIRQ_START IRQ_GIC_END + +/* GPIO pins virtual irqs */ +#define SPEAR_GPIO0_INT_BASE (VIRQ_START + 0) +#define SPEAR_GPIO1_INT_BASE (SPEAR_GPIO0_INT_BASE + 8) +#define SPEAR_GPIO_INT_END (SPEAR_GPIO1_INT_BASE + 8) + +#define VIRQ_END SPEAR_GPIO_INT_END +#define NR_IRQS VIRQ_END#endif /* __MACH_IRQS_H */
arch/arm/mach-spear13xx/include/mach/spear.h +2 -2
@@ -43,8 +43,8 @@#define SPEAR13XX_GPT2_BASE 0xE0480000#define SPEAR13XX_GPT3_BASE 0xE0500000#define SPEAR13XX_RTC_BASE 0xE0580000 -#define SPEAR13XX_GPIOA_BASE 0xE0600000 -#define SPEAR13XX_GPIOB_BASE 0xE0680000 +#define SPEAR13XX_GPIO0_BASE 0xE0600000 +#define SPEAR13XX_GPIO1_BASE 0xE0680000#define SPEAR13XX_MISC_BASE 0xE0700000#define VA_SPEAR13XX_MISC_BASE IO_ADDRESS(SPEAR13XX_MISC_BASE)
arch/arm/mach-spear13xx/spear1300_evb.c +2 -0
@@ -19,6 +19,8 @@#include <plat/keyboard.h> static struct amba_device *amba_devs[]__initdata = { + &spear13xx_gpio_device[0 ], + &spear13xx_gpio_device[1 ], &spear13xx_uart_device, };
arch/arm/mach-spear13xx/spear13xx.c +37 -0
@@ -12,6 +12,7 @@*/ #include <linux/types.h> +#include <linux/amba/pl061.h> #include <linux/ptrace.h> #include <linux/io.h> #include <asm/hardware/gic.h>
@@ -24,6 +25,42 @@#include <mach/hardware.h> /* Add spear13xx machines common devices here */ +/* gpio device registeration */ +static struct pl061_platform_data gpio_plat_data[] = { + { + .gpio_base =0 , + .irq_base =SPEAR_GPIO0_INT_BASE , + }, { + .gpio_base =8 , + .irq_base =SPEAR_GPIO1_INT_BASE , + }, +}; + +struct amba_device spear13xx_gpio_device[] = { + { + .dev = { + .init_name ="gpio0" , + .platform_data = &gpio_plat_data[0 ], + }, + .res = { + .start =SPEAR13XX_GPIO0_BASE , + .end =SPEAR13XX_GPIO0_BASE +SZ_4K -1 , + .flags =IORESOURCE_MEM , + }, + .irq = {IRQ_GPIO0 ,NO_IRQ }, + }, { + .dev = { + .init_name ="gpio1" , + .platform_data = &gpio_plat_data[1 ], + }, + .res = { + .start =SPEAR13XX_GPIO1_BASE , + .end =SPEAR13XX_GPIO1_BASE +SZ_4K -1 , + .flags =IORESOURCE_MEM , + }, + .irq = {IRQ_GPIO1 ,NO_IRQ }, + } +};/* uart device registeration */ struct amba_device spear13xx_uart_device = {
arch/arm/mach-spear3xx/spear300.c +1 -1
@@ -401,7 +401,7 @@ struct amba_device gpio1_device = { }, .res = { .start = SPEAR300_GPIO_BASE, - .end = SPEAR300_GPIO_BASE + SPEAR300_GPIO_SIZE - 1, + .end = SPEAR300_GPIO_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, .irq = {VIRQ_GPIO1, NO_IRQ},
arch/arm/mach-spear3xx/spear3xx.c +1 -1
@@ -35,7 +35,7 @@ struct amba_device gpio_device = { }, .res = { .start = SPEAR3XX_ICM3_GPIO_BASE, - .end = SPEAR3XX_ICM3_GPIO_BASE + SPEAR3XX_ICM3_GPIO_SIZE - 1, + .end = SPEAR3XX_ICM3_GPIO_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, .irq = {IRQ_BASIC_GPIO, NO_IRQ},
arch/arm/mach-spear6xx/spear6xx.c +3 -6
@@ -89,8 +89,7 @@ struct amba_device gpio_device[] = { }, .res = { .start = SPEAR6XX_CPU_GPIO_BASE, - .end = SPEAR6XX_CPU_GPIO_BASE + - SPEAR6XX_CPU_GPIO_SIZE - 1, + .end = SPEAR6XX_CPU_GPIO_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, .irq = {IRQ_LOCAL_GPIO, NO_IRQ},
@@ -101,8 +100,7 @@ struct amba_device gpio_device[] = { }, .res = { .start = SPEAR6XX_ICM3_GPIO_BASE, - .end = SPEAR6XX_ICM3_GPIO_BASE + - SPEAR6XX_ICM3_GPIO_SIZE - 1, + .end = SPEAR6XX_ICM3_GPIO_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, .irq = {IRQ_BASIC_GPIO, NO_IRQ},
@@ -113,8 +111,7 @@ struct amba_device gpio_device[] = { }, .res = { .start = SPEAR6XX_ICM2_GPIO_BASE, - .end = SPEAR6XX_ICM2_GPIO_BASE + - SPEAR6XX_ICM2_GPIO_SIZE - 1, + .end = SPEAR6XX_ICM2_GPIO_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, .irq = {IRQ_APPL_GPIO, NO_IRQ},
Signature · 1 line
1.7.2.2
PATCH v4 22/62 ST SPEAr: Adding support for ST's PWM IP
In reply to Viresh Kumar--- arch/arm/mach-spear3xx/include/mach/generic.h | 1 + arch/arm/mach-spear3xx/spear320.c | 17 + arch/arm/mach-spear3xx/spear320_evb.c | 1 + arch/arm/plat-spear/Kconfig | 7 + arch/arm/plat-spear/Makefile | 1 + arch/arm/plat-spear/pwm.c | 484 +++++++++++++++++++++++++ 6 files changed, 511 insertions(+), 0 deletions(-) create mode 100644 arch/arm/plat-spear/pwm.c
arch/arm/mach-spear3xx/include/mach/generic.h +1 -0
@@ -174,6 +174,7 @@ void __init spear310_init(void);extern struct amba_device clcd_device;extern struct platform_device i2c1_device;extern struct platform_device plgpio_device; +extern struct platform_device pwm_device;/* pad mux modes */ extern struct pmx_mode auto_net_smii_mode;
arch/arm/mach-spear3xx/spear320.c +17 -0
@@ -452,6 +452,23 @@ struct platform_device plgpio_device = { .resource = plgpio_resources, }; +/* pwm device registeration */ +static struct resource pwm_resources[] = { + { + .start =SPEAR320_PWM_BASE , + .end =SPEAR320_PWM_BASE +SZ_4K -1 , + .flags =IORESOURCE_MEM , + }, +}; + +struct platform_device pwm_device = { + .name ="pwm" , + .id =-1 , + .num_resources =ARRAY_SIZE (pwm_resources), + .resource = pwm_resources, +}; + +/* spear3xx shared irq */ struct shirq_dev_config shirq_ras1_config[] = { {
arch/arm/mach-spear3xx/spear320_evb.c +1 -0
@@ -57,6 +57,7 @@ static struct platform_device *plat_devs[] __initdata = {/* spear320 specific devices */ &i2c1_device, &plgpio_device, + &pwm_device, };static void __init spear320_evb_init (void )
arch/arm/plat-spear/Kconfig +7 -0
@@ -36,4 +36,11 @@ source "arch/arm/mach-spear13xx/Kconfig" source "arch/arm/mach-spear3xx/Kconfig" source "arch/arm/mach-spear6xx/Kconfig" +config SPEAR_PWM + tristate "SPEAr Pulse Width Modulator" + depends on MACH_SPEAR320 + default y + help + Support for ST Microelectronics Pulse Width Modulator present on SPEAr Platform. + endif
arch/arm/plat-spear/Makefile +1 -0
@@ -8,6 +8,7 @@ obj-y := clcd.o clock.o time.o obj-$(CONFIG_ARCH_SPEAR3XX) += shirq.o padmux.o obj-$(CONFIG_MACH_SPEAR310) += plgpio.o obj-$(CONFIG_MACH_SPEAR320) += plgpio.o +obj-$(CONFIG_SPEAR_PWM) += pwm.o obj-$(CONFIG_BOARD_SPEAR1300_EVB) += i2c_eval_board.o obj-$(CONFIG_BOARD_SPEAR300_EVB) += i2c_eval_board.o
arch/arm/plat-spear/pwm.c new file +484 -0
484 lines not on this page · raw message
Signature · 1 line
1.7.2.2
PATCH v4 23/62 ST SPEAr: Adding Watchdog support
In reply to Viresh Kumar--- arch/arm/mach-spear3xx/include/mach/generic.h | 1 + arch/arm/mach-spear3xx/spear300_evb.c | 1 + arch/arm/mach-spear3xx/spear310_evb.c | 1 + arch/arm/mach-spear3xx/spear320_evb.c | 1 + arch/arm/mach-spear3xx/spear3xx.c | 12 ++++++++++++ arch/arm/mach-spear6xx/include/mach/generic.h | 1 + arch/arm/mach-spear6xx/spear600_evb.c | 1 + arch/arm/mach-spear6xx/spear6xx.c | 12 ++++++++++++ 8 files changed, 30 insertions(+), 0 deletions(-)
arch/arm/mach-spear3xx/include/mach/generic.h +1 -0
@@ -33,6 +33,7 @@/* Add spear3xx family device structure declarations here */ extern struct amba_device gpio_device;extern struct amba_device uart_device; +extern struct amba_device wdt_device;extern struct platform_device ehci_device;extern struct platform_device i2c_device;extern struct platform_device ohci0_device;
arch/arm/mach-spear3xx/spear300_evb.c +1 -0
@@ -37,6 +37,7 @@ static struct amba_device *amba_devs[] __initdata = {/* spear3xx specific devices */ &gpio_device, &uart_device, + &wdt_device,/* spear300 specific devices */ &clcd_device,
arch/arm/mach-spear3xx/spear310_evb.c +1 -0
@@ -44,6 +44,7 @@ static struct amba_device *amba_devs[] __initdata = {/* spear3xx specific devices */ &gpio_device, &uart_device, + &wdt_device, /* spear310 specific devices */ };
arch/arm/mach-spear3xx/spear320_evb.c +1 -0
@@ -41,6 +41,7 @@ static struct amba_device *amba_devs[] __initdata = {/* spear3xx specific devices */ &gpio_device, &uart_device, + &wdt_device,/* spear320 specific devices */ &clcd_device,
arch/arm/mach-spear3xx/spear3xx.c +12 -0
@@ -54,6 +54,18 @@ struct amba_device uart_device = { .irq = {IRQ_UART, NO_IRQ}, }; +/* watchdog device registeration */ +struct amba_device wdt_device = { + .dev = { + .init_name = "wdt", + }, + .res = { + .start = SPEAR3XX_ICM3_WDT_BASE, + .end = SPEAR3XX_ICM3_WDT_BASE + SZ_4K - 1, + .flags = IORESOURCE_MEM, + }, +}; + /* i2c device registeration */ static struct resource i2c_resources[] = { {
arch/arm/mach-spear6xx/include/mach/generic.h +1 -0
@@ -32,6 +32,7 @@extern struct amba_device clcd_device;extern struct amba_device gpio_device[];extern struct amba_device uart_device[]; +extern struct amba_device wdt_device;extern struct platform_device ehci0_device;extern struct platform_device ehci1_device;extern struct platform_device i2c_device;
arch/arm/mach-spear6xx/spear600_evb.c +1 -0
@@ -23,6 +23,7 @@ static struct amba_device *amba_devs[] __initdata = { &gpio_device[2 ], &uart_device[0 ], &uart_device[1 ], + &wdt_device, }; static struct platform_device *plat_devs[] __initdata = {
arch/arm/mach-spear6xx/spear6xx.c +12 -0
@@ -118,6 +118,18 @@ struct amba_device gpio_device[] = { } }; +/* watchdog device registeration */ +struct amba_device wdt_device = { + .dev = { + .init_name ="wdt" , + }, + .res = { + .start =SPEAR6XX_ICM3_WDT_BASE , + .end =SPEAR6XX_ICM3_WDT_BASE +SZ_4K -1 , + .flags =IORESOURCE_MEM , + }, +}; +/* i2c device registeration */ static struct resource i2c_resources[] = { {
Signature · 1 line
1.7.2.2
PATCH v4 24/62 ST SPEAr: Adding machine support for nand
In reply to Viresh KumarFrom: Vipin Kumar <[email protected]>
--- arch/arm/mach-spear13xx/include/mach/generic.h | 2 + arch/arm/mach-spear13xx/include/mach/misc_regs.h | 10 ++ arch/arm/mach-spear13xx/spear1300_evb.c | 9 ++ arch/arm/mach-spear13xx/spear13xx.c | 58 +++++++++++++ arch/arm/mach-spear3xx/include/mach/generic.h | 15 ++-- arch/arm/mach-spear3xx/include/mach/spear320.h | 3 + arch/arm/mach-spear3xx/spear300.c | 98 ++++++++++++++++++++++ arch/arm/mach-spear3xx/spear300_evb.c | 8 ++ arch/arm/mach-spear3xx/spear310.c | 26 ++++++ arch/arm/mach-spear3xx/spear310_evb.c | 8 ++ arch/arm/mach-spear3xx/spear320.c | 26 ++++++ arch/arm/mach-spear3xx/spear320_evb.c | 8 ++ arch/arm/mach-spear6xx/include/mach/generic.h | 1 + arch/arm/mach-spear6xx/spear600_evb.c | 8 ++ arch/arm/mach-spear6xx/spear6xx.c | 26 ++++++ arch/arm/plat-spear/include/plat/fsmc.h | 36 ++++++++ 16 files changed, 336 insertions(+), 6 deletions(-) create mode 100644 arch/arm/plat-spear/include/plat/fsmc.h
arch/arm/mach-spear13xx/include/mach/generic.h +2 -0
@@ -35,6 +35,7 @@ extern struct platform_device spear13xx_ehci0_device;extern struct platform_device spear13xx_ehci1_device;extern struct platform_device spear13xx_i2c_device;extern struct platform_device spear13xx_kbd_device; +extern struct platform_device spear13xx_nand_device;extern struct platform_device spear13xx_ohci0_device;extern struct platform_device spear13xx_ohci1_device;extern struct platform_device spear13xx_rtc_device;
@@ -50,6 +51,7 @@ void __init spear1300_init(void);void __init spear13xx_map_io (void );void __init spear13xx_init_irq (void );void __init spear13xx_init (void ); +void __init nand_mach_init (u32 busw);void spear13xx_secondary_startup (void );#endif /* __MACH_GENERIC_H */
arch/arm/mach-spear13xx/include/mach/misc_regs.h +10 -0
@@ -210,6 +210,16 @@#define CF_MMC_ACTIVE 0x2#define XD_MMC_ACTIVE 0x3#define FSMC_CFG ((unsigned int *)(MISC_BASE + 0x330)) +/* FSMC_CFG register masks */ +#define FSMC_MEMSEL_MASK 0x3 +#define FSMC_MEMSEL_SHIFT 0 +#define FSMC_MEM_NOR 0 +#define FSMC_MEM_NAND 1 +#define FSMC_MEM_SRAM 2 +#define NAND_BANK_MASK 0x3 +#define NAND_BANK_SHIFT 2 +#define NAND_DEV_WIDTH16 4 +#define MPMC_CTR_STS ((unsigned int *)(MISC_BASE + 0x334))/* Inter-Processor Communication Registers */
arch/arm/mach-spear13xx/spear1300_evb.c +9 -0
@@ -12,11 +12,14 @@*/ #include <linux/types.h> +#include <linux/mtd/nand.h> +#include <linux/mtd/fsmc.h> #include <asm/mach/arch.h> #include <asm/mach-types.h> #include <mach/generic.h> #include <mach/spear.h> #include <plat/keyboard.h> +#include <plat/fsmc.h> static struct amba_device *amba_devs[]__initdata = { &spear13xx_gpio_device[0 ],
@@ -29,6 +32,7 @@ static struct platform_device *plat_devs[] __initdata = { &spear13xx_ehci1_device, &spear13xx_i2c_device, &spear13xx_kbd_device, + &spear13xx_nand_device, &spear13xx_ohci0_device, &spear13xx_ohci1_device, &spear13xx_rtc_device,
@@ -53,6 +57,11 @@ static void __init spear1300_evb_init(void)/* set keyboard plat data */ kbd_set_plat_data (&spear13xx_kbd_device, &kbd_data); +/* set nand device's plat data */ +fsmc_nand_set_plat_data (&spear13xx_nand_device,NULL ,0 , +NAND_SKIP_BBTSCAN ,FSMC_NAND_BW8 ); +nand_mach_init (FSMC_NAND_BW8 ); +/* call spear1300 machine init function */ spear1300_init ();
arch/arm/mach-spear13xx/spear13xx.c +58 -0
76 lines not on this page · raw message
arch/arm/mach-spear3xx/include/mach/generic.h +9 -6
@@ -110,6 +110,10 @@ extern struct pmx_driver pmx_driver;extern struct amba_device clcd_device;extern struct amba_device gpio1_device;extern struct platform_device kbd_device; +extern struct platform_device nand0_device; +extern struct platform_device nand1_device; +extern struct platform_device nand2_device; +extern struct platform_device nand3_device;/* pad mux modes */ extern struct pmx_mode nand_mode;
@@ -147,12 +151,12 @@ void __init spear300_init(void);/* Add misc structure declarations here */ extern struct clcd_board clcd_plat_data; -#endif /* CONFIG_MACH_SPEAR300 */ /* spear310 declarations */ -#ifdef CONFIG_MACH_SPEAR310 +#elif defined(CONFIG_MACH_SPEAR310 )/* Add spear310 machine device structure declarations here */ extern struct platform_device plgpio_device; +extern struct platform_device nand_device;/* pad mux devices */ extern struct pmx_dev pmx_emi_cs_0_1_4_5;
@@ -167,13 +171,12 @@ extern struct pmx_dev pmx_tdm0;/* Add spear310 machine function declarations here */ void __init spear310_init (void ); -#endif /* CONFIG_MACH_SPEAR310 */ -/* spear320 declarations */ -#ifdef CONFIG_MACH_SPEAR320 +#elif defined(CONFIG_MACH_SPEAR320 )/* Add spear320 machine device structure declarations here */ extern struct amba_device clcd_device;extern struct platform_device i2c1_device; +extern struct platform_device nand_device;extern struct platform_device plgpio_device;extern struct platform_device pwm_device;
@@ -212,6 +215,6 @@ void __init spear320_init(void);/* Add misc structure declarations here */ extern struct clcd_board clcd_plat_data; -#endif /* CONFIG_MACH_SPEAR320 */ +#endif #endif /* __MACH_GENERIC_H */
arch/arm/mach-spear3xx/include/mach/spear320.h +3 -0
@@ -22,6 +22,9 @@#define SPEAR320_FSMC_BASE 0x4C000000#define SPEAR320_FSMC_SIZE 0x01000000 +#define SPEAR320_NAND_BASE 0x50000000 +#define SPEAR320_NAND_SIZE 0x04000000 +#define SPEAR320_I2S_BASE 0x60000000#define SPEAR320_I2S_SIZE 0x10000000
arch/arm/mach-spear3xx/spear300.c +98 -0
110 lines not on this page · raw message
arch/arm/mach-spear3xx/spear300_evb.c +8 -0
@@ -11,10 +11,13 @@* warranty of any kind, whether express or implied. */ +#include <linux/mtd/nand.h> +#include <linux/mtd/fsmc.h> #include <asm/mach/arch.h> #include <asm/mach-types.h> #include <mach/generic.h> #include <mach/spear.h> +#include <plat/fsmc.h> #include <plat/keyboard.h> /* padmux devices to enable */
@@ -48,6 +51,7 @@ static struct platform_device *plat_devs[] __initdata = {/* spear3xx specific devices */ &ehci_device, &i2c_device, + &nand0_device, &ohci0_device, &ohci1_device, &rtc_device,
@@ -80,6 +84,10 @@ static void __init spear300_evb_init(void)/* set keyboard plat data */ kbd_set_plat_data (&kbd_device, &kbd_data); +/* set nand0 device's plat data */ +fsmc_nand_set_plat_data (&nand0_device,NULL ,0 ,NAND_SKIP_BBTSCAN , +FSMC_NAND_BW8 ); +/* call spear300 machine init function */ spear300_init ();
arch/arm/mach-spear3xx/spear310.c +26 -0
@@ -12,6 +12,7 @@*/ #include <linux/ptrace.h> +#include <linux/mtd/fsmc.h> #include <asm/irq.h> #include <mach/generic.h> #include <mach/spear.h>
@@ -177,6 +178,31 @@ int spear300_o2p(int offset)return offset +2 ; } +/* nand device registeration */ +static struct fsmc_nand_platform_data nand_platform_data; + +static struct resource nand_resources[] = { + { + .name ="nand_data" , + .start =SPEAR310_NAND_BASE , + .end =SPEAR310_NAND_BASE +SZ_16 -1 , + .flags =IORESOURCE_MEM , + }, { + .name ="fsmc_regs" , + .start =SPEAR310_FSMC_BASE , + .end =SPEAR310_FSMC_BASE +SZ_4K -1 , + .flags =IORESOURCE_MEM , + }, +}; + +struct platform_device nand_device = { + .name ="nand" , + .id =-1 , + .resource = nand_resources, + .num_resources =ARRAY_SIZE (nand_resources), + .dev.platform_data = &nand_platform_data, +}; +static struct plgpio_platform_data plgpio_plat_data = { .gpio_base =8 , .irq_base =SPEAR_PLGPIO_INT_BASE ,
arch/arm/mach-spear3xx/spear310_evb.c +8 -0
@@ -11,10 +11,13 @@* warranty of any kind, whether express or implied. */ +#include <linux/mtd/nand.h> +#include <linux/mtd/fsmc.h> #include <asm/mach/arch.h> #include <asm/mach-types.h> #include <mach/generic.h> #include <mach/spear.h> +#include <plat/fsmc.h> /* padmux devices to enable */ static struct pmx_dev *pmx_devs[] = {
@@ -53,6 +56,7 @@ static struct platform_device *plat_devs[] __initdata = {/* spear3xx specific devices */ &ehci_device, &i2c_device, + &nand_device, &ohci0_device, &ohci1_device, &rtc_device,
@@ -70,6 +74,10 @@ static void __init spear310_evb_init(void) pmx_driver.devs = pmx_devs; pmx_driver.devs_count =ARRAY_SIZE (pmx_devs); +/* set nand device's plat data */ +fsmc_nand_set_plat_data (&nand_device,NULL ,0 ,NAND_SKIP_BBTSCAN , +FSMC_NAND_BW8 ); +/* call spear310 machine init function */ spear310_init ();
arch/arm/mach-spear3xx/spear320.c +26 -0
@@ -12,6 +12,7 @@*/ #include <linux/ptrace.h> +#include <linux/mtd/fsmc.h> #include <asm/irq.h> #include <mach/generic.h> #include <mach/spear.h>
@@ -424,6 +425,31 @@ struct platform_device i2c1_device = { .resource = i2c1_resources, }; +/* nand device registeration */ +static struct fsmc_nand_platform_data nand_platform_data; + +static struct resource nand_resources[] = { + { + .name ="nand_data" , + .start =SPEAR320_NAND_BASE , + .end =SPEAR320_NAND_BASE +SZ_16 -1 , + .flags =IORESOURCE_MEM , + }, { + .name ="fsmc_regs" , + .start =SPEAR320_FSMC_BASE , + .end =SPEAR320_FSMC_BASE +SZ_4K -1 , + .flags =IORESOURCE_MEM , + }, +}; + +struct platform_device nand_device = { + .name ="nand" , + .id =-1 , + .resource = nand_resources, + .num_resources =ARRAY_SIZE (nand_resources), + .dev.platform_data = &nand_platform_data, +}; +/* plgpio device registeration */ static struct plgpio_platform_data plgpio_plat_data = { .gpio_base =8 ,
arch/arm/mach-spear3xx/spear320_evb.c +8 -0
@@ -11,10 +11,13 @@* warranty of any kind, whether express or implied. */ +#include <linux/mtd/nand.h> +#include <linux/mtd/fsmc.h> #include <asm/mach/arch.h> #include <asm/mach-types.h> #include <mach/generic.h> #include <mach/spear.h> +#include <plat/fsmc.h> /* padmux devices to enable */ static struct pmx_dev *pmx_devs[] = {
@@ -51,6 +54,7 @@ static struct platform_device *plat_devs[] __initdata = {/* spear3xx specific devices */ &ehci_device, &i2c_device, + &nand_device, &ohci0_device, &ohci1_device, &rtc_device,
@@ -70,6 +74,10 @@ static void __init spear320_evb_init(void) pmx_driver.devs = pmx_devs; pmx_driver.devs_count =ARRAY_SIZE (pmx_devs); +/* set nand device's plat data */ +fsmc_nand_set_plat_data (&nand_device,NULL ,0 ,NAND_SKIP_BBTSCAN , +FSMC_NAND_BW8 ); +/* call spear320 machine init function */ spear320_init ();
arch/arm/mach-spear6xx/include/mach/generic.h +1 -0
@@ -36,6 +36,7 @@ extern struct amba_device wdt_device;extern struct platform_device ehci0_device;extern struct platform_device ehci1_device;extern struct platform_device i2c_device; +extern struct platform_device nand_device;extern struct platform_device ohci0_device;extern struct platform_device ohci1_device;extern struct platform_device rtc_device;
arch/arm/mach-spear6xx/spear600_evb.c +8 -0
@@ -11,10 +11,13 @@* warranty of any kind, whether express or implied. */ +#include <linux/mtd/nand.h> +#include <linux/mtd/fsmc.h> #include <asm/mach/arch.h> #include <asm/mach-types.h> #include <mach/generic.h> #include <mach/spear.h> +#include <plat/fsmc.h> static struct amba_device *amba_devs[]__initdata = { &clcd_device,
@@ -32,6 +35,7 @@ static struct platform_device *plat_devs[] __initdata = { &i2c_device, &ohci0_device, &ohci1_device, + &nand_device, &rtc_device, };
@@ -39,6 +43,10 @@ static void __init spear600_evb_init(void) {unsigned int i; +/* set nand device's plat data */ +fsmc_nand_set_plat_data (&nand_device,NULL ,0 ,NAND_SKIP_BBTSCAN , +FSMC_NAND_BW8 ); +/* call spear600 machine init function */ spear600_init ();
arch/arm/mach-spear6xx/spear6xx.c +26 -0
@@ -15,6 +15,7 @@#include <linux/amba/pl061.h> #include <linux/ptrace.h> #include <linux/io.h> +#include <linux/mtd/fsmc.h> #include <asm/hardware/vic.h> #include <asm/irq.h> #include <asm/mach/arch.h>
@@ -152,6 +153,31 @@ struct platform_device i2c_device = { .resource = i2c_resources, }; +/* nand device registeration */ +static struct fsmc_nand_platform_data nand_platform_data; + +static struct resource nand_resources[] = { + { + .name ="nand_data" , + .start =SPEAR6XX_ICM1_NAND_BASE , + .end =SPEAR6XX_ICM1_NAND_BASE +SZ_16 -1 , + .flags =IORESOURCE_MEM , + }, { + .name ="fsmc_regs" , + .start =SPEAR6XX_ICM1_FSMC_BASE , + .end =SPEAR6XX_ICM1_FSMC_BASE +SZ_4K -1 , + .flags =IORESOURCE_MEM , + }, +}; + +struct platform_device nand_device = { + .name ="nand" , + .id =-1 , + .resource = nand_resources, + .num_resources =ARRAY_SIZE (nand_resources), + .dev.platform_data = &nand_platform_data, +}; +/* usb host device registeration */ static struct resource ehci0_resources[] = { [0 ] = {
arch/arm/plat-spear/include/plat/fsmc.h new file +36 -0
@@ -0,0 +1,36 @@ +/* +* arch/arm/plat-spear/include/plat/fsmc.h +* +* FSMC definitions for SPEAr platform +* +* Copyright (C) 2010 ST Microelectronics +* Vipin Kumar <[email protected]> +* +* This file is licensed under the terms of the GNU General Public +* License version 2. This program is licensed "as is" without any +* warranty of any kind, whether express or implied. +*/ + +#ifndef __PLAT_FSMC_H +#define __PLAT_FSMC_H + +#include <linux/mtd/fsmc.h> + +/* This function is used to set platform data field of pdev->dev */ +static inline void fsmc_nand_set_plat_data (struct platform_device *pdev, +struct mtd_partition *partitions,unsigned int nr_partitions, +unsigned int options,unsigned int width) +{ +struct fsmc_nand_platform_data *plat_data; + plat_data =dev_get_platdata (&pdev->dev); + +if (partitions) { + plat_data->partitions = partitions; + plat_data->nr_partitions = nr_partitions; + } + + plat_data->options = options; + plat_data->width = width; +} + +#endif /* __PLAT_FSMC_H */
Signature · 1 line
1.7.2.2
PATCH v4 25/62 ST SPEAr: Added PCIE host controller base driver support.
In reply to Viresh KumarFrom: Pratyush Anand <[email protected]>
SPEAr13xx family contains Synopsys designware PCIE version 3.30a. This patch adds support for this PCIE module for spear platform.
--- arch/arm/Kconfig | 1 + arch/arm/mach-spear13xx/Makefile | 1 + arch/arm/mach-spear13xx/include/mach/hardware.h | 7 + arch/arm/mach-spear13xx/include/mach/irqs.h | 25 +- arch/arm/mach-spear13xx/include/mach/misc_regs.h | 20 + arch/arm/mach-spear13xx/include/mach/pcie.h | 170 +++++ arch/arm/mach-spear13xx/pcie.c | 861 ++++++++++++++++++++++ arch/arm/mach-spear13xx/spear1300_evb.c | 31 + arch/arm/mach-spear13xx/spear13xx.c | 28 + arch/arm/plat-spear/Kconfig | 2 + 10 files changed, 1142 insertions(+), 4 deletions(-) create mode 100644 arch/arm/mach-spear13xx/include/mach/pcie.h create mode 100644 arch/arm/mach-spear13xx/pcie.c
arch/arm/Kconfig +1 -0
@@ -1238,6 +1238,7 @@ config PCI_HOST_ITE8152 select DMABOUNCE source "drivers/pci/Kconfig" +source "drivers/pci/pcie/Kconfig" source "drivers/pcmcia/Kconfig"
arch/arm/mach-spear13xx/Makefile +1 -0
@@ -6,6 +6,7 @@ obj-y += spear13xx.o clock.o obj-$(CONFIG_SMP) += platsmp.o headsmp.o obj-$(CONFIG_LOCAL_TIMERS) += localtimer.o +obj-$(CONFIG_PCIEPORTBUS) += pcie.o # spear1300 specific files obj-$(CONFIG_MACH_SPEAR1300) += spear1300.o
arch/arm/mach-spear13xx/include/mach/hardware.h +7 -0
@@ -22,4 +22,11 @@/* typesafe io address */ #define __io_address (n) __io(IO_ADDRESS(n)) +#if defined(CONFIG_PCI ) +#define PCIBIOS_MIN_IO 0 +#define PCIBIOS_MIN_MEM 0 +#define pcibios_assign_all_busses () 0 +#endif + +#endif /* __MACH_HARDWARE_H */
arch/arm/mach-spear13xx/include/mach/irqs.h +21 -4
@@ -80,9 +80,9 @@#define IRQ_USBH_OHCI0 (IRQ_SHPI_START + 65)#define IRQ_USBH_EHCI1 (IRQ_SHPI_START + 66)#define IRQ_USBH_OHCI1 (IRQ_SHPI_START + 67) -#define IRQ_PCIE1 (IRQ_SHPI_START + 68) -#define IRQ_PCIE2 (IRQ_SHPI_START + 69) -#define IRQ_PCIE3 (IRQ_SHPI_START + 70) +#define IRQ_PCIE0 (IRQ_SHPI_START + 68) +#define IRQ_PCIE1 (IRQ_SHPI_START + 69) +#define IRQ_PCIE2 (IRQ_SHPI_START + 70)#define IRQ_GIC_END (IRQ_SHPI_START + 128)
@@ -93,7 +93,24 @@#define SPEAR_GPIO1_INT_BASE (SPEAR_GPIO0_INT_BASE + 8)#define SPEAR_GPIO_INT_END (SPEAR_GPIO1_INT_BASE + 8) -#define VIRQ_END SPEAR_GPIO_INT_END +/* PCIE MSI virtual irqs */ +#define SPEAR_NUM_MSI_IRQS 64 +#define SPEAR_MSI0_INT_BASE (SPEAR_GPIO_INT_END + 0) +#define SPEAR_MSI0_INT_END (SPEAR_MSI0_INT_BASE + SPEAR_NUM_MSI_IRQS) +#define SPEAR_MSI1_INT_BASE (SPEAR_MSI0_INT_END + 0) +#define SPEAR_MSI1_INT_END (SPEAR_MSI1_INT_BASE + SPEAR_NUM_MSI_IRQS) +#define SPEAR_MSI2_INT_BASE (SPEAR_MSI1_INT_END + 0) +#define SPEAR_MSI2_INT_END (SPEAR_MSI2_INT_BASE + SPEAR_NUM_MSI_IRQS) + +#define SPEAR_NUM_INTX_IRQS 4 +#define SPEAR_INTX0_BASE (SPEAR_MSI2_INT_END + 0) +#define SPEAR_INTX0_END (SPEAR_INTX0_BASE + SPEAR_NUM_INTX_IRQS) +#define SPEAR_INTX1_BASE (SPEAR_INTX0_END + 0) +#define SPEAR_INTX1_END (SPEAR_INTX1_BASE + SPEAR_NUM_INTX_IRQS) +#define SPEAR_INTX2_BASE (SPEAR_INTX1_END + 0) +#define SPEAR_INTX2_END (SPEAR_INTX2_BASE + SPEAR_NUM_INTX_IRQS) + +#define VIRQ_END SPEAR_INTX2_END#define NR_IRQS VIRQ_END#endif /* __MACH_IRQS_H */
arch/arm/mach-spear13xx/include/mach/misc_regs.h +20 -0
@@ -202,6 +202,26 @@#define USBPHY_P2_CFG ((unsigned int *)(MISC_BASE + 0x31c))#define USBPHY_P3_CFG ((unsigned int *)(MISC_BASE + 0x320))#define PCIE_CFG ((unsigned int *)(MISC_BASE + 0x324)) +/* PCIE CFG MASks */ +#define PCIE2_CFG_AUX_CLK (1 << 0) +#define PCIE1_CFG_AUX_CLK (1 << 1) +#define PCIE0_CFG_AUX_CLK (1 << 2) +#define PCIE2_CFG_CORE_CLK (1 << 3) +#define PCIE1_CFG_CORE_CLK (1 << 4) +#define PCIE0_CFG_CORE_CLK (1 << 5) +#define PCIE2_CFG_POWERUP_RESET (1 << 6) +#define PCIE1_CFG_POWERUP_RESET (1 << 7) +#define PCIE0_CFG_POWERUP_RESET (1 << 8) +#define PCIE2_CFG_DEVICE_PRESENT (1 << 9) +#define PCIE1_CFG_DEVICE_PRESENT (1 << 10) +#define PCIE0_CFG_DEVICE_PRESENT (1 << 11) +#define PCIE0_CFG_VAL (PCIE0_CFG_AUX_CLK | PCIE0_CFG_CORE_CLK \ + | PCIE0_CFG_POWERUP_RESET | PCIE0_CFG_DEVICE_PRESENT) +#define PCIE1_CFG_VAL (PCIE1_CFG_AUX_CLK | PCIE1_CFG_CORE_CLK \ + | PCIE1_CFG_POWERUP_RESET | PCIE1_CFG_DEVICE_PRESENT) +#define PCIE2_CFG_VAL (PCIE2_CFG_AUX_CLK | PCIE2_CFG_CORE_CLK \ + | PCIE2_CFG_POWERUP_RESET | PCIE2_CFG_DEVICE_PRESENT) +#define PCIE_MIPHY_CFG ((unsigned int *)(MISC_BASE + 0x328))#define PERIP_CFG ((unsigned int *)(MISC_BASE + 0x32c))#define MCIF_SEL_SHIFT 3
arch/arm/mach-spear13xx/include/mach/pcie.h new file +170 -0
170 lines not on this page · raw message
arch/arm/mach-spear13xx/pcie.c new file +861 -0
861 lines not on this page · raw message
arch/arm/mach-spear13xx/spear1300_evb.c +31 -0
@@ -18,6 +18,7 @@#include <asm/mach-types.h> #include <mach/generic.h> #include <mach/spear.h> +#include <mach/pcie.h> #include <plat/keyboard.h> #include <plat/fsmc.h>
@@ -50,6 +51,30 @@ static struct kbd_platform_data kbd_data = { .rep = 1, }; +#ifdef CONFIG_PCIEPORTBUS +/* this function is needed for PCIE host and device driver. Same +* controller can not be programmed as host as well as device. So host +* driver must call this function and if this function returns 1 then +* only host should add that particular port as RC. +* A port to be added as device, one must also add device's information +* in plat_devs array defined in this file. +* it is the responsibility of calling function to not send port number +* greter than max no of controller(3) +*/ +static int spear1300_pcie_port_is_host (int port) +{ +switch (port) { +case 0 : +return 0 ; +case 1 : +return 1 ; +case 2 : +return 1 ; + } +return -EINVAL ; +} +#endif +static void __init spear1300_evb_init (void ) {unsigned int i;
@@ -68,6 +93,12 @@ static void __init spear1300_evb_init(void)/* Register slave devices on the I2C buses */ i2c_register_default_devices (); +#ifdef CONFIG_PCIEPORTBUS +/* Enable PCIE0 clk */ +enable_pcie0_clk (); +pcie_init (&spear1300_pcie_port_is_host); +#endif +/* Add Platform Devices */ platform_add_devices (plat_devs,ARRAY_SIZE (plat_devs));
arch/arm/mach-spear13xx/spear13xx.c +28 -0
@@ -299,6 +299,34 @@ struct platform_device spear13xx_rtc_device = { .resource = rtc_resources, }; +#ifdef CONFIG_PCIEPORTBUS +/* PCIE0 clock always needs to be enabled if any of the three PCIE port +* have to be used. So call this function from the board initilization +* file. Ideally , all controller should have been independent from +* others with respect to clock. +*/ +int enable_pcie0_clk (void ) +{ +struct clk *clk; +/*Enable all CLK in CFG registers here only. Idealy only PCIE0 +* should have been enabled. But Controler does not work +* properly if PCIE1 and PCIE2's CFG CLK is enabled in stages. +*/ +writel (PCIE0_CFG_VAL |PCIE1_CFG_VAL |PCIE2_CFG_VAL ,PCIE_CFG ); + clk =clk_get_sys ("pcie0" ,NULL ); +if (!clk) { +pr_err ("%s:couldn't get clk for pcie0\n" , __func__); +return -ENODEV ; + } +if (clk_enable (clk)) { +pr_err ("%s:couldn't enable clk for pcie0\n" , __func__); +return -ENODEV ; + } + +return 0 ; +} +#endif +/* Do spear13xx familiy common initialization part here */ void __init spear13xx_init (void ) {
arch/arm/plat-spear/Kconfig +2 -0
@@ -12,6 +12,8 @@ config ARCH_SPEAR13XX bool "SPEAr13XX" select ARM_GIC select CPU_V7 + select ARCH_SUPPORTS_MSI + select MIGHT_HAVE_PCI help Supports for ARM's SPEAR13XX family
Signature · 1 line
1.7.2.2
PATCH v4 25/62 ST SPEAr: Added PCIE host controller base driver support.
Review
Quoted 2 lines · Viresh Kumar
(quoted diff) +2
-0+ clk = clk_get_sys("pcie1", NULL); + if (!clk) {
IS_ERR(clk)
Quoted 5 lines
arch/arm/mach-spear13xx/pcie.c new file +5
-0+pr_err ("%s:couldn't get clk for pcie1\n" , + __func__); +continue ; + } +if (clk_enable (clk)) {
arch/arm/mach-spear13xx/pcie.c line 576
Quoted 10 lines
arch/arm/mach-spear13xx/pcie.c new file +10
-0+pr_err ("%s:couldn't enable clk for pcie1\n" , + __func__); +continue ; + } + }else if (port ==2 ) { +/* Ideally CFG Clock should have been also enabled +* here. But it is done currently during board +* init routne*/ + clk =clk_get_sys ("pcie2" ,NULL ); +if (!clk) {
IS_ERR(clk)
Quoted 15 lines
arch/arm/mach-spear13xx/pcie.c new file +15
-0+pr_err ("%s:couldn't get clk for pcie2\n" , + __func__); +continue ; + } +if (clk_enable (clk)) { +pr_err ("%s:couldn't enable clk for pcie2\n" , + __func__); +continue ; + } + } + +if ((*pcie_port_is_host)(port)) +add_pcie_port (port, spr_pcie_base[port], + spr_pcie_app_base[port]); + }
...
Quoted 6 lines
arch/arm/mach-spear13xx/spear13xx.c +6
-0+#ifdef CONFIG_PCIEPORTBUS +/* PCIE0 clock always needs to be enabled if any of the three PCIE port +* have to be used. So call this function from the board initilization +* file. Ideally , all controller should have been independent from +* others with respect to clock. +*/
arch/arm/mach-spear13xx/spear13xx.c struct platform_device spear13xx_rtc_device = { · line 317
Quoted 10 lines
arch/arm/mach-spear13xx/spear13xx.c +10
-0+int enable_pcie0_clk (void ) +{ +struct clk *clk; +/*Enable all CLK in CFG registers here only. Idealy only PCIE0 +* should have been enabled. But Controler does not work +* properly if PCIE1 and PCIE2's CFG CLK is enabled in stages. +*/ +writel (PCIE0_CFG_VAL |PCIE1_CFG_VAL |PCIE2_CFG_VAL ,PCIE_CFG ); + clk =clk_get_sys ("pcie0" ,NULL ); +if (!clk) {
IS_ERR(clk)
PATCH v4 25/62 ST SPEAr: Added PCIE host controller base driver support.
Quoted 50 lines · Russell King - ARM Linux
Review
Quoted 2 lines · Viresh Kumar
(quoted diff) +2
-0+ clk = clk_get_sys("pcie1", NULL); + if (!clk) {
IS_ERR(clk)Quoted 5 lines
arch/arm/mach-spear13xx/pcie.c new file +5
-0+pr_err ("%s:couldn't get clk for pcie1\n" , + __func__); +continue ; + } +if (clk_enable (clk)) {arch/arm/mach-spear13xx/pcie.c line 576
Quoted 10 lines
arch/arm/mach-spear13xx/pcie.c new file +10
-0+pr_err ("%s:couldn't enable clk for pcie1\n" , + __func__); +continue ; + } + }else if (port ==2 ) { +/* Ideally CFG Clock should have been also enabled +* here. But it is done currently during board +* init routne*/ + clk =clk_get_sys ("pcie2" ,NULL ); +if (!clk) {
IS_ERR(clk)Quoted 15 lines
arch/arm/mach-spear13xx/pcie.c new file +15
-0+pr_err ("%s:couldn't get clk for pcie2\n" , + __func__); +continue ; + } +if (clk_enable (clk)) { +pr_err ("%s:couldn't enable clk for pcie2\n" , + __func__); +continue ; + } + } + +if ((*pcie_port_is_host)(port)) +add_pcie_port (port, spr_pcie_base[port], + spr_pcie_app_base[port]); + }...
Quoted 10 lines
arch/arm/mach-spear13xx/spear13xx.c +10
-0+#ifdef CONFIG_PCIEPORTBUS +/* PCIE0 clock always needs to be enabled if any of the three PCIE port +* have to be used. So call this function from the board initilization +* file. Ideally , all controller should have been independent from +* others with respect to clock. +*/ +int enable_pcie0_clk (void ) +{ +struct clk *clk; +/*Enable all CLK in CFG registers here only. Idealy only PCIE0
Quoted 9 lines
arch/arm/mach-spear13xx/spear13xx.c struct platform_device spear13xx_rtc_device = { · line 317
Quoted 6 lines
arch/arm/mach-spear13xx/spear13xx.c +6
-0+* should have been enabled. But Controler does not work +* properly if PCIE1 and PCIE2's CFG CLK is enabled in stages. +*/ +writel (PCIE0_CFG_VAL |PCIE1_CFG_VAL |PCIE2_CFG_VAL ,PCIE_CFG ); + clk =clk_get_sys ("pcie0" ,NULL ); +if (!clk) {
IS_ERR(clk)
Ok.
Signature · 1 line
viresh
PATCH v4 26/62 ST SPEAr: Adding support for SSP PL022
In reply to Viresh Kumar--- arch/arm/mach-spear13xx/include/mach/generic.h | 1 + arch/arm/mach-spear13xx/spear1300_evb.c | 10 +++ arch/arm/mach-spear13xx/spear13xx.c | 31 ++++++++++ arch/arm/mach-spear3xx/include/mach/generic.h | 2 + arch/arm/mach-spear3xx/spear300_evb.c | 25 ++++++++ arch/arm/mach-spear3xx/spear310_evb.c | 37 ++++++++++++ arch/arm/mach-spear3xx/spear320.c | 42 +++++++++++++ arch/arm/mach-spear3xx/spear320_evb.c | 9 +++ arch/arm/mach-spear3xx/spear3xx.c | 31 ++++++++++ arch/arm/mach-spear6xx/include/mach/generic.h | 1 + arch/arm/mach-spear6xx/include/mach/spear.h | 4 +- arch/arm/mach-spear6xx/spear600_evb.c | 13 ++++ arch/arm/mach-spear6xx/spear6xx.c | 68 ++++++++++++++++++++++ arch/arm/plat-spear/include/plat/spi.h | 74 ++++++++++++++++++++++++ 14 files changed, 346 insertions(+), 2 deletions(-) create mode 100644 arch/arm/plat-spear/include/plat/spi.h
arch/arm/mach-spear13xx/include/mach/generic.h +1 -0
@@ -30,6 +30,7 @@/* Add spear13xx family device structure declarations here */ extern struct amba_device spear13xx_gpio_device[]; +extern struct amba_device spear13xx_ssp_device;extern struct amba_device spear13xx_uart_device;extern struct platform_device spear13xx_ehci0_device;extern struct platform_device spear13xx_ehci1_device;
arch/arm/mach-spear13xx/spear1300_evb.c +10 -0
@@ -12,7 +12,10 @@*/ #include <linux/types.h> +#include <linux/gpio.h> #include <linux/mtd/nand.h> +#include <linux/spi/flash.h> +#include <linux/spi/spi.h> #include <linux/mtd/fsmc.h> #include <asm/mach/arch.h> #include <asm/mach-types.h>
@@ -21,10 +24,12 @@#include <mach/pcie.h> #include <plat/keyboard.h> #include <plat/fsmc.h> +#include <plat/spi.h> static struct amba_device *amba_devs[]__initdata = { &spear13xx_gpio_device[0 ], &spear13xx_gpio_device[1 ], + &spear13xx_ssp_device, &spear13xx_uart_device, };
@@ -51,6 +56,9 @@ static struct kbd_platform_data kbd_data = { .rep = 1, }; +static struct spi_board_info __initdata spi_board_info[] = { +}; +#ifdef CONFIG_PCIEPORTBUS /* this function is needed for PCIE host and device driver. Same * controller can not be programmed as host as well as device. So host
@@ -105,6 +113,8 @@ static void __init spear1300_evb_init(void)/* Add Amba Devices */ for (i =0 ; i <ARRAY_SIZE (amba_devs); i++)amba_device_register (amba_devs[i], &iomem_resource); + +spi_register_board_info (spi_board_info,ARRAY_SIZE (spi_board_info)); }MACHINE_START (SPEAR1300 ,"ST-SPEAR1300-EVB" )
arch/arm/mach-spear13xx/spear13xx.c +31 -0
@@ -12,6 +12,7 @@*/ #include <linux/types.h> +#include <linux/amba/pl022.h> #include <linux/amba/pl061.h> #include <linux/ptrace.h> #include <linux/io.h>
@@ -64,6 +65,36 @@ struct amba_device spear13xx_gpio_device[] = { } }; +/* ssp device registeration */ +static struct pl022_ssp_controller ssp_platform_data = { + .bus_id =0 , + .enable_dma =0 , +/* +* This is number of spi devices that can be connected to spi. There are +* two type of chipselects on which slave devices can work. One is chip +* select provided by spi masters other is controlled through external +* gpio's. We can't use chipselect provided from spi master (because as +* soon as FIFO becomes empty, CS is disabled and transfer ends). So +* this number now depends on number of gpios available for spi. each +* slave on each master requires a separate gpio pin. +*/ + .num_chipselect =2 , +}; + +struct amba_device spear13xx_ssp_device = { + .dev = { + .coherent_dma_mask = ~0 , + .init_name ="ssp-pl022" , + .platform_data = &ssp_platform_data, + }, + .res = { + .start =SPEAR13XX_SSP_BASE , + .end =SPEAR13XX_SSP_BASE +SZ_4K -1 , + .flags =IORESOURCE_MEM , + }, + .irq = {IRQ_SSP ,NO_IRQ }, +}; +/* uart device registeration */ struct amba_device spear13xx_uart_device = { .dev = {
arch/arm/mach-spear3xx/include/mach/generic.h +2 -0
@@ -32,6 +32,7 @@/* Add spear3xx family device structure declarations here */ extern struct amba_device gpio_device; +extern struct amba_device ssp0_device;extern struct amba_device uart_device;extern struct amba_device wdt_device;extern struct platform_device ehci_device;
@@ -175,6 +176,7 @@ void __init spear310_init(void);#elif defined(CONFIG_MACH_SPEAR320 )/* Add spear320 machine device structure declarations here */ extern struct amba_device clcd_device; +extern struct amba_device ssp_device[];extern struct platform_device i2c1_device;extern struct platform_device nand_device;extern struct platform_device plgpio_device;
arch/arm/mach-spear3xx/spear300_evb.c +25 -0
@@ -15,10 +15,14 @@#include <linux/mtd/fsmc.h> #include <asm/mach/arch.h> #include <asm/mach-types.h> +#include <linux/spi/flash.h> +#include <linux/spi/spi.h> #include <mach/generic.h> +#include <mach/gpio.h> #include <mach/spear.h> #include <plat/fsmc.h> #include <plat/keyboard.h> +#include <plat/spi.h> /* padmux devices to enable */ static struct pmx_dev *pmx_devs[] = {
@@ -39,6 +43,7 @@ static struct pmx_dev *pmx_devs[] = {static struct amba_device *amba_devs[]__initdata = {/* spear3xx specific devices */ &gpio_device, + &ssp0_device, &uart_device, &wdt_device,
@@ -72,6 +77,24 @@ static struct kbd_platform_data kbd_data = { .rep = 1, }; +/* spi board information */ +/* spi0 flash Chip Select Control function, controlled by gpio pin mentioned */ +DECLARE_SPI_CS_CONTROL (0 , flash,RAS_GPIO_3 ); +/* spi0 flash Chip Info structure */ +DECLARE_SPI_CHIP_INFO (0 , flash, spi0_flash_cs_control); + +static struct spi_board_info __initdata spi_board_info[] = { +/* spi0 board info */ + { + .modalias ="m25p80" , + .controller_data = &spi0_flash_chip_info, + .max_speed_hz =25000000 , + .bus_num =0 , + .chip_select =1 , + .mode =SPI_MODE_1 , + } +}; +static void __init spear300_evb_init (void ) {unsigned int i;
@@ -100,6 +123,8 @@ static void __init spear300_evb_init(void)/* Add Amba Devices */ for (i =0 ; i <ARRAY_SIZE (amba_devs); i++)amba_device_register (amba_devs[i], &iomem_resource); + +spi_register_board_info (spi_board_info,ARRAY_SIZE (spi_board_info)); }MACHINE_START (SPEAR300 ,"ST-SPEAR300-EVB" )
arch/arm/mach-spear3xx/spear310_evb.c +37 -0
@@ -15,9 +15,13 @@#include <linux/mtd/fsmc.h> #include <asm/mach/arch.h> #include <asm/mach-types.h> +#include <linux/spi/flash.h> +#include <linux/spi/spi.h> #include <mach/generic.h> +#include <mach/gpio.h> #include <mach/spear.h> #include <plat/fsmc.h> +#include <plat/spi.h> /* padmux devices to enable */ static struct pmx_dev *pmx_devs[] = {
@@ -46,6 +50,7 @@ static struct pmx_dev *pmx_devs[] = {static struct amba_device *amba_devs[]__initdata = {/* spear3xx specific devices */ &gpio_device, + &ssp0_device, &uart_device, &wdt_device,
@@ -65,6 +70,36 @@ static struct platform_device *plat_devs[] __initdata = { &plgpio_device, }; +/* spi board information */ +/* spi0 flash Chip Select Control function, controlled by gpio pin mentioned */ +DECLARE_SPI_CS_CONTROL (0 , flash,BASIC_GPIO_3 ); +/* spi0 flash Chip Info structure */ +DECLARE_SPI_CHIP_INFO (0 , flash, spi0_flash_cs_control); + +/* spi0 spidev Chip Select Control function, controlled by gpio pin mentioned */ +DECLARE_SPI_CS_CONTROL (0 , dev,BASIC_GPIO_4 ); +/* spi0 spidev Chip Info structure */ +DECLARE_SPI_CHIP_INFO (0 , dev, spi0_dev_cs_control); + +static struct spi_board_info __initdata spi_board_info[] = { +/* spi0 board info */ + { + .modalias ="spidev" , + .controller_data = &spi0_dev_chip_info, + .max_speed_hz =25000000 , + .bus_num =0 , + .chip_select =0 , + .mode =SPI_MODE_1 , + }, { + .modalias ="m25p80" , + .controller_data = &spi0_flash_chip_info, + .max_speed_hz =25000000 , + .bus_num =0 , + .chip_select =1 , + .mode =SPI_MODE_1 , + } +}; +static void __init spear310_evb_init (void ) {unsigned int i;
@@ -90,6 +125,8 @@ static void __init spear310_evb_init(void)/* Add Amba Devices */ for (i =0 ; i <ARRAY_SIZE (amba_devs); i++)amba_device_register (amba_devs[i], &iomem_resource); + +spi_register_board_info (spi_board_info,ARRAY_SIZE (spi_board_info)); }MACHINE_START (SPEAR310 ,"ST-SPEAR310-EVB" )
arch/arm/mach-spear3xx/spear320.c +42 -0
54 lines not on this page · raw message
arch/arm/mach-spear3xx/spear320_evb.c +9 -0
@@ -15,9 +15,13 @@#include <linux/mtd/fsmc.h> #include <asm/mach/arch.h> #include <asm/mach-types.h> +#include <linux/spi/flash.h> +#include <linux/spi/spi.h> #include <mach/generic.h> +#include <mach/gpio.h> #include <mach/spear.h> #include <plat/fsmc.h> +#include <plat/spi.h> /* padmux devices to enable */ static struct pmx_dev *pmx_devs[] = {
@@ -65,6 +69,9 @@ static struct platform_device *plat_devs[] __initdata = { &pwm_device, }; +static struct spi_board_info __initdata spi_board_info[] = { +}; +static void __init spear320_evb_init (void ) {unsigned int i;
@@ -90,6 +97,8 @@ static void __init spear320_evb_init(void)/* Add Amba Devices */ for (i =0 ; i <ARRAY_SIZE (amba_devs); i++)amba_device_register (amba_devs[i], &iomem_resource); + +spi_register_board_info (spi_board_info,ARRAY_SIZE (spi_board_info)); }MACHINE_START (SPEAR320 ,"ST-SPEAR320-EVB" )
arch/arm/mach-spear3xx/spear3xx.c +31 -0
@@ -12,6 +12,7 @@*/ #include <linux/types.h> +#include <linux/amba/pl022.h> #include <linux/amba/pl061.h> #include <linux/ptrace.h> #include <linux/io.h>
@@ -41,6 +42,36 @@ struct amba_device gpio_device = { .irq = {IRQ_BASIC_GPIO, NO_IRQ}, }; +/* ssp device registration */ +static struct pl022_ssp_controller ssp_platform_data = { + .bus_id = 0, + .enable_dma = 0, + /* + * This is number of spi devices that can be connected to spi. There are + * two type of chipselects on which slave devices can work. One is chip + * select provided by spi masters other is controlled through external + * gpio's. We can't use chipselect provided from spi master (because as + * soon as FIFO becomes empty, CS is disabled and transfer ends). So + * this number now depends on number of gpios available for spi. each + * slave on each master requires a separate gpio pin. + */ + .num_chipselect = 2, +}; + +struct amba_device ssp0_device = { + .dev = { + .coherent_dma_mask = ~0, + .init_name = "ssp-pl022.0", + .platform_data = &ssp_platform_data, + }, + .res = { + .start = SPEAR3XX_ICM1_SSP_BASE, + .end = SPEAR3XX_ICM1_SSP_BASE + SZ_4K - 1, + .flags = IORESOURCE_MEM, + }, + .irq = {IRQ_SSP, NO_IRQ}, +}; + /* uart device registration */ struct amba_device uart_device = { .dev = {
arch/arm/mach-spear6xx/include/mach/generic.h +1 -0
@@ -31,6 +31,7 @@/* Add spear6xx family device structure declarations here */ extern struct amba_device clcd_device;extern struct amba_device gpio_device[]; +extern struct amba_device ssp_device[];extern struct amba_device uart_device[];extern struct amba_device wdt_device;extern struct platform_device ehci0_device;
arch/arm/mach-spear6xx/include/mach/spear.h +2 -2
@@ -68,8 +68,8 @@#define SPEAR6XX_ICM2_GPIO_BASE 0xD8100000#define SPEAR6XX_ICM2_GPIO_SIZE 0x00080000 -#define SPEAR6XX_ICM2_SPI2_BASE 0xD8180000 -#define SPEAR6XX_ICM2_SPI2_SIZE 0x00080000 +#define SPEAR6XX_ICM2_SSP2_BASE 0xD8180000 +#define SPEAR6XX_ICM2_SSP2_SIZE 0x00080000#define SPEAR6XX_ICM2_ADC_BASE 0xD8200000#define SPEAR6XX_ICM2_ADC_SIZE 0x00080000
arch/arm/mach-spear6xx/spear600_evb.c +13 -0
@@ -15,15 +15,23 @@#include <linux/mtd/fsmc.h> #include <asm/mach/arch.h> #include <asm/mach-types.h> +#include <linux/gpio.h> +#include <linux/spi/flash.h> +#include <linux/spi/spi.h> #include <mach/generic.h> +#include <mach/gpio.h> #include <mach/spear.h> #include <plat/fsmc.h> +#include <plat/spi.h> static struct amba_device *amba_devs[]__initdata = { &clcd_device, &gpio_device[0 ], &gpio_device[1 ], &gpio_device[2 ], + &ssp_device[0 ], + &ssp_device[1 ], + &ssp_device[2 ], &uart_device[0 ], &uart_device[1 ], &wdt_device,
@@ -39,6 +47,9 @@ static struct platform_device *plat_devs[] __initdata = { &rtc_device, }; +static struct spi_board_info __initdata spi_board_info[] = { +}; +static void __init spear600_evb_init (void ) {unsigned int i;
@@ -59,6 +70,8 @@ static void __init spear600_evb_init(void)/* Add Amba Devices */ for (i =0 ; i <ARRAY_SIZE (amba_devs); i++)amba_device_register (amba_devs[i], &iomem_resource); + +spi_register_board_info (spi_board_info,ARRAY_SIZE (spi_board_info)); }
arch/arm/mach-spear6xx/spear6xx.c +68 -0
80 lines not on this page · raw message
arch/arm/plat-spear/include/plat/spi.h new file +74 -0
74 lines not on this page · raw message
Signature · 1 line
1.7.2.2
PATCH v4 26/62 ST SPEAr: Adding support for SSP PL022
arch/arm/mach-spear13xx/spear1300_evb.c line 15
Quoted 9 lines · Viresh Kumar
arch/arm/mach-spear13xx/spear1300_evb.c +1
-0@@ -12,7 +12,10 @@*/ #include <linux/types.h> +#include <linux/gpio.h>
:-)
arch/arm/mach-spear3xx/spear300_evb.c line 21
Quoted 12 lines
arch/arm/mach-spear3xx/spear300_evb.c +3
-0@@ -15,10 +15,14 @@#include <linux/mtd/fsmc.h> #include <asm/mach/arch.h> #include <asm/mach-types.h> +#include <linux/spi/flash.h> +#include <linux/spi/spi.h> #include <mach/generic.h> +#include <mach/gpio.h>
:-(
arch/arm/mach-spear3xx/spear310_evb.c line 21
Quoted 12 lines
arch/arm/mach-spear3xx/spear310_evb.c +3
-0@@ -15,9 +15,13 @@#include <linux/mtd/fsmc.h> #include <asm/mach/arch.h> #include <asm/mach-types.h> +#include <linux/spi/flash.h> +#include <linux/spi/spi.h> #include <mach/generic.h> +#include <mach/gpio.h>
:-(
arch/arm/mach-spear3xx/spear320_evb.c line 21
Quoted 12 lines
arch/arm/mach-spear3xx/spear320_evb.c +3
-0@@ -15,9 +15,13 @@#include <linux/mtd/fsmc.h> #include <asm/mach/arch.h> #include <asm/mach-types.h> +#include <linux/spi/flash.h> +#include <linux/spi/spi.h> #include <mach/generic.h> +#include <mach/gpio.h>
:-(
arch/arm/mach-spear6xx/spear600_evb.c line 22
Quoted 13 lines
arch/arm/mach-spear6xx/spear600_evb.c +4
-0@@ -15,15 +15,23 @@#include <linux/mtd/fsmc.h> #include <asm/mach/arch.h> #include <asm/mach-types.h> +#include <linux/gpio.h> +#include <linux/spi/flash.h> +#include <linux/spi/spi.h> #include <mach/generic.h> +#include <mach/gpio.h>
:-(
Quoted 15 lines
arch/arm/plat-spear/include/plat/spi.h new file +9
-0@@ -0,0 +1,74 @@ +/* +* arch/arm/plat-spear/include/plat/spi.h +* +* SPI board specific definitions common to multiple boards on multiple +* machines. +* +* Copyright (C) 2010 ST Microelectronics +* Viresh Kumar<[email protected]> +*
arch/arm/plat-spear/include/plat/spi.h line 19
Quoted 10 lines
arch/arm/plat-spear/include/plat/spi.h new file +10
-0+* This file is licensed under the terms of the GNU General Public +* License version 2. This program is licensed "as is" without any +* warranty of any kind, whether express or implied. +*/ + +#ifndef __PLAT_SPI_H +#define __PLAT_SPI_H + +#include <linux/amba/pl022.h> +#include <linux/gpio.h>
:-)
PATCH v4 26/62 ST SPEAr: Adding support for SSP PL022
Quoted 94 lines · Russell King - ARM Linux
arch/arm/mach-spear13xx/spear1300_evb.c line 15
Quoted 9 lines · Viresh Kumar
arch/arm/mach-spear13xx/spear1300_evb.c +1
-0@@ -12,7 +12,10 @@*/ #include <linux/types.h> +#include <linux/gpio.h> :-)
arch/arm/mach-spear3xx/spear300_evb.c line 21
Quoted 12 lines
arch/arm/mach-spear3xx/spear300_evb.c +3
-0@@ -15,10 +15,14 @@#include <linux/mtd/fsmc.h> #include <asm/mach/arch.h> #include <asm/mach-types.h> +#include <linux/spi/flash.h> +#include <linux/spi/spi.h> #include <mach/generic.h> +#include <mach/gpio.h> :-(
arch/arm/mach-spear3xx/spear310_evb.c line 21
Quoted 12 lines
arch/arm/mach-spear3xx/spear310_evb.c +3
-0@@ -15,9 +15,13 @@#include <linux/mtd/fsmc.h> #include <asm/mach/arch.h> #include <asm/mach-types.h> +#include <linux/spi/flash.h> +#include <linux/spi/spi.h> #include <mach/generic.h> +#include <mach/gpio.h> :-(
arch/arm/mach-spear3xx/spear320_evb.c line 21
Quoted 12 lines
arch/arm/mach-spear3xx/spear320_evb.c +3
-0@@ -15,9 +15,13 @@#include <linux/mtd/fsmc.h> #include <asm/mach/arch.h> #include <asm/mach-types.h> +#include <linux/spi/flash.h> +#include <linux/spi/spi.h> #include <mach/generic.h> +#include <mach/gpio.h> :-(
arch/arm/mach-spear6xx/spear600_evb.c line 22
Quoted 13 lines
arch/arm/mach-spear6xx/spear600_evb.c +4
-0@@ -15,15 +15,23 @@#include <linux/mtd/fsmc.h> #include <asm/mach/arch.h> #include <asm/mach-types.h> +#include <linux/gpio.h> +#include <linux/spi/flash.h> +#include <linux/spi/spi.h> #include <mach/generic.h> +#include <mach/gpio.h> :-(
Quoted 20 lines
arch/arm/plat-spear/include/plat/spi.h new file +14
-0@@ -0,0 +1,74 @@ +/* +* arch/arm/plat-spear/include/plat/spi.h +* +* SPI board specific definitions common to multiple boards on multiple +* machines. +* +* Copyright (C) 2010 ST Microelectronics +* Viresh Kumar<[email protected]> +* +* This file is licensed under the terms of the GNU General Public +* License version 2. This program is licensed "as is" without any +* warranty of any kind, whether express or implied. +*/ +
Quoted 8 lines
arch/arm/plat-spear/include/plat/spi.h line 19
Quoted 5 lines
arch/arm/plat-spear/include/plat/spi.h new file +5
-0+#ifndef __PLAT_SPI_H +#define __PLAT_SPI_H + +#include <linux/amba/pl022.h> +#include <linux/gpio.h> :-)
.
Will use linux/gpio.h everywhere and not mach/gpio.h
Signature · 1 line
viresh
PATCH v4 27/62 ST SPEAr: Adding support for SDHCI (SDIO)
In reply to Viresh Kumar--- arch/arm/mach-spear13xx/include/mach/generic.h | 1 + arch/arm/mach-spear13xx/spear1300_evb.c | 1 + arch/arm/mach-spear13xx/spear13xx.c | 34 +++++++++++++- arch/arm/mach-spear3xx/include/mach/generic.h | 13 ++++-- arch/arm/mach-spear3xx/include/mach/irqs.h | 4 +- arch/arm/mach-spear3xx/include/mach/spear300.h | 4 +- arch/arm/mach-spear3xx/include/mach/spear320.h | 6 +- arch/arm/mach-spear3xx/spear300.c | 62 ++++++++++++++++++++---- arch/arm/mach-spear3xx/spear300_evb.c | 18 +++++++- arch/arm/mach-spear3xx/spear320.c | 43 +++++++++++++---- arch/arm/mach-spear3xx/spear320_evb.c | 15 +++++- 11 files changed, 167 insertions(+), 34 deletions(-)
arch/arm/mach-spear13xx/include/mach/generic.h +1 -0
@@ -40,6 +40,7 @@ extern struct platform_device spear13xx_nand_device;extern struct platform_device spear13xx_ohci0_device;extern struct platform_device spear13xx_ohci1_device;extern struct platform_device spear13xx_rtc_device; +extern struct platform_device spear13xx_sdhci_device;extern struct sys_timer spear13xx_timer;/* Add spear1300 machine device structure declarations here */
arch/arm/mach-spear13xx/spear1300_evb.c +1 -0
@@ -42,6 +42,7 @@ static struct platform_device *plat_devs[] __initdata = { &spear13xx_ohci0_device, &spear13xx_ohci1_device, &spear13xx_rtc_device, + &spear13xx_sdhci_device, };/* keyboard specific platform data */
arch/arm/mach-spear13xx/spear13xx.c +33 -1
@@ -330,6 +330,16 @@ struct platform_device spear13xx_rtc_device = { .resource = rtc_resources, }; +static void sdhci_enable (void ) +{ +unsigned val =readl (PERIP_CFG ); + +/* This function enables SD/MMC interface out of SD/MMC, CF, XD */ + val &= ~(MCIF_SEL_MASK <<MCIF_SEL_SHIFT ); + val |=SD_MMC_ACTIVE <<MCIF_SEL_SHIFT ; +writel (val,PERIP_CFG ); +} +#ifdef CONFIG_PCIEPORTBUS /* PCIE0 clock always needs to be enabled if any of the three PCIE port * have to be used. So call this function from the board initilization
@@ -358,10 +368,32 @@ int enable_pcie0_clk(void) }#endif +/* sdhci (sdio) device declaration */ +static struct resource sdhci_resources[] = { + { + .start =SPEAR13XX_MCIF_SDHCI_BASE , + .end =SPEAR13XX_MCIF_SDHCI_BASE +SZ_256 -1 , + .flags =IORESOURCE_MEM , + }, { + .start =IRQ_SDHCI , + .flags =IORESOURCE_IRQ , + } +}; + +struct platform_device spear13xx_sdhci_device = { + .dev = { + .coherent_dma_mask = ~0 , + }, + .name ="sdhci" , + .id =-1 , + .num_resources =ARRAY_SIZE (sdhci_resources), + .resource = sdhci_resources, +}; +/* Do spear13xx familiy common initialization part here */ void __init spear13xx_init (void ) { -/* nothing to do for now */ +sdhci_enable (); }/* This will initialize vic */
arch/arm/mach-spear3xx/include/mach/generic.h +9 -4
@@ -115,6 +115,7 @@ extern struct platform_device nand0_device;extern struct platform_device nand1_device;extern struct platform_device nand2_device;extern struct platform_device nand3_device; +extern struct platform_device sdhci_device;/* pad mux modes */ extern struct pmx_mode nand_mode;
@@ -143,12 +144,15 @@ extern struct pmx_dev pmx_telecom_camera;extern struct pmx_dev pmx_telecom_dac;extern struct pmx_dev pmx_telecom_i2s;extern struct pmx_dev pmx_telecom_boot_pins; -extern struct pmx_dev pmx_telecom_sdio_4bit; -extern struct pmx_dev pmx_telecom_sdio_8bit; +extern struct pmx_dev pmx_telecom_sdhci_4bit; +extern struct pmx_dev pmx_telecom_sdhci_8bit;extern struct pmx_dev pmx_gpio1;/* Add spear300 machine function declarations here */ void __init spear300_init (void ); +#define SDHCI_MEM_ENB 0x1 +#define I2S_MEM_ENB 0x2 +void sdhci_i2s_mem_enable (u8 mask);/* Add misc structure declarations here */ extern struct clcd_board clcd_plat_data;
@@ -181,6 +185,7 @@ extern struct platform_device i2c1_device;extern struct platform_device nand_device;extern struct platform_device plgpio_device;extern struct platform_device pwm_device; +extern struct platform_device sdhci_device;/* pad mux modes */ extern struct pmx_mode auto_net_smii_mode;
@@ -193,14 +198,14 @@ extern struct pmx_dev pmx_clcd;extern struct pmx_dev pmx_emi;extern struct pmx_dev pmx_fsmc;extern struct pmx_dev pmx_spp; -extern struct pmx_dev pmx_sdio; +extern struct pmx_dev pmx_sdhci;extern struct pmx_dev pmx_i2s;extern struct pmx_dev pmx_uart1;extern struct pmx_dev pmx_uart1_modem;extern struct pmx_dev pmx_uart2;extern struct pmx_dev pmx_touchscreen;extern struct pmx_dev pmx_can; -extern struct pmx_dev pmx_sdio_led; +extern struct pmx_dev pmx_sdhci_led;extern struct pmx_dev pmx_pwm0;extern struct pmx_dev pmx_pwm1;extern struct pmx_dev pmx_pwm2;
arch/arm/mach-spear3xx/include/mach/irqs.h +2 -2
@@ -69,7 +69,7 @@#define IRQ_CLCD IRQ_GEN_RAS_3/* IRQs sharing IRQ_INTRCOMM_RAS_ARM */ -#define IRQ_SDIO IRQ_INTRCOMM_RAS_ARM +#define IRQ_SDHCI IRQ_INTRCOMM_RAS_ARM/* GPIO pins virtual irqs */ #define SPEAR_GPIO_INT_BASE (VIRQ_START + 9)
@@ -115,7 +115,7 @@#define VIRQ_SPP (VIRQ_START + 2)/* IRQs sharing IRQ_GEN_RAS_2 */ -#define IRQ_SDIO IRQ_GEN_RAS_2 +#define IRQ_SDHCI IRQ_GEN_RAS_2/* IRQs sharing IRQ_GEN_RAS_3 */ #define VIRQ_PLGPIO (VIRQ_START + 3)
arch/arm/mach-spear3xx/include/mach/spear300.h +2 -2
@@ -39,8 +39,8 @@#define SPEAR300_CLCD_BASE 0x60000000#define SPEAR300_CLCD_SIZE 0x10000000 -#define SPEAR300_SDIO_BASE 0x70000000 -#define SPEAR300_SDIO_SIZE 0x10000000 +#define SPEAR300_SDHCI_BASE 0x70000000 +#define SPEAR300_SDHCI_SIZE 0x10000000#define SPEAR300_NAND_0_BASE 0x80000000#define SPEAR300_NAND_0_SIZE 0x04000000
arch/arm/mach-spear3xx/include/mach/spear320.h +3 -3
@@ -28,8 +28,8 @@#define SPEAR320_I2S_BASE 0x60000000#define SPEAR320_I2S_SIZE 0x10000000 -#define SPEAR320_SDIO_BASE 0x70000000 -#define SPEAR320_SDIO_SIZE 0x10000000 +#define SPEAR320_SDHCI_BASE 0x70000000 +#define SPEAR320_SDHCI_SIZE 0x10000000#define SPEAR320_CLCD_BASE 0x90000000#define SPEAR320_CLCD_SIZE 0x10000000
@@ -77,7 +77,7 @@#define EMI_IRQ_MASK (1 << 7)#define CLCD_IRQ_MASK (1 << 8)#define SPP_IRQ_MASK (1 << 9) -#define SDIO_IRQ_MASK (1 << 10) +#define SDHCI_IRQ_MASK (1 << 10)#define CAN_U_IRQ_MASK (1 << 11)#define CAN_L_IRQ_MASK (1 << 12)#define UART1_IRQ_MASK (1 << 13)
arch/arm/mach-spear3xx/spear300.c +52 -10
95 lines not on this page · raw message
arch/arm/mach-spear3xx/spear300_evb.c +17 -1
@@ -17,6 +17,7 @@#include <asm/mach-types.h> #include <linux/spi/flash.h> #include <linux/spi/spi.h> +#include <linux/mmc/sdhci-spear.h> #include <mach/generic.h> #include <mach/gpio.h> #include <mach/spear.h>
@@ -36,7 +37,7 @@ static struct pmx_dev *pmx_devs[] = {/* spear300 specific devices */ &pmx_fsmc_2_chips, &pmx_clcd, - &pmx_telecom_sdio_4bit, + &pmx_telecom_sdhci_4bit, &pmx_gpio1, };
@@ -63,6 +64,15 @@ static struct platform_device *plat_devs[] __initdata = {/* spear300 specific devices */ &kbd_device, + &sdhci_device, +}; + +/* sdhci board specific information */ +static struct sdhci_plat_data sdhci_plat_data = { + .card_power_gpio =RAS_GPIO_2 , + .power_active_high =0 , + .power_always_enb =0 , + .card_int_gpio =RAS_GPIO_0 , };/* keyboard specific platform data */
@@ -111,6 +121,12 @@ static void __init spear300_evb_init(void)fsmc_nand_set_plat_data (&nand0_device,NULL ,0 ,NAND_SKIP_BBTSCAN ,FSMC_NAND_BW8 ); +/* set sdhci device platform data */ +sdhci_set_plat_data (&sdhci_device, &sdhci_plat_data); + +/* Enable sdhci memory */ +sdhci_i2s_mem_enable (SDHCI_MEM_ENB ); +/* call spear300 machine init function */ spear300_init ();
arch/arm/mach-spear3xx/spear320.c +33 -10
79 lines not on this page · raw message
arch/arm/mach-spear3xx/spear320_evb.c +14 -1
@@ -16,6 +16,7 @@#include <asm/mach/arch.h> #include <asm/mach-types.h> #include <linux/spi/flash.h> +#include <linux/mmc/sdhci-spear.h> #include <linux/spi/spi.h> #include <mach/generic.h> #include <mach/gpio.h>
@@ -33,7 +34,7 @@ static struct pmx_dev *pmx_devs[] = {/* spear320 specific devices */ &pmx_fsmc, - &pmx_sdio, + &pmx_sdhci, &pmx_i2s, &pmx_uart1, &pmx_uart2,
@@ -67,6 +68,15 @@ static struct platform_device *plat_devs[] __initdata = { &i2c1_device, &plgpio_device, &pwm_device, + &sdhci_device, +}; + +/* sdhci board specific information */ +static struct sdhci_plat_data sdhci_plat_data = { + .card_power_gpio =PLGPIO_61 , + .power_active_high =0 , + .power_always_enb =1 , + .card_int_gpio =-1 , }; static struct spi_board_info __initdata spi_board_info[] = {
@@ -76,6 +86,9 @@ static void __init spear320_evb_init(void) {unsigned int i; +/* set sdhci device platform data */ +sdhci_set_plat_data (&sdhci_device, &sdhci_plat_data); +/* padmux initialization, must be done before spear320_init */ pmx_driver.mode = &auto_net_mii_mode; pmx_driver.devs = pmx_devs;
Signature · 1 line
1.7.2.2
PATCH v4 28/62 ST SPEAr: Changing resource size of amba devices to SZ_4K
In reply to Viresh Kumar--- arch/arm/mach-spear3xx/spear300.c | 2 +- arch/arm/mach-spear3xx/spear320.c | 2 +- arch/arm/mach-spear3xx/spear3xx.c | 2 +- arch/arm/mach-spear6xx/spear6xx.c | 8 +++----- 4 files changed, 6 insertions(+), 8 deletions(-)
arch/arm/mach-spear3xx/spear300.c +1 -1
@@ -382,7 +382,7 @@ struct amba_device clcd_device = { }, .res = { .start = SPEAR300_CLCD_BASE, - .end = SPEAR300_CLCD_BASE + SPEAR300_CLCD_SIZE - 1, + .end = SPEAR300_CLCD_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, .dma_mask = ~0,
arch/arm/mach-spear3xx/spear320.c +1 -1
@@ -399,7 +399,7 @@ struct amba_device clcd_device = { }, .res = { .start = SPEAR320_CLCD_BASE, - .end = SPEAR320_CLCD_BASE + SPEAR320_CLCD_SIZE - 1, + .end = SPEAR320_CLCD_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, .dma_mask = ~0,
arch/arm/mach-spear3xx/spear3xx.c +1 -1
@@ -79,7 +79,7 @@ struct amba_device uart_device = { }, .res = { .start = SPEAR3XX_ICM1_UART_BASE, - .end = SPEAR3XX_ICM1_UART_BASE + SPEAR3XX_ICM1_UART_SIZE - 1, + .end = SPEAR3XX_ICM1_UART_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, .irq = {IRQ_UART, NO_IRQ},
arch/arm/mach-spear6xx/spear6xx.c +3 -5
@@ -35,7 +35,7 @@ struct amba_device clcd_device = { }, .res = { .start = SPEAR6XX_ICM3_CLCD_BASE, - .end = SPEAR6XX_ICM3_CLCD_BASE + SPEAR6XX_ICM3_CLCD_SIZE - 1, + .end = SPEAR6XX_ICM3_CLCD_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, .dma_mask = ~0,
@@ -117,8 +117,7 @@ struct amba_device uart_device[] = { }, .res = { .start = SPEAR6XX_ICM1_UART0_BASE, - .end = SPEAR6XX_ICM1_UART0_BASE + - SPEAR6XX_ICM1_UART0_SIZE - 1, + .end = SPEAR6XX_ICM1_UART0_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, .irq = {IRQ_UART_0, NO_IRQ},
@@ -128,8 +127,7 @@ struct amba_device uart_device[] = { }, .res = { .start = SPEAR6XX_ICM1_UART1_BASE, - .end = SPEAR6XX_ICM1_UART1_BASE + - SPEAR6XX_ICM1_UART1_SIZE - 1, + .end = SPEAR6XX_ICM1_UART1_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, .irq = {IRQ_UART_1, NO_IRQ},
Signature · 1 line
1.7.2.2
PATCH v4 29/62 ST SPEAr: Replacing SIZE macro's with actual required size
In reply to Viresh KumarFrom: Shiraz Hashim <[email protected]>
In arch specific files SIZE macro's were defined which were used for creating memory/io mappings for sepecific devices. These macro's are coming straight from h/w user manual and are much greated than required sizes. Replacing these macros by actual required size.
--- arch/arm/mach-spear3xx/spear300.c | 9 +++------ arch/arm/mach-spear3xx/spear310.c | 2 +- arch/arm/mach-spear3xx/spear320.c | 2 +- arch/arm/mach-spear3xx/spear3xx.c | 8 ++++---- arch/arm/mach-spear6xx/spear6xx.c | 10 +++++----- 5 files changed, 14 insertions(+), 17 deletions(-)
arch/arm/mach-spear3xx/spear300.c +3 -6
@@ -604,8 +604,7 @@ struct spear_shirq shirq_ras1 = {void sdhci_i2s_mem_enable (u8 mask) {u32 val; -void __iomem *base =ioremap (SPEAR300_SOC_CONFIG_BASE , -SPEAR300_SOC_CONFIG_SIZE ); +void __iomem *base =ioremap (SPEAR300_SOC_CONFIG_BASE ,SZ_4K );if (!base) {pr_debug ("sdhci_i2s_enb: ioremap fail\n" );return ;
@@ -628,8 +627,7 @@ void __init spear300_init(void)spear3xx_init ();/* shared irq registration */ - shirq_ras1.regs.base = -ioremap (SPEAR300_TELECOM_BASE ,SPEAR300_TELECOM_REG_SIZE ); + shirq_ras1.regs.base =ioremap (SPEAR300_TELECOM_BASE ,SZ_4K );if (shirq_ras1.regs.base) { ret =spear_shirq_register (&shirq_ras1);if (ret)
@@ -637,8 +635,7 @@ void __init spear300_init(void) }/* pmx initialization */ - pmx_driver.base =ioremap (SPEAR300_SOC_CONFIG_BASE , -SPEAR300_SOC_CONFIG_SIZE ); + pmx_driver.base =ioremap (SPEAR300_SOC_CONFIG_BASE ,SZ_4K );if (pmx_driver.base) { ret =pmx_register (&pmx_driver);if (ret)
arch/arm/mach-spear3xx/spear310.c +1 -1
@@ -362,7 +362,7 @@ void __init spear310_init(void)spear3xx_init ();/* shared irq registration */ - base =ioremap (SPEAR310_SOC_CONFIG_BASE ,SPEAR310_SOC_CONFIG_SIZE ); + base =ioremap (SPEAR310_SOC_CONFIG_BASE ,SZ_4K );if (base) {/* shirq 1 */ shirq_ras1.regs.base = base;
arch/arm/mach-spear3xx/spear320.c +1 -1
@@ -694,7 +694,7 @@ void __init spear320_init(void)spear3xx_init ();/* shared irq registration */ - base =ioremap (SPEAR320_SOC_CONFIG_BASE ,SPEAR320_SOC_CONFIG_SIZE ); + base =ioremap (SPEAR320_SOC_CONFIG_BASE ,SZ_4K );if (base) {/* shirq 1 */ shirq_ras1.regs.base = base;
arch/arm/mach-spear3xx/spear3xx.c +4 -4
@@ -235,22 +235,22 @@ struct map_desc spear3xx_io_desc[] __initdata = { { .virtual = VA_SPEAR3XX_ICM1_UART_BASE, .pfn = __phys_to_pfn(SPEAR3XX_ICM1_UART_BASE), - .length = SPEAR3XX_ICM1_UART_SIZE, + .length = SZ_4K, .type =MT_DEVICE }, { .virtual = VA_SPEAR3XX_ML1_VIC_BASE, .pfn = __phys_to_pfn(SPEAR3XX_ML1_VIC_BASE), - .length = SPEAR3XX_ML1_VIC_SIZE, + .length = SZ_4K, .type =MT_DEVICE }, { .virtual = VA_SPEAR3XX_ICM3_SYS_CTRL_BASE, .pfn = __phys_to_pfn(SPEAR3XX_ICM3_SYS_CTRL_BASE), - .length = SPEAR3XX_ICM3_SYS_CTRL_SIZE, + .length = SZ_4K, .type =MT_DEVICE }, { .virtual = VA_SPEAR3XX_ICM3_MISC_REG_BASE, .pfn = __phys_to_pfn(SPEAR3XX_ICM3_MISC_REG_BASE), - .length = SPEAR3XX_ICM3_MISC_REG_SIZE, + .length = SZ_4K, .type =MT_DEVICE }, };
arch/arm/mach-spear6xx/spear6xx.c +5 -5
@@ -389,27 +389,27 @@ static struct map_desc spear6xx_io_desc[] __initdata = { { .virtual = VA_SPEAR6XX_ICM1_UART0_BASE, .pfn = __phys_to_pfn(SPEAR6XX_ICM1_UART0_BASE), - .length = SPEAR6XX_ICM1_UART0_SIZE, + .length = SZ_4K, .type =MT_DEVICE }, { .virtual = VA_SPEAR6XX_CPU_VIC_PRI_BASE, .pfn = __phys_to_pfn(SPEAR6XX_CPU_VIC_PRI_BASE), - .length = SPEAR6XX_CPU_VIC_PRI_SIZE, + .length = SZ_4K, .type =MT_DEVICE }, { .virtual = VA_SPEAR6XX_CPU_VIC_SEC_BASE, .pfn = __phys_to_pfn(SPEAR6XX_CPU_VIC_SEC_BASE), - .length = SPEAR6XX_CPU_VIC_SEC_SIZE, + .length = SZ_4K, .type =MT_DEVICE }, { .virtual = VA_SPEAR6XX_ICM3_SYS_CTRL_BASE, .pfn = __phys_to_pfn(SPEAR6XX_ICM3_SYS_CTRL_BASE), - .length = SPEAR6XX_ICM3_MISC_REG_BASE, + .length = SZ_4K, .type =MT_DEVICE }, { .virtual = VA_SPEAR6XX_ICM3_MISC_REG_BASE, .pfn = __phys_to_pfn(SPEAR6XX_ICM3_MISC_REG_BASE), - .length = SPEAR6XX_ICM3_MISC_REG_SIZE, + .length = SZ_4K, .type =MT_DEVICE }, };
Signature · 1 line
1.7.2.2
PATCH v4 30/62 SPEAr: defines base addresses as ulong.
In reply to Viresh KumarFrom: Shiraz Hashim <[email protected]>
This patch defines base addresses as ulong.
--- arch/arm/mach-spear13xx/include/mach/spear.h | 91 ++++++------ arch/arm/mach-spear3xx/include/mach/spear.h | 134 +++++------------- arch/arm/mach-spear3xx/include/mach/spear300.h | 59 ++------ arch/arm/mach-spear3xx/include/mach/spear310.h | 34 ++--- arch/arm/mach-spear3xx/include/mach/spear320.h | 68 +++------- arch/arm/mach-spear6xx/include/mach/spear.h | 174 ++++++----------------- 6 files changed, 172 insertions(+), 388 deletions(-)
arch/arm/mach-spear13xx/include/mach/spear.h +46 -45
@@ -14,12 +14,13 @@#ifndef __MACH_SPEAR13XX_H#define __MACH_SPEAR13XX_H +#include <asm/memory.h> #include <mach/spear1300.h> -#define SPEAR13XX_L2CC_BASE 0xED000000 +#define SPEAR13XX_L2CC_BASE UL(0xED000000)/* ARM9SMP peripheral base address */ -#define SPEAR13XX_A9SM_PERIP_BASE 0xEC800000 +#define SPEAR13XX_A9SM_PERIP_BASE UL(0xEC800000)#define VA_SPEAR13XX_A9SM_PERIP_BASE IO_ADDRESS(SPEAR13XX_A9SM_PERIP_BASE)/* A9SM peripheral offsets */ #define SPEAR13XX_SCU_BASE (SPEAR13XX_A9SM_PERIP_BASE + 0x00)
@@ -29,26 +30,26 @@#define SPEAR13XX_WDT_BASE (SPEAR13XX_A9SM_PERIP_BASE + 0x620)#define SPEAR13XX_GIC_DIST_BASE (SPEAR13XX_A9SM_PERIP_BASE + 0x1000) -#define SPEAR13XX_UART_BASE 0xE0000000 +#define SPEAR13XX_UART_BASE UL(0xE0000000)#define VA_SPEAR13XX_UART_BASE IO_ADDRESS(SPEAR13XX_UART_BASE) -#define SPEAR13XX_ADC_BASE 0xE0080000 -#define SPEAR13XX_SSP_BASE 0xE0100000 -#define SPEAR13XX_I2S0_BASE 0xE0180000 -#define SPEAR13XX_I2S1_BASE 0xE0200000 -#define SPEAR13XX_I2C_BASE 0xE0280000 -#define SPEAR13XX_KBD_BASE 0xE0300000 -#define SPEAR13XX_GPT0_BASE 0xE0380000 -#define SPEAR13XX_GPT1_BASE 0xE0400000 -#define SPEAR13XX_GPT2_BASE 0xE0480000 -#define SPEAR13XX_GPT3_BASE 0xE0500000 -#define SPEAR13XX_RTC_BASE 0xE0580000 -#define SPEAR13XX_GPIO0_BASE 0xE0600000 -#define SPEAR13XX_GPIO1_BASE 0xE0680000 -#define SPEAR13XX_MISC_BASE 0xE0700000 +#define SPEAR13XX_ADC_BASE UL(0xE0080000) +#define SPEAR13XX_SSP_BASE UL(0xE0100000) +#define SPEAR13XX_I2S0_BASE UL(0xE0180000) +#define SPEAR13XX_I2S1_BASE UL(0xE0200000) +#define SPEAR13XX_I2C_BASE UL(0xE0280000) +#define SPEAR13XX_KBD_BASE UL(0xE0300000) +#define SPEAR13XX_GPT0_BASE UL(0xE0380000) +#define SPEAR13XX_GPT1_BASE UL(0xE0400000) +#define SPEAR13XX_GPT2_BASE UL(0xE0480000) +#define SPEAR13XX_GPT3_BASE UL(0xE0500000) +#define SPEAR13XX_RTC_BASE UL(0xE0580000) +#define SPEAR13XX_GPIO0_BASE UL(0xE0600000) +#define SPEAR13XX_GPIO1_BASE UL(0xE0680000) +#define SPEAR13XX_MISC_BASE UL(0xE0700000)#define VA_SPEAR13XX_MISC_BASE IO_ADDRESS(SPEAR13XX_MISC_BASE) -#define SPEAR13XX_SYSRAM0_BASE 0xB3800000 +#define SPEAR13XX_SYSRAM0_BASE UL(0xB3800000)#define SPEAR13XX_SYSRAM0_SIZE 0x00800000/*
@@ -57,34 +58,34 @@*/ #define SPEAR13XX_SYS_LOCATION (SPEAR13XX_SYSRAM0_BASE + 0x600) -#define SPEAR13XX_SYSRAM1_BASE 0xE0800000 +#define SPEAR13XX_SYSRAM1_BASE UL(0xE0800000)#define SPEAR13XX_SYSRAM1_SIZE 0x00800000 -#define SPEAR13XX_CLCD_BASE 0xE1000000 -#define SPEAR13XX_C3_BASE 0xE1800000 -#define SPEAR13XX_GETH_BASE 0xE2000000 -#define SPEAR13XX_UPD_BASE 0xE2800000 -#define SPEAR13XX_UDC_BASE 0xE3800000 -#define SPEAR13XX_UHC0_OHCI_BASE 0xE4000000 -#define SPEAR13XX_UHC0_EHCI_BASE 0xE4800000 -#define SPEAR13XX_UHC1_OHCI_BASE 0xE5000000 -#define SPEAR13XX_UHC1_EHCI_BASE 0xE5800000 -#define SPEAR13XX_SMI_MEM_BASE 0xE6000000 -#define SPEAR13XX_SMI_CTRL_BASE 0xEA000000 -#define SPEAR13XX_DMAC0_BASE 0xEA800000 -#define SPEAR13XX_DMAC1_BASE 0xEB000000 -#define SPEAR13XX_MII_PHY_BASE 0xEB800000 -#define SPEAR13XX_MPMC_BASE 0xEC000000 -#define SPEAR13XX_PCIE0_BASE 0x80000000 -#define SPEAR13XX_PCIE1_BASE 0x90000000 -#define SPEAR13XX_PCIE2_BASE 0xC0000000 -#define SPEAR13XX_PCIE0_APP_BASE 0xB1000000 -#define SPEAR13XX_PCIE1_APP_BASE 0xB1800000 -#define SPEAR13XX_PCIE2_APP_BASE 0xB4000000 -#define SPEAR13XX_FSMC_MEM_BASE 0xA0000000 -#define SPEAR13XX_FSMC_BASE 0xB0000000 -#define SPEAR13XX_JPEG_BASE 0xB2000000 -#define SPEAR13XX_MCIF_CF_BASE 0xB2800000 -#define SPEAR13XX_MCIF_SDHCI_BASE 0xB3000000 +#define SPEAR13XX_CLCD_BASE UL(0xE1000000) +#define SPEAR13XX_C3_BASE UL(0xE1800000) +#define SPEAR13XX_GETH_BASE UL(0xE2000000) +#define SPEAR13XX_UPD_BASE UL(0xE2800000) +#define SPEAR13XX_UDC_BASE UL(0xE3800000) +#define SPEAR13XX_UHC0_OHCI_BASE UL(0xE4000000) +#define SPEAR13XX_UHC0_EHCI_BASE UL(0xE4800000) +#define SPEAR13XX_UHC1_OHCI_BASE UL(0xE5000000) +#define SPEAR13XX_UHC1_EHCI_BASE UL(0xE5800000) +#define SPEAR13XX_SMI_MEM_BASE UL(0xE6000000) +#define SPEAR13XX_SMI_CTRL_BASE UL(0xEA000000) +#define SPEAR13XX_DMAC0_BASE UL(0xEA800000) +#define SPEAR13XX_DMAC1_BASE UL(0xEB000000) +#define SPEAR13XX_MII_PHY_BASE UL(0xEB800000) +#define SPEAR13XX_MPMC_BASE UL(0xEC000000) +#define SPEAR13XX_PCIE0_BASE UL(0x80000000) +#define SPEAR13XX_PCIE1_BASE UL(0x90000000) +#define SPEAR13XX_PCIE2_BASE UL(0xC0000000) +#define SPEAR13XX_PCIE0_APP_BASE UL(0xB1000000) +#define SPEAR13XX_PCIE1_APP_BASE UL(0xB1800000) +#define SPEAR13XX_PCIE2_APP_BASE UL(0xB4000000) +#define SPEAR13XX_FSMC_MEM_BASE UL(0xA0000000) +#define SPEAR13XX_FSMC_BASE UL(0xB0000000) +#define SPEAR13XX_JPEG_BASE UL(0xB2000000) +#define SPEAR13XX_MCIF_CF_BASE UL(0xB2800000) +#define SPEAR13XX_MCIF_SDHCI_BASE UL(0xB3000000)/* Debug uart for linux, will be used for debug and uncompress messages */ #define SPEAR_DBG_UART_BASE SPEAR13XX_UART_BASE
arch/arm/mach-spear3xx/include/mach/spear.h +36 -98
160 lines not on this page · raw message
arch/arm/mach-spear3xx/include/mach/spear300.h +15 -44
73 lines not on this page · raw message
arch/arm/mach-spear3xx/include/mach/spear310.h +11 -23
@@ -16,30 +16,18 @@#ifndef __MACH_SPEAR310_H#define __MACH_SPEAR310_H -#define SPEAR310_NAND_BASE 0x40000000 -#define SPEAR310_NAND_SIZE 0x04000000 +#define SPEAR310_NAND_BASE UL(0x40000000) +#define SPEAR310_FSMC_BASE UL(0x44000000) +#define SPEAR310_UART1_BASE UL(0xB2000000) +#define SPEAR310_UART2_BASE UL(0xB2080000) +#define SPEAR310_UART3_BASE UL(0xB2100000) +#define SPEAR310_UART4_BASE UL(0xB2180000) +#define SPEAR310_UART5_BASE UL(0xB2200000) +#define SPEAR310_HDLC_BASE UL(0xB2800000) +#define SPEAR310_RS485_0_BASE UL(0xB3000000) +#define SPEAR310_RS485_1_BASE UL(0xB3800000) +#define SPEAR310_SOC_CONFIG_BASE UL(0xB4000000) -#define SPEAR310_FSMC_BASE 0x44000000 -#define SPEAR310_FSMC_SIZE 0x01000000 - -#define SPEAR310_UART1_BASE 0xB2000000 -#define SPEAR310_UART2_BASE 0xB2080000 -#define SPEAR310_UART3_BASE 0xB2100000 -#define SPEAR310_UART4_BASE 0xB2180000 -#define SPEAR310_UART5_BASE 0xB2200000 -#define SPEAR310_UART_SIZE 0x00080000 - -#define SPEAR310_HDLC_BASE 0xB2800000 -#define SPEAR310_HDLC_SIZE 0x00800000 - -#define SPEAR310_RS485_0_BASE 0xB3000000 -#define SPEAR310_RS485_0_SIZE 0x00800000 - -#define SPEAR310_RS485_1_BASE 0xB3800000 -#define SPEAR310_RS485_1_SIZE 0x00800000 - -#define SPEAR310_SOC_CONFIG_BASE 0xB4000000 -#define SPEAR310_SOC_CONFIG_SIZE 0x00000070/* Interrupt registers offsets and masks */ #define INT_STS_MASK_REG 0x04#define SMII0_IRQ_MASK (1 << 0)
arch/arm/mach-spear3xx/include/mach/spear320.h +18 -50
75 lines not on this page · raw message
arch/arm/mach-spear6xx/include/mach/spear.h +46 -128
199 lines not on this page · raw message
Signature · 1 line
1.7.2.2
PATCH v4 31/62 ST SPEAr: Adding miscellaneous devices
In reply to Viresh Kumar--- arch/arm/mach-spear3xx/include/mach/generic.h | 7 ++ arch/arm/mach-spear3xx/spear310.c | 115 +++++++++++++++++++------ arch/arm/mach-spear3xx/spear320.c | 26 ++++++ 3 files changed, 123 insertions(+), 25 deletions(-)
arch/arm/mach-spear3xx/include/mach/generic.h +7 -0
@@ -160,6 +160,11 @@ extern struct clcd_board clcd_plat_data;/* spear310 declarations */ #elif defined(CONFIG_MACH_SPEAR310 )/* Add spear310 machine device structure declarations here */ +extern struct amba_device uart1_device; +extern struct amba_device uart2_device; +extern struct amba_device uart3_device; +extern struct amba_device uart4_device; +extern struct amba_device uart5_device;extern struct platform_device plgpio_device;extern struct platform_device nand_device;
@@ -181,6 +186,8 @@ void __init spear310_init(void);/* Add spear320 machine device structure declarations here */ extern struct amba_device clcd_device;extern struct amba_device ssp_device[]; +extern struct amba_device uart1_device; +extern struct amba_device uart2_device;extern struct platform_device i2c1_device;extern struct platform_device nand_device;extern struct platform_device plgpio_device;
arch/arm/mach-spear3xx/spear310.c +90 -25
127 lines not on this page · raw message
arch/arm/mach-spear3xx/spear320.c +26 -0
@@ -447,6 +447,32 @@ struct amba_device ssp_device[] = { } }; +/* uart1 device registeration */ +struct amba_device uart1_device = { + .dev = { + .init_name ="uart1" , + }, + .res = { + .start =SPEAR320_UART1_BASE , + .end =SPEAR320_UART1_BASE +SZ_4K -1 , + .flags =IORESOURCE_MEM , + }, + .irq = {VIRQ_UART1 ,NO_IRQ }, +}; + +/* uart2 device registeration */ +struct amba_device uart2_device = { + .dev = { + .init_name ="uart2" , + }, + .res = { + .start =SPEAR320_UART2_BASE , + .end =SPEAR320_UART2_BASE +SZ_4K -1 , + .flags =IORESOURCE_MEM , + }, + .irq = {VIRQ_UART2 ,NO_IRQ }, +}; +/* i2c1 device registeration */ static struct resource i2c1_resources[] = { {
Signature · 1 line
1.7.2.2
PATCH v4 32/62 ST SPEAr 13xx : Adding support for SPEAr1310
In reply to Viresh KumarFrom: Bhupesh Sharma <[email protected]>
This patch adds support for SPEAr1310 Machine and evaluation board
--- arch/arm/Makefile | 1 + arch/arm/configs/spear13xx_defconfig | 1 + arch/arm/mach-spear13xx/Kconfig | 11 ++ arch/arm/mach-spear13xx/Makefile | 6 + arch/arm/mach-spear13xx/include/mach/generic.h | 21 +++- arch/arm/mach-spear13xx/include/mach/irqs.h | 37 ++++++ arch/arm/mach-spear13xx/include/mach/spear.h | 1 + arch/arm/mach-spear13xx/include/mach/spear1310.h | 31 +++++ arch/arm/mach-spear13xx/spear1310.c | 62 ++++++++++ arch/arm/mach-spear13xx/spear1310_evb.c | 133 ++++++++++++++++++++++ arch/arm/plat-spear/Makefile | 1 + 11 files changed, 302 insertions(+), 3 deletions(-) create mode 100644 arch/arm/mach-spear13xx/include/mach/spear1310.h create mode 100644 arch/arm/mach-spear13xx/spear1310.c create mode 100644 arch/arm/mach-spear13xx/spear1310_evb.c
arch/arm/Makefile +1 -0
@@ -194,6 +194,7 @@ machine-$(CONFIG_ARCH_W90X900) := w90x900 machine-$(CONFIG_ARCH_NUC93X) := nuc93x machine-$(CONFIG_FOOTBRIDGE) := footbridge machine-$(CONFIG_MACH_SPEAR1300) := spear13xx +machine-$(CONFIG_MACH_SPEAR1310) := spear13xx machine-$(CONFIG_MACH_SPEAR300) := spear3xx machine-$(CONFIG_MACH_SPEAR310) := spear3xx machine-$(CONFIG_MACH_SPEAR320) := spear3xx
arch/arm/configs/spear13xx_defconfig +1 -0
@@ -9,6 +9,7 @@ CONFIG_MODVERSIONS=y CONFIG_PLAT_SPEAR=y CONFIG_ARCH_SPEAR13XX=y CONFIG_BOARD_SPEAR1300_EVB=y +CONFIG_BOARD_SPEAR1310_EVB=y CONFIG_SMP=y CONFIG_NR_CPUS=2 CONFIG_AEABI=y
arch/arm/mach-spear13xx/Kconfig +11 -0
@@ -11,6 +11,12 @@ config BOARD_SPEAR1300_EVB help Supports ST SPEAr1300 Evaluation Board +config BOARD_SPEAR1310_EVB + bool "SPEAr1310 Evaluation Board" + select MACH_SPEAR1310 + help + Supports ST SPEAr1310 Evaluation Board + endmenu config MACH_SPEAR1300
@@ -18,4 +24,9 @@ config MACH_SPEAR1300 help Supports ST SPEAr1300 Machine +config MACH_SPEAR1310 + bool "SPEAr1310" + help + Supports ST SPEAr1310 Machine + endif #ARCH_SPEAR13XX
arch/arm/mach-spear13xx/Makefile +6 -0
@@ -13,3 +13,9 @@ obj-$(CONFIG_MACH_SPEAR1300) += spear1300.o # spear1300 boards files obj-$(CONFIG_BOARD_SPEAR1300_EVB) += spear1300_evb.o + +# spear1310 specific files +obj-$(CONFIG_MACH_SPEAR1310) += spear1310.o + +# spear1310 boards files +obj-$(CONFIG_BOARD_SPEAR1310_EVB) += spear1310_evb.o
arch/arm/mach-spear13xx/include/mach/generic.h +18 -3
@@ -43,17 +43,32 @@ extern struct platform_device spear13xx_rtc_device;extern struct platform_device spear13xx_sdhci_device;extern struct sys_timer spear13xx_timer; -/* Add spear1300 machine device structure declarations here */ -/* Add spear13xx family function declarations here */ void __init clk_init (void );void __init i2c_register_default_devices (void );void __init spear_setup_timer (void ); -void __init spear1300_init (void );void __init spear13xx_map_io (void );void __init spear13xx_init_irq (void );void __init spear13xx_init (void );void __init nand_mach_init (u32 busw);void spear13xx_secondary_startup (void ); +/* spear1300 declarations */ +#ifdef CONFIG_MACH_SPEAR1300 +/* Add spear1300 machine function declarations here */ +void __init spear1300_init (void ); + +#endif /* CONFIG_MACH_SPEAR1300 */ + +/* spear1310 declarations */ +#ifdef CONFIG_MACH_SPEAR1310 +/* Add spear1310 machine device structure declarations here */ +extern struct platform_device spear1310_can0_device; +extern struct platform_device spear1310_can1_device; + +/* Add spear1310 machine function declarations here */ +void __init spear1310_init (void ); + +#endif /* CONFIG_MACH_SPEAR1310 */ +#endif /* __MACH_GENERIC_H */
arch/arm/mach-spear13xx/include/mach/irqs.h +37 -0
@@ -5,6 +5,7 @@* * Copyright (C) 2010 ST Microelectronics * Shiraz Hashim <[email protected]> +* Bhupesh Sharma <[email protected]> * * This file is licensed under the terms of the GNU General Public * License version 2. This program is licensed "as is" without any
@@ -84,6 +85,42 @@#define IRQ_PCIE1 (IRQ_SHPI_START + 69)#define IRQ_PCIE2 (IRQ_SHPI_START + 70) +/* Add spear1310 specific IRQs here */ +#ifdef CONFIG_MACH_SPEAR1310 +#define IRQ_FSMC_PC1 (IRQ_SHPI_START + 76) +#define IRQ_FSMC_PC2 (IRQ_SHPI_START + 77) +#define IRQ_FSMC_PC3 (IRQ_SHPI_START + 78) +#define IRQ_FSMC_PC4 (IRQ_SHPI_START + 79) +#define IRQ_RS4850 (IRQ_SHPI_START + 80) +#define IRQ_RS4851 (IRQ_SHPI_START + 81) +#define IRQ_CCAN0 (IRQ_SHPI_START + 82) +#define IRQ_CCAN1 (IRQ_SHPI_START + 83) +#define IRQ_TDM0 (IRQ_SHPI_START + 84) +#define IRQ_TDM1 (IRQ_SHPI_START + 85) +#define IRQ_UART0 (IRQ_SHPI_START + 86) +#define IRQ_UART1 (IRQ_SHPI_START + 87) +#define IRQ_UART2 (IRQ_SHPI_START + 88) +#define IRQ_UART3 (IRQ_SHPI_START + 89) +#define IRQ_UART4 (IRQ_SHPI_START + 90) +#define IRQ_I2C_CNTR (IRQ_SHPI_START + 91) +#define IRQ_GMAC0_SBD (IRQ_SHPI_START + 92) +#define IRQ_GMAC0_PMT (IRQ_SHPI_START + 93) +#define IRQ_GMAC1_SBD (IRQ_SHPI_START + 94) +#define IRQ_GMAC1_PMT (IRQ_SHPI_START + 95) +#define IRQ_GMAC2_SBD (IRQ_SHPI_START + 96) +#define IRQ_GMAC2_PMT (IRQ_SHPI_START + 97) +#define IRQ_GMAC3_SBD (IRQ_SHPI_START + 98) +#define IRQ_GMAC3_PMT (IRQ_SHPI_START + 99) +#define IRQ_GPIO (IRQ_SHPI_START + 100) +#define IRQ_PCI_BRDG_HOST_FATAL (IRQ_SHPI_START + 101) +#define IRQ_PCI_INTA (IRQ_SHPI_START + 102) +#define IRQ_PCI_INTB (IRQ_SHPI_START + 103) +#define IRQ_PCI_INTC (IRQ_SHPI_START + 104) +#define IRQ_PCI_INTD (IRQ_SHPI_START + 105) +#define IRQ_PCI_ME_TO_ARM (IRQ_SHPI_START + 106) +#define IRQ_PCI_SERR_TO_ARM (IRQ_SHPI_START + 107) +#endif /* CONFIG_MACH_SPEAR1310 */ +#define IRQ_GIC_END (IRQ_SHPI_START + 128)#define VIRQ_START IRQ_GIC_END
arch/arm/mach-spear13xx/include/mach/spear.h +1 -0
@@ -16,6 +16,7 @@#include <asm/memory.h> #include <mach/spear1300.h> +#include <mach/spear1310.h> #define SPEAR13XX_L2CC_BASE UL(0xED000000)
arch/arm/mach-spear13xx/include/mach/spear1310.h new file +31 -0
@@ -0,0 +1,31 @@ +/* +* arch/arm/mach-spear13xx/include/mach/spear1310.h +* +* SPEAr1310 Machine specific definition +* +* Copyright (C) 2010 ST Microelectronics +* Bhupesh Sharma <[email protected]> +* +* This file is licensed under the terms of the GNU General Public +* License version 2. This program is licensed "as is" without any +* warranty of any kind, whether express or implied. +*/ + +#ifdef CONFIG_MACH_SPEAR1310 + +#ifndef __MACH_SPEAR1310_H +#define __MACH_SPEAR1310_H + +#define SPEAR1310_CAN0_BASE UL(0x6DA00000) +#define SPEAR1310_CAN1_BASE UL(0x6DB00000) +#define SPEAR1310_RAS_BASE UL(0x6C800000) + +/* RAS Area Control Register */ +#define SPEAR1310_RAS_CTRL_REG0 (SPEAR1310_RAS_BASE + 0x0) +#define SPEAR1310_RAS_CTRL_REG1 (SPEAR1310_RAS_BASE + 0x4) +#define SPEAR1310_PHY_CLK_MASK 0xF +#define SPEAR1310_PHY_CLK_SHIFT 0 + +#endif /* __MACH_SPEAR1310_H */ + +#endif /* CONFIG_MACH_SPEAR1310 */
arch/arm/mach-spear13xx/spear1310.c new file +62 -0
62 lines not on this page · raw message
arch/arm/mach-spear13xx/spear1310_evb.c new file +133 -0
133 lines not on this page · raw message
arch/arm/plat-spear/Makefile +1 -0
@@ -10,6 +10,7 @@ obj-$(CONFIG_MACH_SPEAR310) += plgpio.o obj-$(CONFIG_MACH_SPEAR320) += plgpio.o obj-$(CONFIG_SPEAR_PWM) += pwm.o +obj-$(CONFIG_BOARD_SPEAR1310_EVB) += i2c_eval_board.o obj-$(CONFIG_BOARD_SPEAR1300_EVB) += i2c_eval_board.o obj-$(CONFIG_BOARD_SPEAR300_EVB) += i2c_eval_board.o obj-$(CONFIG_BOARD_SPEAR310_EVB) += i2c_eval_board.o
Signature · 1 line
1.7.2.2
PATCH v4 32/62 ST SPEAr 13xx : Adding support for SPEAr1310
Hi,
Quoted 8 lines · Viresh Kumar
From: Bhupesh Sharma <[email protected]>
This patch adds support for SPEAr1310 Machine and evaluation board
Signed-off-by Bhupesh Sharma <[email protected]>Signed-off-by shiraz hashim <[email protected]>Signed-off-by Viresh Kumar <[email protected]>---
[...]
Quoted 64 lines
arch/arm/mach-spear13xx/spear1310_evb.c new file +57
-0@@ -0,0 +1,133 @@ +/* +* arch/arm/mach-spear13xx/spear1310_evb.c +* +* SPEAr1310 evaluation board source file +* +* Copyright (C) 2010 ST Microelectronics +* Bhupesh Sharma <[email protected]> +* +* This file is licensed under the terms of the GNU General Public +* License version 2. This program is licensed "as is" without any +* warranty of any kind, whether express or implied. +*/ + +#include <linux/types.h> +#include <linux/gpio.h> +#include <linux/mtd/nand.h> +#include <linux/mtd/fsmc.h> +#include <linux/spi/flash.h> +#include <linux/spi/spi.h> +#include <asm/mach/arch.h> +#include <asm/mach-types.h> +#include <plat/fsmc.h> +#include <plat/keyboard.h> +#include <plat/spi.h> +#include <mach/generic.h> +#include <mach/spear.h> +#include <mach/pcie.h> + +static struct amba_device *amba_devs[]__initdata = { +/* spear13xx specific devices */ + &spear13xx_gpio_device[0 ], + &spear13xx_gpio_device[1 ], + &spear13xx_ssp_device, + &spear13xx_uart_device, +}; + +static struct platform_device *plat_devs[]__initdata = { +/* spear13xx specific devices */ + &spear13xx_ehci0_device, + &spear13xx_ehci1_device, + &spear13xx_i2c_device, + &spear13xx_kbd_device, + &spear13xx_nand_device, + &spear13xx_ohci0_device, + &spear13xx_ohci1_device, + &spear13xx_rtc_device, + &spear13xx_sdhci_device, + +/* spear1310 specific devices */ + &spear1310_can0_device, + &spear1310_can1_device, +}; + +/* keyboard specific platform data */ +static DECLARE_KEYMAP (keymap); +static struct matrix_keymap_data keymap_data = { + .keymap = keymap,
arch/arm/mach-spear13xx/spear1310_evb.c line 67
Quoted 10 lines
arch/arm/mach-spear13xx/spear1310_evb.c new file +10
-0+ .keymap_size = ARRAY_SIZE(keymap), +}; + +static struct kbd_platform_data kbd_data = { + .keymap = &keymap_data, + .rep =1 , +}; + +static struct spi_board_info __initdata spi_board_info[] = { +};
AFAICT spi_register_board_info() doesn't do anything when passed this empty array so both the array and call could be removed.
Quoted 14 lines
arch/arm/mach-spear13xx/spear1310_evb.c new file +14
-0+ +#ifdef CONFIG_PCIEPORTBUS +/* this function is needed for PCIE host and device driver. Same +* controller can not be programmed as host as well as device. So host +* driver must call this function and if this function returns 1 then +* only host should add that particular port as RC. +* A port to be added as device, one must also add device's information +* in plat_devs array defined in this file. +* it is the responsibility of calling function to not send port number +* greter than max no of controller(3) +*/ +int spear1310_pcie_port_is_host (int port) +{ +switch (port) {
arch/arm/mach-spear13xx/spear1310_evb.c line 91
Quoted 10 lines
arch/arm/mach-spear13xx/spear1310_evb.c new file +10
-0+case 0 : +return 0 ; +case 1 : +return 1 ; +case 2 : + return 1; + } +return -EINVAL ; +} +#endif
It looks like this can be made static. Also, given the comment, is it worth adding a BUG_ON(port > 3)?
Quoted 12 lines
arch/arm/mach-spear13xx/spear1310_evb.c new file +12
-0+static void __init spear1310_evb_init (void ) +{ +unsigned int i; + +/* set keyboard plat data */ +kbd_set_plat_data (&spear13xx_kbd_device, &kbd_data); + +/* set nand device's plat data */ +fsmc_nand_set_plat_data (&spear13xx_nand_device,NULL ,0 , +NAND_SKIP_BBTSCAN ,FSMC_NAND_BW8 ); +nand_mach_init (FSMC_NAND_BW8 ); +
arch/arm/mach-spear13xx/spear1310_evb.c line 114
Quoted 10 lines
arch/arm/mach-spear13xx/spear1310_evb.c new file +10
-0+/* call spear1310 machine init function */ +spear1310_init (); + +/* Register slave devices on the I2C buses */ +i2c_register_default_devices (); + +#ifdef CONFIG_PCIEPORTBUS +/* Enable PCIE0 clk */ +enable_pcie0_clk (); +pcie_init (&spear1310_pcie_port_is_host);
No '&' needed before function name.
Jamie
PATCH v4 32/62 ST SPEAr 13xx : Adding support for SPEAr1310
Quoted 7 lines · Jamie Iles
arch/arm/mach-spear13xx/spear1310_evb.c line 67
Quoted 2 lines · Viresh Kumar
arch/arm/mach-spear13xx/spear1310_evb.c new file +2
-0+static struct spi_board_info __initdata spi_board_info[] = { +};AFAICT
spi_register_board_info()doesn't do anything when passed this empty array so both the array and call could be removed.
Actually we don't have free gpio's in evb boards to use as chip select for ssp. So didn't add any spi devices here in this array. It is just added here so that anybody who needs to test it can simply come here, add a device and test. Can we keep it as it is?
Quoted 19 lines
Quoted 19 lines
arch/arm/mach-spear13xx/spear1310_evb.c new file +19
-0+ +#ifdef CONFIG_PCIEPORTBUS +/* this function is needed for PCIE host and device driver. Same +* controller can not be programmed as host as well as device. So host +* driver must call this function and if this function returns 1 then +* only host should add that particular port as RC. +* A port to be added as device, one must also add device's information +* in plat_devs array defined in this file. +* it is the responsibility of calling function to not send port number +* greter than max no of controller(3) +*/ +int spear1310_pcie_port_is_host (int port) +{ +switch (port) { +case 0 : +return 0 ; +case 1 : +return 1 ; +case 2 :
Quoted 9 lines
arch/arm/mach-spear13xx/spear1310_evb.c line 91
Quoted 5 lines
arch/arm/mach-spear13xx/spear1310_evb.c new file +5
-0+ return 1; + } +return -EINVAL ; +} +#endif It looks like this can be made static. Also, given the comment, is it worth adding a
BUG_ON(port > 3)?
will be done. BUG_ON() can be added here.
Quoted 16 lines
Quoted 16 lines
arch/arm/mach-spear13xx/spear1310_evb.c new file +16
-0+static void __init spear1310_evb_init (void ) +{ +unsigned int i; + +/* set keyboard plat data */ +kbd_set_plat_data (&spear13xx_kbd_device, &kbd_data); + +/* set nand device's plat data */ +fsmc_nand_set_plat_data (&spear13xx_nand_device,NULL ,0 , +NAND_SKIP_BBTSCAN ,FSMC_NAND_BW8 ); +nand_mach_init (FSMC_NAND_BW8 ); + +/* call spear1310 machine init function */ +spear1310_init (); + +/* Register slave devices on the I2C buses */
Quoted 9 lines
arch/arm/mach-spear13xx/spear1310_evb.c line 114
Quoted 6 lines
arch/arm/mach-spear13xx/spear1310_evb.c new file +6
-0+i2c_register_default_devices (); + +#ifdef CONFIG_PCIEPORTBUS +/* Enable PCIE0 clk */ +enable_pcie0_clk (); +pcie_init (&spear1310_pcie_port_is_host);No '&' needed before function name.
Ok.
Signature · 1 line
viresh
PATCH v4 32/62 ST SPEAr 13xx : Adding support for SPEAr1310
Quoted 28 lines · viresh kumar
Quoted 20 lines
Quoted 20 lines
Quoted 20 lines
Quoted 20 lines
arch/arm/mach-spear13xx/spear1310_evb.c new file +20
-0+ +#ifdef CONFIG_PCIEPORTBUS +/* this function is needed for PCIE host and device driver. Same +* controller can not be programmed as host as well as device. So host +* driver must call this function and if this function returns 1 then +* only host should add that particular port as RC. +* A port to be added as device, one must also add device's information +* in plat_devs array defined in this file. +* it is the responsibility of calling function to not send port number +* greter than max no of controller(3) +*/ +int spear1310_pcie_port_is_host (int port) +{ +switch (port) { +case 0 : +return 0 ; +case 1 : +return 1 ; +case 2 : +return 1 ;Quoted 8 lines
Quoted 8 lines
Quoted 4 lines
arch/arm/mach-spear13xx/spear1310_evb.c line 91
Quoted 4 lines
arch/arm/mach-spear13xx/spear1310_evb.c new file +4
-0+ } +return -EINVAL ; +} +#endif It looks like this can be made static. Also, given the comment, is it worth adding a
BUG_ON(port > 3)?
Quoted 2 lines
will be done.
BUG_ON()can be added here.
There is another thought here. We may not require a BUG_ON here. Returning error would be better, so that driver can take steps accordingly. Also it is not that much blocking of a issue, that we need BUG_ON.
--
viresh
PATCH v4 32/62 ST SPEAr 13xx : Adding support for SPEAr1310
Quoted 29 lines · viresh kumar
Quoted 28 lines · viresh kumar
Quoted 28 lines
Quoted 28 lines
Quoted 16 lines
Quoted 16 lines
arch/arm/mach-spear13xx/spear1310_evb.c new file +16
-0+ +#ifdef CONFIG_PCIEPORTBUS +/* this function is needed for PCIE host and device driver. Same +* controller can not be programmed as host as well as device. So host +* driver must call this function and if this function returns 1 then +* only host should add that particular port as RC. +* A port to be added as device, one must also add device's information +* in plat_devs array defined in this file. +* it is the responsibility of calling function to not send port number +* greter than max no of controller(3) +*/ +int spear1310_pcie_port_is_host (int port) +{ +switch (port) { +case 0 : +return 0 ;Quoted 8 lines
arch/arm/mach-spear13xx/spear1310_evb.c line 91
Quoted 8 lines
arch/arm/mach-spear13xx/spear1310_evb.c new file +8
-0+case 1 : +return 1 ; +case 2 : + return 1; + } +return -EINVAL ; +} +#endif It looks like this can be made static. Also, given the comment, is it worth adding a
BUG_ON(port > 3)?
Quoted 6 lines
Quoted 2 lines
will be done.
BUG_ON()can be added here.There is another thought here. We may not require a
BUG_ONhere. Returning error would be better, so that driver can take steps accordingly. Also it is not that much blocking of a issue, that we needBUG_ON.
Ok, I don't have a problem with that!
Jamie
PATCH v4 33/62 SPEAr320: Adding support for CAN
In reply to Viresh Kumar--- arch/arm/mach-spear3xx/include/mach/generic.h | 2 + arch/arm/mach-spear3xx/spear320.c | 37 +++++++++++++++++++++++++ arch/arm/mach-spear3xx/spear320_evb.c | 2 + 3 files changed, 41 insertions(+), 0 deletions(-)
arch/arm/mach-spear3xx/include/mach/generic.h +2 -0
@@ -188,6 +188,8 @@ extern struct amba_device clcd_device;extern struct amba_device ssp_device[];extern struct amba_device uart1_device;extern struct amba_device uart2_device; +extern struct platform_device can0_device; +extern struct platform_device can1_device;extern struct platform_device i2c1_device;extern struct platform_device nand_device;extern struct platform_device plgpio_device;
arch/arm/mach-spear3xx/spear320.c +37 -0
@@ -473,6 +473,43 @@ struct amba_device uart2_device = { .irq = {VIRQ_UART2, NO_IRQ}, }; +/* CAN device registeration */ +static struct resource can0_resources[] = { + { + .start = SPEAR320_CAN0_BASE, + .end = SPEAR320_CAN0_BASE + SZ_4K - 1, + .flags = IORESOURCE_MEM | IORESOURCE_MEM_32BIT, + }, { + .start = VIRQ_CANU, + .flags = IORESOURCE_IRQ, + }, +}; + +struct platform_device can0_device = { + .name = "c_can_platform", + .id = 0, + .num_resources = ARRAY_SIZE(can0_resources), + .resource = can0_resources, +}; + +static struct resource can1_resources[] = { + { + .start = SPEAR320_CAN1_BASE, + .end = SPEAR320_CAN1_BASE + SZ_4K - 1, + .flags = IORESOURCE_MEM | IORESOURCE_MEM_32BIT, + }, { + .start = VIRQ_CANL, + .flags = IORESOURCE_IRQ, + }, +}; + +struct platform_device can1_device = { + .name = "c_can_platform", + .id = 1, + .num_resources = ARRAY_SIZE(can1_resources), + .resource = can1_resources, +}; + /* i2c1 device registeration */ static struct resource i2c1_resources[] = { {
arch/arm/mach-spear3xx/spear320_evb.c +2 -0
@@ -65,6 +65,8 @@ static struct platform_device *plat_devs[] __initdata = { &rtc_device,/* spear320 specific devices */ + &can0_device, + &can1_device, &i2c1_device, &plgpio_device, &pwm_device,
Signature · 1 line
1.7.2.2
PATCH v4 34/62 ST SPEAr: Adding support for DDR in clock framework
In reply to Viresh KumarChanging rate of clk, which is ancestor of DDR requires to put DDR in refresh mode before changing parents rate. For this DDR support is added in clock framework. Now at boot time all ancestors of DDR is marked specially and changing their rate must be first acked by ddr (i.e. ddr will run on that clock). This patch adds support for this.
--- arch/arm/mach-spear13xx/clock.c | 69 ++++++++--- arch/arm/mach-spear13xx/include/mach/generic.h | 2 +- arch/arm/mach-spear13xx/include/mach/misc_regs.h | 4 + arch/arm/mach-spear13xx/spear13xx.c | 2 +- arch/arm/mach-spear3xx/clock.c | 105 ++++++++++++++---- arch/arm/mach-spear3xx/include/mach/generic.h | 2 +- arch/arm/mach-spear3xx/include/mach/misc_regs.h | 7 + arch/arm/mach-spear3xx/spear3xx.c | 2 +- arch/arm/mach-spear6xx/clock.c | 105 ++++++++++++++---- arch/arm/mach-spear6xx/include/mach/generic.h | 2 +- arch/arm/mach-spear6xx/include/mach/misc_regs.h | 7 + arch/arm/mach-spear6xx/spear6xx.c | 2 +- arch/arm/plat-spear/clock.c | 133 ++++++++++++++++++--- arch/arm/plat-spear/include/plat/clock.h | 42 +++++-- 14 files changed, 385 insertions(+), 99 deletions(-)
arch/arm/mach-spear13xx/clock.c +50 -19
@@ -23,19 +23,19 @@/* root clks */ /* 24 MHz oscillator clock */ static struct clk osc1_24m_clk = { - .flags =ALWAYS_ENABLED , + .flags =ALWAYS_ENABLED |SYSTEM_CLK , .rate =24000000 , };/* 32 KHz oscillator clock */ static struct clk osc2_32k_clk = { - .flags =ALWAYS_ENABLED , + .flags =ALWAYS_ENABLED |SYSTEM_CLK , .rate =32000 , };/* 25 MHz MIPHY oscillator clock */ static struct clk osc3_25m_clk = { - .flags =ALWAYS_ENABLED , + .flags =ALWAYS_ENABLED |SYSTEM_CLK , .rate =25000000 , };
@@ -99,7 +99,7 @@ struct pll_rate_tbl pll_rtbl[] = {/* pll1 clock */ static struct clk pll1_clk = { - .flags =ENABLED_ON_INIT , + .flags =ENABLED_ON_INIT |SYSTEM_CLK , .pclk_sel = &pll_pclk_sel, .pclk_sel_shift =PLL1_CLK_SHIFT , .en_reg =PLL1_CTR ,
@@ -113,7 +113,7 @@ static struct clk pll1_clk = {/* pll1div2 clock */ static struct clk pll1div2_clk = { - .flags =ALWAYS_ENABLED , + .flags =ALWAYS_ENABLED |SYSTEM_CLK , .pclk = &pll1_clk, .div_factor =2 , .recalc = &follow_parent,
@@ -121,7 +121,7 @@ static struct clk pll1div2_clk = {/* pll1div4 clock */ static struct clk pll1div4_clk = { - .flags =ALWAYS_ENABLED , + .flags =ALWAYS_ENABLED |SYSTEM_CLK , .pclk = &pll1_clk, .div_factor =4 , .recalc = &follow_parent,
@@ -136,6 +136,7 @@ static struct pll_clk_config pll2_config = {/* pll2 clock */ static struct clk pll2_clk = { + .flags =SYSTEM_CLK , .pclk_sel = &pll_pclk_sel, .pclk_sel_shift =PLL2_CLK_SHIFT , .en_reg =PLL2_CTR ,
@@ -156,6 +157,7 @@ static struct pll_clk_config pll3_config = {/* pll3 clock */ static struct clk pll3_clk = { + .flags =SYSTEM_CLK , .pclk_sel = &pll_pclk_sel, .pclk_sel_shift =PLL3_CLK_SHIFT , .en_reg =PLL3_CTR ,
@@ -184,7 +186,7 @@ struct pll_rate_tbl pll4_rtbl[] = {/* pll4 (DDR) clock */ static struct clk pll4_clk = { - .flags =ENABLED_ON_INIT , + .flags =ENABLED_ON_INIT |SYSTEM_CLK , .pclk = &osc1_24m_clk, .en_reg =PLL4_CTR , .en_reg_bit =PLL_ENABLE ,
@@ -197,22 +199,54 @@ static struct clk pll4_clk = {/* pll5 USB 48 MHz clock */ static struct clk pll5_clk = { - .flags =ALWAYS_ENABLED , + .flags =ALWAYS_ENABLED |SYSTEM_CLK , .pclk = &osc1_24m_clk, .rate =48000000 , };/* pll6 (MIPHY) clock */ static struct clk pll6_clk = { - .flags =ALWAYS_ENABLED , + .flags =ALWAYS_ENABLED |SYSTEM_CLK , .pclk = &osc3_25m_clk, .rate =25000000 , };/* clocks derived from pll1 clk */ +/* ddr clock */ +struct ddr_rate_tbl ddr_rate_tbl = { + .minrate =332000000 , + .maxrate =500000000 , +}; + +static struct pclk_info ddr_pclk_info[] = { + { + .pclk = &pll1_clk, + .pclk_val =MCTR_CLK_PLL1_VAL , + }, { + .pclk = &pll4_clk, + .pclk_val =MCTR_CLK_PLL4_VAL , + }, +}; + +/* ddr parent select structure */ +static struct pclk_sel ddr_pclk_sel = { + .pclk_info = ddr_pclk_info, + .pclk_count =ARRAY_SIZE (ddr_pclk_info), + .pclk_sel_reg =PERIP_CLK_CFG , + .pclk_sel_mask =MCTR_CLK_MASK , +}; + +static struct clk ddr_clk = { + .flags =ALWAYS_ENABLED |SYSTEM_CLK , + .recalc = &follow_parent, + .pclk_sel = &ddr_pclk_sel, + .pclk_sel_shift =MCTR_CLK_SHIFT , + .private_data = &ddr_rate_tbl, +}; +/* cpu clock */ static struct clk cpu_clk = { - .flags =ALWAYS_ENABLED , + .flags =ALWAYS_ENABLED |SYSTEM_CLK , .pclk = &pll1_clk, .div_factor =2 , .recalc = &follow_parent,
@@ -220,7 +254,7 @@ static struct clk cpu_clk = {/* ahb clock */ static struct clk ahb_clk = { - .flags =ALWAYS_ENABLED , + .flags =ALWAYS_ENABLED |SYSTEM_CLK , .pclk = &pll1_clk, .div_factor =6 , .recalc = &follow_parent,
@@ -228,7 +262,7 @@ static struct clk ahb_clk = {/* apb clock */ static struct clk apb_clk = { - .flags =ALWAYS_ENABLED , + .flags =ALWAYS_ENABLED |SYSTEM_CLK , .pclk = &pll1_clk, .div_factor =12 , .recalc = &follow_parent,
@@ -845,6 +879,7 @@ static struct clk_lookup spear_clk_lookups[] = { {.con_id = "pll6_clk", .clk = &pll6_clk}, /* clock derived from pll1 clk */ + {.con_id = "ddr_clk", .clk = &ddr_clk}, {.con_id = "cpu_clk", .clk = &cpu_clk}, {.con_id = "ahb_clk", .clk = &ahb_clk}, {.con_id = "apb_clk", .clk = &apb_clk},
@@ -911,12 +946,8 @@ static struct clk_lookup spear_clk_lookups[] = {#endif }; -void __init clk_init (void ) +/* machine clk init */ +void __init spear13xx_clk_init (void ) { -int i; - -for (i =0 ; i <ARRAY_SIZE (spear_clk_lookups); i++) -clk_register (&spear_clk_lookups[i]); - -recalc_root_clocks (); +clk_init (spear_clk_lookups,ARRAY_SIZE (spear_clk_lookups), &ddr_clk); }
arch/arm/mach-spear13xx/include/mach/generic.h +1 -1
@@ -44,7 +44,7 @@ extern struct platform_device spear13xx_sdhci_device;extern struct sys_timer spear13xx_timer;/* Add spear13xx family function declarations here */ -void __init clk_init (void ); +void __init spear13xx_clk_init (void );void __init i2c_register_default_devices (void );void __init spear_setup_timer (void );void __init spear13xx_map_io (void );
arch/arm/mach-spear13xx/include/mach/misc_regs.h +4 -0
@@ -98,6 +98,10 @@#define CLCD_CLK_SHIFT 2#define C3_CLK_MASK 1#define C3_CLK_SHIFT 1 +#define MCTR_CLK_SHIFT 10 +#define MCTR_CLK_MASK 0x1 +#define MCTR_CLK_PLL1_VAL 0x0 +#define MCTR_CLK_PLL4_VAL 0x1#define GMAC_CLK_CFG ((unsigned int *)(MISC_BASE + 0x248))
arch/arm/mach-spear13xx/spear13xx.c +1 -1
@@ -434,7 +434,7 @@ void __init spear13xx_map_io(void)iotable_init (spear13xx_io_desc,ARRAY_SIZE (spear13xx_io_desc));/* This will initialize clock framework */ -clk_init (); +spear13xx_clk_init (); }static void __init spear13xx_timer_init (void )
arch/arm/mach-spear3xx/clock.c +83 -22
185 lines not on this page · raw message
arch/arm/mach-spear3xx/include/mach/generic.h +1 -1
@@ -43,7 +43,7 @@ extern struct platform_device rtc_device;extern struct sys_timer spear3xx_timer;/* Add spear3xx family function declarations here */ -void __init clk_init (void ); +void __init spear3xx_clk_init (void );void __init i2c_register_default_devices (void );void __init spear_setup_timer (void );void __init spear3xx_map_io (void );
arch/arm/mach-spear3xx/include/mach/misc_regs.h +7 -0
@@ -46,6 +46,13 @@#define PLL2_MOD ((unsigned int *)(MISC_BASE + 0x01C))#define PLL_CLK_CFG ((unsigned int *)(MISC_BASE + 0x020)) +/* PLL_CLK_CFG register masks */ +#define MCTR_CLK_SHIFT 28 +#define MCTR_CLK_MASK 0x7 +#define MCTR_CLK_HCLK_VAL 0x0 +#define MCTR_CLK_2HCLK_VAL 0x1 +#define MCTR_CLK_PLL2_VAL 0x3 +#define CORE_CLK_CFG ((unsigned int *)(MISC_BASE + 0x024))/* CORE CLK CFG register masks */ #define PLL_HCLK_RATIO_SHIFT 10
arch/arm/mach-spear3xx/spear3xx.c +1 -1
@@ -261,7 +261,7 @@ void __init spear3xx_map_io(void)iotable_init (spear3xx_io_desc,ARRAY_SIZE (spear3xx_io_desc));/* This will initialize clock framework */ -clk_init (); +spear3xx_clk_init (); }/* pad multiplexing support */
arch/arm/mach-spear6xx/clock.c +83 -22
185 lines not on this page · raw message
arch/arm/mach-spear6xx/include/mach/generic.h +1 -1
@@ -50,7 +50,7 @@ void __init spear6xx_map_io(void);void __init spear6xx_init_irq (void );void __init spear6xx_init (void );void __init spear600_init (void ); -void __init clk_init (void ); +void __init spear6xx_clk_init (void );/* Add spear600 machine device structure declarations here */
arch/arm/mach-spear6xx/include/mach/misc_regs.h +7 -0
@@ -47,6 +47,13 @@#define PLL2_MOD ((unsigned int *)(MISC_BASE + 0x01C))#define PLL_CLK_CFG ((unsigned int *)(MISC_BASE + 0x020))#define CORE_CLK_CFG ((unsigned int *)(MISC_BASE + 0x024)) +/* PLL_CLK_CFG register masks */ +#define MCTR_CLK_SHIFT 28 +#define MCTR_CLK_MASK 0x7 +#define MCTR_CLK_HCLK_VAL 0x0 +#define MCTR_CLK_2HCLK_VAL 0x1 +#define MCTR_CLK_PLL2_VAL 0x3 +/* CORE CLK CFG register masks */ #define PLL_HCLK_RATIO_SHIFT 10#define PLL_HCLK_RATIO_MASK 0x3
arch/arm/mach-spear6xx/spear6xx.c +1 -1
@@ -420,7 +420,7 @@ void __init spear6xx_map_io(void)iotable_init (spear6xx_io_desc,ARRAY_SIZE (spear6xx_io_desc));/* This will initialize clock framework */ -clk_init (); +spear6xx_clk_init (); }static void __init spear6xx_timer_init (void )
arch/arm/plat-spear/clock.c +114 -19
260 lines not on this page · raw message
arch/arm/plat-spear/include/plat/clock.h +31 -11
74 lines not on this page · raw message
Signature · 1 line
1.7.2.2
PATCH v4 35/62 ST SPEAr : EMI (Extrenal Memory Interface) controller driver
In reply to Viresh KumarFrom: Vipin Kumar <[email protected]>
2 SPEAr platform SoCs(spear310 and spear320) support an External Memory Interface controller. This controller is used to interface with Parallel NOR Flash devices.
This patch adds just the platform code needed for EMI (mainly EMI initialization). The driver being used is driver/mtd/maps/physmap.c
--- arch/arm/mach-spear3xx/Makefile | 4 + arch/arm/mach-spear3xx/emi.c | 101 ++++++++++++++++++++++++ arch/arm/mach-spear3xx/include/mach/emi.h | 64 +++++++++++++++ arch/arm/mach-spear3xx/include/mach/generic.h | 2 + arch/arm/mach-spear3xx/include/mach/spear310.h | 9 ++ arch/arm/mach-spear3xx/include/mach/spear320.h | 6 ++ arch/arm/mach-spear3xx/spear310.c | 9 ++ arch/arm/mach-spear3xx/spear310_evb.c | 28 +++++++ arch/arm/mach-spear3xx/spear320.c | 9 ++ arch/arm/mach-spear3xx/spear320_evb.c | 27 ++++++ 10 files changed, 259 insertions(+), 0 deletions(-) create mode 100644 arch/arm/mach-spear3xx/emi.c create mode 100644 arch/arm/mach-spear3xx/include/mach/emi.h
arch/arm/mach-spear3xx/Makefile +4 -0
@@ -24,3 +24,7 @@ obj-$(CONFIG_MACH_SPEAR320) += spear320.o # spear320 boards files obj-$(CONFIG_BOARD_SPEAR320_EVB) += spear320_evb.o + +# specific files +obj-$(CONFIG_MACH_SPEAR310) += emi.o +obj-$(CONFIG_MACH_SPEAR320) += emi.o
arch/arm/mach-spear3xx/emi.c new file +101 -0
101 lines not on this page · raw message
arch/arm/mach-spear3xx/include/mach/emi.h new file +64 -0
64 lines not on this page · raw message
arch/arm/mach-spear3xx/include/mach/generic.h +2 -0
@@ -165,6 +165,7 @@ extern struct amba_device uart2_device;extern struct amba_device uart3_device;extern struct amba_device uart4_device;extern struct amba_device uart5_device; +extern struct platform_device emi_nor_device;extern struct platform_device plgpio_device;extern struct platform_device nand_device;
@@ -190,6 +191,7 @@ extern struct amba_device uart1_device;extern struct amba_device uart2_device;extern struct platform_device can0_device;extern struct platform_device can1_device; +extern struct platform_device emi_nor_device;extern struct platform_device i2c1_device;extern struct platform_device nand_device;extern struct platform_device plgpio_device;
arch/arm/mach-spear3xx/include/mach/spear310.h +9 -0
@@ -18,6 +18,15 @@#define SPEAR310_NAND_BASE UL(0x40000000)#define SPEAR310_FSMC_BASE UL(0x44000000) +#define SPEAR310_EMI_REG_BASE UL(0x4F000000) +#define SPEAR310_EMI_MEM_0_BASE UL(0x50000000) +#define SPEAR310_EMI_MEM_1_BASE UL(0x60000000) +#define SPEAR310_EMI_MEM_2_BASE UL(0x70000000) +#define SPEAR310_EMI_MEM_3_BASE UL(0x80000000) +#define SPEAR310_EMI_MEM_4_BASE UL(0x90000000) +#define SPEAR310_EMI_MEM_5_BASE UL(0xA0000000) +#define SPEAR310_EMI_MEM_SIZE UL(0x10000000) +#define SPEAR310_UART1_BASE UL(0xB2000000)#define SPEAR310_UART2_BASE UL(0xB2080000)#define SPEAR310_UART3_BASE UL(0xB2100000)
arch/arm/mach-spear3xx/include/mach/spear320.h +6 -0
@@ -17,6 +17,12 @@#define __MACH_SPEAR320_H#define SPEAR320_EMI_CTRL_BASE UL(0x40000000) +#define SPEAR320_EMI_MEM_0_BASE UL(0x44000000) +#define SPEAR320_EMI_MEM_1_BASE UL(0x45000000) +#define SPEAR320_EMI_MEM_2_BASE UL(0x46000000) +#define SPEAR320_EMI_MEM_3_BASE UL(0x47000000) +#define SPEAR320_EMI_MEM_SIZE UL(0x01000000) +#define SPEAR320_FSMC_BASE UL(0x4C000000)#define SPEAR320_NAND_BASE UL(0x50000000)#define SPEAR320_I2S_BASE UL(0x60000000)
arch/arm/mach-spear3xx/spear310.c +9 -0
@@ -11,6 +11,7 @@* warranty of any kind, whether express or implied. */ +#include <linux/mtd/physmap.h> #include <linux/ptrace.h> #include <linux/mtd/fsmc.h> #include <asm/irq.h>
@@ -268,6 +269,14 @@ int spear300_o2p(int offset)return offset +2 ; } +/* emi nor flash device registeration */ +static struct physmap_flash_data emi_norflash_data; +struct platform_device emi_nor_device = { + .name ="physmap-flash" , + .id =-1 , + .dev.platform_data = &emi_norflash_data, +}; +static struct plgpio_platform_data plgpio_plat_data = { .gpio_base =8 , .irq_base =SPEAR_PLGPIO_INT_BASE ,
arch/arm/mach-spear3xx/spear310_evb.c +28 -0
@@ -17,12 +17,31 @@#include <asm/mach-types.h> #include <linux/spi/flash.h> #include <linux/spi/spi.h> +#include <mach/emi.h> #include <mach/generic.h> #include <mach/gpio.h> #include <mach/spear.h> #include <plat/fsmc.h> #include <plat/spi.h> +#define PARTITION (n, off, sz) {.name = n, .offset = off, .size = sz} + +static struct mtd_partition partition_info[] = { +PARTITION ("X-loader" ,0 ,1 *0x20000 ), +PARTITION ("U-Boot" ,0x20000 ,3 *0x20000 ), +PARTITION ("Kernel" ,0x80000 ,24 *0x20000 ), +PARTITION ("Root File System" ,0x380000 ,84 *0x20000 ), +}; + +/* emi nor flash resources registeration */ +static struct resource emi_nor_resources[] = { + { + .start =SPEAR310_EMI_MEM_0_BASE , + .end =SPEAR310_EMI_MEM_0_BASE +SPEAR310_EMI_MEM_SIZE -1 , + .flags =IORESOURCE_MEM , + }, +}; +/* padmux devices to enable */ static struct pmx_dev *pmx_devs[] = {/* spear3xx specific devices */
@@ -67,6 +86,7 @@ static struct platform_device *plat_devs[] __initdata = { &rtc_device,/* spear310 specific devices */ + &emi_nor_device, &plgpio_device, };
@@ -119,6 +139,14 @@ static void __init spear310_evb_init(void)/* Register slave devices on the I2C buses */ i2c_register_default_devices (); +/* initialize emi related data in emi plat data */ +emi_init_board_info (&emi_nor_device, emi_nor_resources, +ARRAY_SIZE (emi_nor_resources), partition_info, +ARRAY_SIZE (partition_info),EMI_FLASH_WIDTH32 ); + +/* Initialize emi regiters */ +emi_init (&emi_nor_device,SPEAR310_EMI_REG_BASE ,0 ,EMI_FLASH_WIDTH32 ); +/* Add Platform Devices */ platform_add_devices (plat_devs,ARRAY_SIZE (plat_devs));
arch/arm/mach-spear3xx/spear320.c +9 -0
@@ -12,6 +12,7 @@*/ #include <linux/amba/pl022.h> +#include <linux/mtd/physmap.h> #include <linux/ptrace.h> #include <linux/types.h> #include <linux/mmc/sdhci-spear.h>
@@ -510,6 +511,14 @@ struct platform_device can1_device = { .resource = can1_resources, }; +/* emi nor flash device registeration */ +static struct physmap_flash_data emi_norflash_data; +struct platform_device emi_nor_device = { + .name ="physmap-flash" , + .id =-1 , + .dev.platform_data = &emi_norflash_data, +}; +/* i2c1 device registeration */ static struct resource i2c1_resources[] = { {
arch/arm/mach-spear3xx/spear320_evb.c +27 -0
@@ -18,12 +18,31 @@#include <linux/spi/flash.h> #include <linux/mmc/sdhci-spear.h> #include <linux/spi/spi.h> +#include <mach/emi.h> #include <mach/generic.h> #include <mach/gpio.h> #include <mach/spear.h> #include <plat/fsmc.h> #include <plat/spi.h> +#define PARTITION (n, off, sz) {.name = n, .offset = off, .size = sz} + +static struct mtd_partition partition_info[] = { +PARTITION ("X-loader" ,0 ,1 *0x20000 ), +PARTITION ("U-Boot" ,0x20000 ,3 *0x20000 ), +PARTITION ("Kernel" ,0x80000 ,24 *0x20000 ), +PARTITION ("Root File System" ,0x380000 ,84 *0x20000 ), +}; + +/* emi nor flash resources registeration */ +static struct resource emi_nor_resources[] = { + { + .start =SPEAR310_EMI_MEM_0_BASE , + .end =SPEAR310_EMI_MEM_0_BASE +SPEAR310_EMI_MEM_SIZE -1 , + .flags =IORESOURCE_MEM , + }, +}; +/* padmux devices to enable */ static struct pmx_dev *pmx_devs[] = {/* spear3xx specific devices */
@@ -106,6 +125,14 @@ static void __init spear320_evb_init(void)/* Register slave devices on the I2C buses */ i2c_register_default_devices (); +/* initialize emi related data in emi plat data */ +emi_init_board_info (&emi_nor_device, emi_nor_resources, +ARRAY_SIZE (emi_nor_resources), partition_info, +ARRAY_SIZE (partition_info),EMI_FLASH_WIDTH16 ); + +/* Initialize emi regiters */ +emi_init (&emi_nor_device,SPEAR320_EMI_CTRL_BASE ,0 ,EMI_FLASH_WIDTH16 ); +/* Add Platform Devices */ platform_add_devices (plat_devs,ARRAY_SIZE (plat_devs));
Signature · 1 line
1.7.2.2
PATCH v4 36/62 SPEAr Clock Framework: Adding support for PLL frequency change
In reply to Viresh KumarFrom: Deepak Sikri <[email protected]>
--- arch/arm/mach-spear3xx/spear3xx.c | 5 + arch/arm/mach-spear6xx/spear6xx.c | 5 + arch/arm/plat-spear/Makefile | 2 +- arch/arm/plat-spear/clock.c | 6 +- arch/arm/plat-spear/include/plat/clock.h | 1 + arch/arm/plat-spear/pll_clk.S | 187 ++++++++++++++++++++++++++++++ 6 files changed, 201 insertions(+), 5 deletions(-) create mode 100644 arch/arm/plat-spear/pll_clk.S
arch/arm/mach-spear3xx/spear3xx.c +5 -0
@@ -252,6 +252,11 @@ struct map_desc spear3xx_io_desc[] __initdata = { .pfn = __phys_to_pfn(SPEAR3XX_ICM3_MISC_REG_BASE), .length = SZ_4K, .type = MT_DEVICE + }, { + .virtual = IO_ADDRESS(SPEAR3XX_ICM3_SDRAM_CTRL_BASE), + .pfn = __phys_to_pfn(SPEAR3XX_ICM3_SDRAM_CTRL_BASE), + .length = SZ_4K, + .type = MT_DEVICE }, };
arch/arm/mach-spear6xx/spear6xx.c +5 -0
@@ -411,6 +411,11 @@ static struct map_desc spear6xx_io_desc[] __initdata = { .pfn = __phys_to_pfn(SPEAR6XX_ICM3_MISC_REG_BASE), .length = SZ_4K, .type = MT_DEVICE + }, { + .virtual = IO_ADDRESS(SPEAR6XX_ICM3_SDRAM_CTRL_BASE), + .pfn = __phys_to_pfn(SPEAR6XX_ICM3_SDRAM_CTRL_BASE), + .length = SZ_4K, + .type = MT_DEVICE }, };
arch/arm/plat-spear/Makefile +1 -1
@@ -3,7 +3,7 @@ # # Common support -obj-y := clcd.o clock.o time.o +obj-y := clcd.o clock.o pll_clk.o time.o obj-$(CONFIG_ARCH_SPEAR3XX) += shirq.o padmux.o obj-$(CONFIG_MACH_SPEAR310) += plgpio.o
arch/arm/plat-spear/clock.c +2 -4
@@ -586,11 +586,10 @@ int pll_clk_set_rate(struct clk *clk, unsigned long desired_rate)* call routine to put ddr in refresh mode, and * configure pll. */ -/* TBD */ +pll_set_rate (tbls[i].m, tbls[i].p, tbls[i].n); clk->rate = rate; } - -return ret; +return 0 ; } val = readl(config->mode_reg) &
@@ -616,7 +615,6 @@ int pll_clk_set_rate(struct clk *clk, unsigned long desired_rate) config->masks->norm_fdbk_m_shift;writel (val, config->cfg_reg); - clk->rate = rate;return 0 ;
arch/arm/plat-spear/include/plat/clock.h +1 -0
@@ -264,5 +264,6 @@ int aux_clk_set_rate(struct clk *clk, unsigned long desired_rate);unsigned long clcd_calc_rate (struct clk *clk,int index);int clcd_clk_recalc (struct clk *clk,unsigned long *rate,unsigned long prate);int clcd_clk_set_rate (struct clk *clk,unsigned long desired_rate); +void pll_set_rate (u16 pdiv,u8 nmul,u8 hclkdiv);#endif /* __PLAT_CLOCK_H */
arch/arm/plat-spear/pll_clk.S new file +187 -0
187 lines not on this page · raw message
Signature · 1 line
1.7.2.2
PATCH v4 37/62 SPEAr Power Management: Added the support for Standby mode.
In reply to Viresh KumarFrom: Deepak Sikri <[email protected]>
Open Points:
-> Suspend to RAM support needs to be added. -> SPEAr13xx: The power domains need to be added. -> For SPEAr13xx: PLL-4 has not been switch off while moving into sleep. There is some problem in getting the pll back to on.
--- arch/arm/mach-spear13xx/Makefile | 1 + arch/arm/mach-spear13xx/include/mach/suspend.h | 47 +++ arch/arm/mach-spear13xx/pm.c | 107 ++++++ arch/arm/mach-spear13xx/sleep.S | 435 ++++++++++++++++++++++++ arch/arm/mach-spear13xx/spear13xx.c | 5 + arch/arm/mach-spear3xx/include/mach/suspend.h | 44 +++ arch/arm/mach-spear3xx/spear3xx.c | 5 +- arch/arm/mach-spear6xx/include/mach/suspend.h | 44 +++ arch/arm/mach-spear6xx/spear6xx.c | 9 +- arch/arm/plat-spear/Makefile | 6 + arch/arm/plat-spear/pm.c | 104 ++++++ arch/arm/plat-spear/sleep.S | 288 ++++++++++++++++ 12 files changed, 1093 insertions(+), 2 deletions(-) create mode 100644 arch/arm/mach-spear13xx/include/mach/suspend.h create mode 100644 arch/arm/mach-spear13xx/pm.c create mode 100644 arch/arm/mach-spear13xx/sleep.S create mode 100644 arch/arm/mach-spear3xx/include/mach/suspend.h create mode 100644 arch/arm/mach-spear6xx/include/mach/suspend.h create mode 100644 arch/arm/plat-spear/pm.c create mode 100644 arch/arm/plat-spear/sleep.S
arch/arm/mach-spear13xx/Makefile +1 -0
@@ -7,6 +7,7 @@ obj-y += spear13xx.o clock.o obj-$(CONFIG_SMP) += platsmp.o headsmp.o obj-$(CONFIG_LOCAL_TIMERS) += localtimer.o obj-$(CONFIG_PCIEPORTBUS) += pcie.o +obj-$(CONFIG_PM) += pm.o sleep.o # spear1300 specific files obj-$(CONFIG_MACH_SPEAR1300) += spear1300.o
arch/arm/mach-spear13xx/include/mach/suspend.h new file +47 -0
47 lines not on this page · raw message
arch/arm/mach-spear13xx/pm.c new file +107 -0
107 lines not on this page · raw message
arch/arm/mach-spear13xx/sleep.S new file +435 -0
435 lines not on this page · raw message
arch/arm/mach-spear13xx/spear13xx.c +5 -0
@@ -425,6 +425,11 @@ struct map_desc spear13xx_io_desc[] __initdata = { .pfn = __phys_to_pfn(SPEAR13XX_SYSRAM0_BASE), .length = SZ_32K, .type = MT_DEVICE + }, { + .virtual = IO_ADDRESS(SPEAR13XX_SYSRAM1_BASE), + .pfn = __phys_to_pfn(SPEAR13XX_SYSRAM1_BASE), + .length = SZ_1M, + .type = MT_MEMORY_NONCACHED }, };
arch/arm/mach-spear3xx/include/mach/suspend.h new file +44 -0
44 lines not on this page · raw message
arch/arm/mach-spear3xx/spear3xx.c +4 -1
@@ -22,6 +22,8 @@#include <mach/generic.h> #include <mach/spear.h> +#define SPEAR3XX_WKUP_SRCS (1 << IRQ_MAC_1 | 1 << IRQ_USB_DEV | \ + 1 << IRQ_BASIC_RTC | 1 << IRQ_BASIC_GPIO)/* Add spear3xx machines common devices here */ /* gpio device registration */ static struct pl061_platform_data gpio_plat_data = {
@@ -227,7 +229,8 @@ void __init spear3xx_init(void)/* This will initialize vic */ void __init spear3xx_init_irq (void ) { -vic_init ((void __iomem *)VA_SPEAR3XX_ML1_VIC_BASE ,0 , ~0 ,0 ); +vic_init ((void __iomem *)VA_SPEAR3XX_ML1_VIC_BASE ,0 , ~0 , +SPEAR3XX_WKUP_SRCS ); }/* Following will create static virtual/physical mappings */
arch/arm/mach-spear6xx/include/mach/suspend.h new file +44 -0
44 lines not on this page · raw message
arch/arm/mach-spear6xx/spear6xx.c +8 -1
@@ -24,6 +24,12 @@#include <mach/generic.h> #include <mach/spear.h> +/* The wake sources are routed through vic-2 */ +#define SPEAR6XX_WKUP_SRCS_VIC2 (1 << (IRQ_GMAC_1 - 32) | \ + 1 << (IRQ_USB_DEV - 32) | \ + 1 << (IRQ_BASIC_RTC - 32) |\ + 1 << (IRQ_BASIC_GPIO - 32)) +/* Add spear6xx machines common devices here */ /* CLCD device registration */
@@ -381,7 +387,8 @@ void __init spear6xx_init(void)void __init spear6xx_init_irq (void ) {vic_init ((void __iomem *)VA_SPEAR6XX_CPU_VIC_PRI_BASE ,0 , ~0 ,0 ); -vic_init ((void __iomem *)VA_SPEAR6XX_CPU_VIC_SEC_BASE ,32 , ~0 ,0 ); +vic_init ((void __iomem *)VA_SPEAR6XX_CPU_VIC_SEC_BASE ,32 , ~0 , +SPEAR6XX_WKUP_SRCS_VIC2 ); }/* Following will create static virtual/physical mappings */
arch/arm/plat-spear/Makefile +6 -0
@@ -6,6 +6,7 @@ obj-y := clcd.o clock.o pll_clk.o time.o obj-$(CONFIG_ARCH_SPEAR3XX) += shirq.o padmux.o + obj-$(CONFIG_MACH_SPEAR310) += plgpio.o obj-$(CONFIG_MACH_SPEAR320) += plgpio.o obj-$(CONFIG_SPEAR_PWM) += pwm.o
@@ -16,3 +17,8 @@ obj-$(CONFIG_BOARD_SPEAR300_EVB) += i2c_eval_board.o obj-$(CONFIG_BOARD_SPEAR310_EVB) += i2c_eval_board.o obj-$(CONFIG_BOARD_SPEAR320_EVB) += i2c_eval_board.o obj-$(CONFIG_BOARD_SPEAR600_EVB) += i2c_eval_board.o + +ifeq ($(CONFIG_PM),y) +obj-$(CONFIG_ARCH_SPEAR3XX) += pm.o sleep.o +obj-$(CONFIG_ARCH_SPEAR6XX) += pm.o sleep.o +endif
arch/arm/plat-spear/pm.c new file +104 -0
104 lines not on this page · raw message
arch/arm/plat-spear/sleep.S new file +288 -0
288 lines not on this page · raw message
Signature · 1 line
1.7.2.2
PATCH v4 38/62 SPEAr CPU freq: Adding support for CPU Freq framework
In reply to Viresh KumarFrom: Deepak Sikri <[email protected]>
--- arch/arm/Kconfig | 1 + arch/arm/mach-spear13xx/clock.c | 7 +- arch/arm/mach-spear3xx/clock.c | 5 +- arch/arm/mach-spear6xx/clock.c | 5 +- arch/arm/plat-spear/Makefile | 2 +- arch/arm/plat-spear/cpufreq.c | 159 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 171 insertions(+), 8 deletions(-) create mode 100644 arch/arm/plat-spear/cpufreq.c
arch/arm/Kconfig +1 -0
@@ -872,6 +872,7 @@ config PLAT_SPEAR select CLKDEV_LOOKUP select GENERIC_CLOCKEVENTS select HAVE_CLK + select ARCH_HAS_CPUFREQ help Support for ST's SPEAr platform (SPEAr3xx, SPEAr6xx and SPEAr13xx).
arch/arm/mach-spear13xx/clock.c +4 -3
@@ -91,6 +91,7 @@ static struct pll_clk_config pll1_config = {/* pll rate configuration table, in ascending order of rates */ struct pll_rate_tbl pll_rtbl[] = {/* PCLK 24MHz */ + {.mode =0 , .m =0x64 , .n =0x03 , .p =0x2 },/* 400 MHz */ {.mode =0 , .m =0x7D , .n =0x03 , .p =0x2 },/* 500 MHz */ {.mode =0 , .m =0xA6 , .n =0x03 , .p =0x2 },/* 664 MHz */ {.mode =0 , .m =0xC8 , .n =0x03 , .p =0x2 },/* 800 MHz */
@@ -107,7 +108,7 @@ static struct clk pll1_clk = { .calc_rate = &pll_calc_rate, .recalc = &pll_clk_recalc, .set_rate = &pll_clk_set_rate, - .rate_config = {pll_rtbl, ARRAY_SIZE(pll_rtbl), 3}, + .rate_config = {pll_rtbl, ARRAY_SIZE(pll_rtbl), 4}, .private_data = &pll1_config, };
@@ -144,7 +145,7 @@ static struct clk pll2_clk = { .calc_rate = &pll_calc_rate, .recalc = &pll_clk_recalc, .set_rate = &pll_clk_set_rate, - .rate_config = {pll_rtbl, ARRAY_SIZE(pll_rtbl), 3}, + .rate_config = {pll_rtbl, ARRAY_SIZE(pll_rtbl), 4}, .private_data = &pll2_config, };
@@ -165,7 +166,7 @@ static struct clk pll3_clk = { .calc_rate = &pll_calc_rate, .recalc = &pll_clk_recalc, .set_rate = &pll_clk_set_rate, - .rate_config = {pll_rtbl, ARRAY_SIZE(pll_rtbl), 3}, + .rate_config = {pll_rtbl, ARRAY_SIZE(pll_rtbl), 4}, .private_data = &pll3_config, };
arch/arm/mach-spear3xx/clock.c +3 -2
@@ -55,6 +55,7 @@ static struct pll_clk_masks pll_masks = {/* pll rate configuration table, in ascending order of rates */ struct pll_rate_tbl pll_rtbl[] = { + {.mode =0 , .m =0x53 , .n =0x0C , .p =0x1 },/* 166 MHz */ {.mode =0 , .m =0x85 , .n =0x0C , .p =0x1 },/* 266 MHz */ {.mode =0 , .m =0xA6 , .n =0x0C , .p =0x1 },/* 332 MHz */ };
@@ -75,7 +76,7 @@ static struct clk pll1_clk = { .calc_rate = &pll_calc_rate, .recalc = &pll_clk_recalc, .set_rate = &pll_clk_set_rate, - .rate_config = {pll_rtbl, ARRAY_SIZE(pll_rtbl), 1}, + .rate_config = {pll_rtbl, ARRAY_SIZE(pll_rtbl), 2}, .private_data = &pll1_config, };
@@ -95,7 +96,7 @@ static struct clk pll2_clk = { .calc_rate = &pll_calc_rate, .recalc = &pll_clk_recalc, .set_rate = &pll_clk_set_rate, - .rate_config = {pll_rtbl, ARRAY_SIZE(pll_rtbl), 1}, + .rate_config = {pll_rtbl, ARRAY_SIZE(pll_rtbl), 2}, .private_data = &pll2_config, };
arch/arm/mach-spear6xx/clock.c +3 -2
@@ -55,6 +55,7 @@ static struct pll_clk_masks pll_masks = {/* pll rate configuration table, in ascending order of rates */ struct pll_rate_tbl pll_rtbl[] = { + {.mode =0 , .m =0x53 , .n =0x0C , .p =0x1 },/* 166 MHz */ {.mode =0 , .m =0x85 , .n =0x0C , .p =0x1 },/* 266 MHz */ {.mode =0 , .m =0xA6 , .n =0x0C , .p =0x1 },/* 332 MHz */ };
@@ -75,7 +76,7 @@ static struct clk pll1_clk = { .calc_rate = &pll_calc_rate, .recalc = &pll_clk_recalc, .set_rate = &pll_clk_set_rate, - .rate_config = {pll_rtbl, ARRAY_SIZE(pll_rtbl), 1}, + .rate_config = {pll_rtbl, ARRAY_SIZE(pll_rtbl), 2}, .private_data = &pll1_config, };
@@ -95,7 +96,7 @@ static struct clk pll2_clk = { .calc_rate = &pll_calc_rate, .recalc = &pll_clk_recalc, .set_rate = &pll_clk_set_rate, - .rate_config = {pll_rtbl, ARRAY_SIZE(pll_rtbl), 1}, + .rate_config = {pll_rtbl, ARRAY_SIZE(pll_rtbl), 2}, .private_data = &pll2_config, };
arch/arm/plat-spear/Makefile +1 -1
@@ -6,7 +6,7 @@ obj-y := clcd.o clock.o pll_clk.o time.o obj-$(CONFIG_ARCH_SPEAR3XX) += shirq.o padmux.o - +obj-$(CONFIG_CPU_FREQ) += cpufreq.o obj-$(CONFIG_MACH_SPEAR310) += plgpio.o obj-$(CONFIG_MACH_SPEAR320) += plgpio.o obj-$(CONFIG_SPEAR_PWM) += pwm.o
arch/arm/plat-spear/cpufreq.c new file +159 -0
159 lines not on this page · raw message
Signature · 1 line
1.7.2.2
PATCH v4 38/62 SPEAr CPU freq: Adding support for CPU Freq framework
Hi,
Quoted 7 lines · Viresh Kumar
From: Deepak Sikri <[email protected]>
Signed-off-by Deepak Sikri <[email protected]>Signed-off-by Rajeev Kumar <[email protected]>Signed-off-by shiraz hashim <[email protected]>Signed-off-by Viresh Kumar <[email protected]>---
[...]
Quoted 65 lines
arch/arm/plat-spear/cpufreq.c new file +59
-0@@ -0,0 +1,159 @@ +/* +* arch/arm/plat-spear/cpufreq.c +* +* CPU Frequency Scaling for SPEAr platform +* +* Copyright (C) 2010 ST Microelectronics +* Deepak Sikri<[email protected]> +* +* +* This file is licensed under the terms of the GNU General Public +* License version 2. This program is licensed "as is" without any +* warranty of any kind, whether express or implied. +*/ + +#include <linux/types.h> +#include <linux/kernel.h> +#include <linux/sched.h> +#include <linux/cpufreq.h> +#include <linux/delay.h> +#include <linux/init.h> +#include <linux/err.h> +#include <linux/clk.h> +#include <linux/io.h> +#include <asm/system.h> +#include <mach/hardware.h> + +#define CPU_CLK "cpu_clk" + +#ifdef CONFIG_ARCH_SPEAR13XX +#define MIN_CPU_FREQ 200000 +#define MAX_CPU_FREQ 500000 + +static u32 spear_cpu_freq[] = { +200000 ,/* 200 MHZ */ +250000 ,/* 250 MHZ */ +332000 ,/* 332 MHZ */ +400000 ,/* 400 MHZ */ +500000 ,/* 500 MHZ */ +}; +#elif defined(CONFIG_ARCH_SPEAR6XX ) || defined(CONFIG_ARCH_SPEAR3XX ) +#define MIN_CPU_FREQ 166000 +#define MAX_CPU_FREQ 332000 + +static u32 spear_cpu_freq[] = { +166000 ,/* 166 MHZ */ +266000 ,/* 266 MHZ */ +332000 ,/* 333 MHZ */ +}; +#endif + +static struct +cpufreq_frequency_table spear_freq_tbl[ARRAY_SIZE (spear_cpu_freq) +1 ]; +static struct clk *cpu_clk; + +int spear_cpufreq_verify (struct cpufreq_policy *policy) +{ +return cpufreq_frequency_table_verify (policy, spear_freq_tbl); +} +
arch/arm/plat-spear/cpufreq.c line 69
Quoted 10 lines
arch/arm/plat-spear/cpufreq.c new file +10
-0+unsigned int spear_cpufreq_get (unsigned int cpu) +{ +unsigned long rate; + +if (cpu) +return 0 ; + + rate =clk_get_rate (cpu_clk) /1000 ; +return rate; +}
Can this be simplified to:
unsigned int spear_cpufreq_get(unsigned int cpu)
{
return cpu ? 0 : clk_get_rate(cpu_clk) / 1000;
}? It could also be made static.
Quoted 15 lines
arch/arm/plat-spear/cpufreq.c new file +15
-0+ +static int spear_cpufreq_target (struct cpufreq_policy *policy, +unsigned int target_freq,unsigned int relation) +{ +struct cpufreq_freqs freqs; +int ret =0 ; +int index; + +if (policy->cpu !=0 ) +return -EINVAL ; + +if (cpufreq_frequency_table_target (policy, spear_freq_tbl, + target_freq, relation, &index)) +return -EINVAL ; +
arch/arm/plat-spear/cpufreq.c line 94
Quoted 10 lines
arch/arm/plat-spear/cpufreq.c new file +10
-0+ freqs.old =spear_cpufreq_get (0 ); + freqs.new = spear_cpu_freq[index]; + freqs.cpu = policy->cpu; + +if (freqs.old == target_freq) +return 0 ; + +cpufreq_notify_transition (&freqs,CPUFREQ_PRECHANGE ); + ret =clk_set_rate (cpu_clk, freqs.new *1000 ); +cpufreq_notify_transition (&freqs,CPUFREQ_POSTCHANGE );
If clk_set_rate() failed then do you need to do freqs.new = clk_get_rate(cpu_clk) before doing the CPUFREQ_POSTCHANGE to make sure you don't notify the wrong frequency?
Quoted 21 lines
arch/arm/plat-spear/cpufreq.c new file +21
-0+ +return ret; +} + +static int spear_cpufreq_init (struct cpufreq_policy *policy) +{ +int result; +int i =0 ; + +if (policy->cpu !=0 ) +return -EINVAL ; + + cpu_clk =clk_get (NULL ,CPU_CLK ); +if (IS_ERR (cpu_clk)) +return PTR_ERR (cpu_clk); + + policy->cpuinfo.min_freq =MIN_CPU_FREQ ; + policy->cpuinfo.max_freq =MAX_CPU_FREQ ; + policy->cur = policy->min = policy->max =spear_cpufreq_get (0 ); + +for (i =0 ; i <ARRAY_SIZE (spear_cpu_freq); i++) {
arch/arm/plat-spear/cpufreq.c line 125
Quoted 10 lines
arch/arm/plat-spear/cpufreq.c new file +10
-0+ spear_freq_tbl[i].index = i; + spear_freq_tbl[i].frequency = spear_cpu_freq[i]; + } + + spear_freq_tbl[i].index = i; + spear_freq_tbl[i].frequency =CPUFREQ_TABLE_END ; + result =cpufreq_frequency_table_cpuinfo (policy, spear_freq_tbl); +if (!result) +cpufreq_frequency_table_get_attr (spear_freq_tbl, + policy->cpu);
result doesn't appear to be used to do anything other than check the return of cpufreq_frequency_table_cpuinfo() so could tou just eliminate that local variable?
arch/arm/plat-spear/cpufreq.c line 127
Quoted 2 lines
arch/arm/plat-spear/cpufreq.c new file +2
-0+ + policy->cpuinfo.transition_latency =300 *1000 ;/*250 uS*/
The comment doesn't appear to match the value here.
Quoted 22 lines
arch/arm/plat-spear/cpufreq.c new file +22
-0+ +return 0 ; +} + +static int spear_cpufreq_exit (struct cpufreq_policy *policy) +{ +clk_put (cpu_clk); +return 0 ; +} + +static struct freq_attr *spear_cpufreq_attr[] = { + &cpufreq_freq_attr_scaling_available_freqs, +NULL , +}; + +static struct cpufreq_driver spear_driver = { + .flags =CPUFREQ_STICKY , + .verify = spear_cpufreq_verify, + .target = spear_cpufreq_target, + .get = spear_cpufreq_get, + .init = spear_cpufreq_init, + .exit = spear_cpufreq_exit,
arch/arm/plat-spear/cpufreq.c line 159
Quoted 10 lines
arch/arm/plat-spear/cpufreq.c new file +10
-0+ .name = "spear_cpufreq", + .attr = spear_cpufreq_attr, +}; + +static int __init spear_cpufreq_register (void ) +{ +return cpufreq_register_driver (&spear_driver); +} + +arch_initcall (spear_cpufreq_register);
Jamie
PATCH v4 38/62 SPEAr CPU freq: Adding support for CPU Freq framework
Hi James,
Quoted 92 lines · Jamie Iles
Hi,
Quoted 8 lines · Viresh Kumar
From: Deepak Sikri <[email protected]>
Signed-off-by Deepak Sikri <[email protected]>Signed-off-by Rajeev Kumar <[email protected]>Signed-off-by shiraz hashim <[email protected]>Signed-off-by Viresh Kumar <[email protected]>---
[...]
Quoted 66 lines
arch/arm/plat-spear/cpufreq.c new file +59
-0@@ -0,0 +1,159 @@ +/* +* arch/arm/plat-spear/cpufreq.c +* +* CPU Frequency Scaling for SPEAr platform +* +* Copyright (C) 2010 ST Microelectronics +* Deepak Sikri<[email protected]> +* +* +* This file is licensed under the terms of the GNU General Public +* License version 2. This program is licensed "as is" without any +* warranty of any kind, whether express or implied. +*/ + +#include <linux/types.h> +#include <linux/kernel.h> +#include <linux/sched.h> +#include <linux/cpufreq.h> +#include <linux/delay.h> +#include <linux/init.h> +#include <linux/err.h> +#include <linux/clk.h> +#include <linux/io.h> +#include <asm/system.h> +#include <mach/hardware.h> + +#define CPU_CLK "cpu_clk" + +#ifdef CONFIG_ARCH_SPEAR13XX +#define MIN_CPU_FREQ 200000 +#define MAX_CPU_FREQ 500000 + +static u32 spear_cpu_freq[] = { +200000 ,/* 200 MHZ */ +250000 ,/* 250 MHZ */ +332000 ,/* 332 MHZ */ +400000 ,/* 400 MHZ */ +500000 ,/* 500 MHZ */ +}; +#elif defined(CONFIG_ARCH_SPEAR6XX ) || defined(CONFIG_ARCH_SPEAR3XX ) +#define MIN_CPU_FREQ 166000 +#define MAX_CPU_FREQ 332000 + +static u32 spear_cpu_freq[] = { +166000 ,/* 166 MHZ */ +266000 ,/* 266 MHZ */ +332000 ,/* 333 MHZ */ +}; +#endif + +static struct +cpufreq_frequency_table spear_freq_tbl[ARRAY_SIZE (spear_cpu_freq) +1 ]; +static struct clk *cpu_clk; + +int spear_cpufreq_verify (struct cpufreq_policy *policy) +{ +return cpufreq_frequency_table_verify (policy, spear_freq_tbl); +} +arch/arm/plat-spear/cpufreq.c line 69
Quoted 10 lines
arch/arm/plat-spear/cpufreq.c new file +10
-0+unsigned int spear_cpufreq_get (unsigned int cpu) +{ +unsigned long rate; + +if (cpu) +return 0 ; + + rate =clk_get_rate (cpu_clk) /1000 ; +return rate; +}Can this be simplified to:
Quoted 8 lines
unsigned int spear_cpufreq_get(unsigned int cpu) { return cpu ? 0 : clk_get_rate(cpu_clk) / 1000; }? It could also be made static.
Agreed, we will update this in the next patch
Quoted 21 lines
Quoted 21 lines
arch/arm/plat-spear/cpufreq.c new file +21
-0+ +static int spear_cpufreq_target (struct cpufreq_policy *policy, +unsigned int target_freq,unsigned int relation) +{ +struct cpufreq_freqs freqs; +int ret =0 ; +int index; + +if (policy->cpu !=0 ) +return -EINVAL ; + +if (cpufreq_frequency_table_target (policy, spear_freq_tbl, + target_freq, relation, &index)) +return -EINVAL ; + + freqs.old =spear_cpufreq_get (0 ); + freqs.new = spear_cpu_freq[index]; + freqs.cpu = policy->cpu; + +if (freqs.old == target_freq) +return 0 ;
Quoted 10 lines
arch/arm/plat-spear/cpufreq.c line 94
Quoted 5 lines
arch/arm/plat-spear/cpufreq.c new file +4
-0+ +cpufreq_notify_transition (&freqs,CPUFREQ_PRECHANGE ); + ret =clk_set_rate (cpu_clk, freqs.new *1000 ); +cpufreq_notify_transition (&freqs,CPUFREQ_POSTCHANGE );If
clk_set_rate()failed then do you need to do freqs.new =clk_get_rate(cpu_clk)before doing theCPUFREQ_POSTCHANGEto make sure you don't notify the wrong frequency?
I do have a point over here. In few of the drivers where the the pre notifiers have been added, the operations have been stopped (assume a network driver where we stalled a dma operation), and then we set the clock rate, followed by a post notifier where driver resumes it operations.
Now lets take the case, when the clock set rate fails ( Most failure could only be when the driver is unable to find any clock rate which is less then/equal to requested rate) .
The post transition notifier should happen so as to allow the driver to resume its functions. If there are no clock rate changes because of set rate failures, the driver would be aware of that by using calls such as clk_get_rate, and would carry forward it's operations accordingly.
How do you suggest to go about it ?
Quoted 27 lines
Quoted 27 lines
arch/arm/plat-spear/cpufreq.c new file +27
-0+ +return ret; +} + +static int spear_cpufreq_init (struct cpufreq_policy *policy) +{ +int result; +int i =0 ; + +if (policy->cpu !=0 ) +return -EINVAL ; + + cpu_clk =clk_get (NULL ,CPU_CLK ); +if (IS_ERR (cpu_clk)) +return PTR_ERR (cpu_clk); + + policy->cpuinfo.min_freq =MIN_CPU_FREQ ; + policy->cpuinfo.max_freq =MAX_CPU_FREQ ; + policy->cur = policy->min = policy->max =spear_cpufreq_get (0 ); + +for (i =0 ; i <ARRAY_SIZE (spear_cpu_freq); i++) { + spear_freq_tbl[i].index = i; + spear_freq_tbl[i].frequency = spear_cpu_freq[i]; + } + + spear_freq_tbl[i].index = i; + spear_freq_tbl[i].frequency =CPUFREQ_TABLE_END ;
Quoted 10 lines
arch/arm/plat-spear/cpufreq.c line 125
Quoted 5 lines
arch/arm/plat-spear/cpufreq.c new file +4
-0+ result =cpufreq_frequency_table_cpuinfo (policy, spear_freq_tbl); +if (!result) +cpufreq_frequency_table_get_attr (spear_freq_tbl, + policy->cpu);result doesn't appear to be used to do anything other than check the return of
cpufreq_frequency_table_cpuinfo()so could tou just eliminate that local variable?
We will do it
Quoted 6 lines
arch/arm/plat-spear/cpufreq.c line 127
Quoted 3 lines
arch/arm/plat-spear/cpufreq.c new file +2
-0+ + policy->cpuinfo.transition_latency =300 *1000 ;/*250 uS*/ The comment doesn't appear to match the value here.
Will update the comment
Quoted 27 lines
Quoted 27 lines
arch/arm/plat-spear/cpufreq.c new file +27
-0+ +return 0 ; +} + +static int spear_cpufreq_exit (struct cpufreq_policy *policy) +{ +clk_put (cpu_clk); +return 0 ; +} + +static struct freq_attr *spear_cpufreq_attr[] = { + &cpufreq_freq_attr_scaling_available_freqs, +NULL , +}; + +static struct cpufreq_driver spear_driver = { + .flags =CPUFREQ_STICKY , + .verify = spear_cpufreq_verify, + .target = spear_cpufreq_target, + .get = spear_cpufreq_get, + .init = spear_cpufreq_init, + .exit = spear_cpufreq_exit, + .name ="spear_cpufreq" , + .attr = spear_cpufreq_attr, +}; + +static int __init spear_cpufreq_register (void )
Quoted 10 lines
arch/arm/plat-spear/cpufreq.c line 159
Quoted 6 lines
arch/arm/plat-spear/cpufreq.c new file +5
-0+{ +return cpufreq_register_driver (&spear_driver); +} + +arch_initcall (spear_cpufreq_register);Jamie
.
regards
Deepak
PATCH v4 38/62 SPEAr CPU freq: Adding support for CPU Freq framework
Quoted 46 lines · deepaksi
Hi James,
Quoted 20 lines · Jamie Iles
Quoted 20 lines
arch/arm/plat-spear/cpufreq.c new file +20
-0+static int spear_cpufreq_target (struct cpufreq_policy *policy, +unsigned int target_freq,unsigned int relation) +{ +struct cpufreq_freqs freqs; +int ret =0 ; +int index; + +if (policy->cpu !=0 ) +return -EINVAL ; + +if (cpufreq_frequency_table_target (policy, spear_freq_tbl, + target_freq, relation, &index)) +return -EINVAL ; + + freqs.old =spear_cpufreq_get (0 ); + freqs.new = spear_cpu_freq[index]; + freqs.cpu = policy->cpu; + +if (freqs.old == target_freq) +return 0 ;Quoted 10 lines
arch/arm/plat-spear/cpufreq.c line 94
Quoted 5 lines
arch/arm/plat-spear/cpufreq.c new file +4
-0+ +cpufreq_notify_transition (&freqs,CPUFREQ_PRECHANGE ); + ret =clk_set_rate (cpu_clk, freqs.new *1000 ); +cpufreq_notify_transition (&freqs,CPUFREQ_POSTCHANGE );If
clk_set_rate()failed then do you need to do freqs.new =clk_get_rate(cpu_clk)before doing theCPUFREQ_POSTCHANGEto make sure you don't notify the wrong frequency?I do have a point over here. In few of the drivers where the the pre notifiers have been added, the operations have been stopped (assume a network driver where we stalled a dma operation), and then we set the clock rate, followed by a post notifier where driver resumes it operations.
Now lets take the case, when the clock set rate fails ( Most failure could only be when the driver is unable to find any clock rate which is less then/equal to requested rate) .
The post transition notifier should happen so as to allow the driver to resume its functions. If there are no clock rate changes because of set rate failures, the driver would be aware of that by using calls such asclk_get_rate, and would carry forward it's operations accordingly.
Quoted 1 line
How do you suggest to go about it ?
Sorry, I didn't mean to remove the post notifier, just do something like:
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); ret = clk_set_rate(cpu_clk, freqs.new * 1000); if (ret) freqs.new = clk_get_rate(cpu_clk); cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
Or:
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); ret = clk_set_rate(cpu_clk, freqs.new * 1000); if (ret) freqs.new = freqs.old; cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
So that you're notifying the cpufreq subsystem of the frequency that you're actually running at with the post change notifier rather than the one you tried to go for. If you don't do this then for UP you'll end up recaculating lpj based on the wrong frequency.
Jamie
PATCH v4 38/62 SPEAr CPU freq: Adding support for CPU Freq framework
Hi James,
Quoted 65 lines · Jamie Iles
Quoted 46 lines · deepaksi
Hi James,
Quoted 20 lines · Jamie Iles
Quoted 20 lines
arch/arm/plat-spear/cpufreq.c new file +20
-0+static int spear_cpufreq_target (struct cpufreq_policy *policy, +unsigned int target_freq,unsigned int relation) +{ +struct cpufreq_freqs freqs; +int ret =0 ; +int index; + +if (policy->cpu !=0 ) +return -EINVAL ; + +if (cpufreq_frequency_table_target (policy, spear_freq_tbl, + target_freq, relation, &index)) +return -EINVAL ; + + freqs.old =spear_cpufreq_get (0 ); + freqs.new = spear_cpu_freq[index]; + freqs.cpu = policy->cpu; + +if (freqs.old == target_freq) +return 0 ;Quoted 10 lines
arch/arm/plat-spear/cpufreq.c line 94
Quoted 5 lines
arch/arm/plat-spear/cpufreq.c new file +4
-0+ +cpufreq_notify_transition (&freqs,CPUFREQ_PRECHANGE ); + ret =clk_set_rate (cpu_clk, freqs.new *1000 ); +cpufreq_notify_transition (&freqs,CPUFREQ_POSTCHANGE );If
clk_set_rate()failed then do you need to do freqs.new =clk_get_rate(cpu_clk)before doing theCPUFREQ_POSTCHANGEto make sure you don't notify the wrong frequency?I do have a point over here. In few of the drivers where the the pre notifiers have been added, the operations have been stopped (assume a network driver where we stalled a dma operation), and then we set the clock rate, followed by a post notifier where driver resumes it operations.
Now lets take the case, when the clock set rate fails ( Most failure could only be when the driver is unable to find any clock rate which is less then/equal to requested rate) .
The post transition notifier should happen so as to allow the driver to resume its functions. If there are no clock rate changes because of set rate failures, the driver would be aware of that by using calls such asclk_get_rate, and would carry forward it's operations accordingly.Quoted 1 line
How do you suggest to go about it ?
Sorry, I didn't mean to remove the post notifier, just do something like:
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); ret = clk_set_rate(cpu_clk, freqs.new * 1000); if (ret) freqs.new = clk_get_rate(cpu_clk); cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);Or:
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); ret = clk_set_rate(cpu_clk, freqs.new * 1000); if (ret) freqs.new = freqs.old; cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
Quoted 4 lines
So that you're notifying the cpufreq subsystem of the frequency that you're actually running at with the post change notifier rather than the one you tried to go for. If you don't do this then for UP you'll end up recaculating lpj based on the wrong frequency.
Agree. We would add it here. Thanks for pointing out.
Signature · 2 lines
regards Shiraz
PATCH v4 38/62 SPEAr CPU freq: Adding support for CPU Freq framework
Hi Jamie,
Quoted 68 lines · Shiraz Hashim
Hi James,
Quoted 65 lines · Jamie Iles
Quoted 46 lines · deepaksi
Hi James,
Quoted 20 lines · Jamie Iles
Quoted 20 lines
arch/arm/plat-spear/cpufreq.c new file +20
-0+static int spear_cpufreq_target (struct cpufreq_policy *policy, +unsigned int target_freq,unsigned int relation) +{ +struct cpufreq_freqs freqs; +int ret =0 ; +int index; + +if (policy->cpu !=0 ) +return -EINVAL ; + +if (cpufreq_frequency_table_target (policy, spear_freq_tbl, + target_freq, relation, &index)) +return -EINVAL ; + + freqs.old =spear_cpufreq_get (0 ); + freqs.new = spear_cpu_freq[index]; + freqs.cpu = policy->cpu; + +if (freqs.old == target_freq) +return 0 ;Quoted 10 lines
arch/arm/plat-spear/cpufreq.c line 94
Quoted 5 lines
arch/arm/plat-spear/cpufreq.c new file +4
-0+ +cpufreq_notify_transition (&freqs,CPUFREQ_PRECHANGE ); + ret =clk_set_rate (cpu_clk, freqs.new *1000 ); +cpufreq_notify_transition (&freqs,CPUFREQ_POSTCHANGE );If
clk_set_rate()failed then do you need to do freqs.new =clk_get_rate(cpu_clk)before doing theCPUFREQ_POSTCHANGEto make sure you don't notify the wrong frequency?I do have a point over here. In few of the drivers where the the pre notifiers have been added, the operations have been stopped (assume a network driver where we stalled a dma operation), and then we set the clock rate, followed by a post notifier where driver resumes it operations.
Now lets take the case, when the clock set rate fails ( Most failure could only be when the driver is unable to find any clock rate which is less then/equal to requested rate) .
The post transition notifier should happen so as to allow the driver to resume its functions. If there are no clock rate changes because of set rate failures, the driver would be aware of that by using calls such asclk_get_rate, and would carry forward it's operations accordingly.Quoted 1 line
How do you suggest to go about it ?
Sorry, I didn't mean to remove the post notifier, just do something like:
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); ret = clk_set_rate(cpu_clk, freqs.new * 1000); if (ret) freqs.new = clk_get_rate(cpu_clk); cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);Or:
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); ret = clk_set_rate(cpu_clk, freqs.new * 1000); if (ret) freqs.new = freqs.old; cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
Quoted 6 lines
Quoted 4 lines
So that you're notifying the cpufreq subsystem of the frequency that you're actually running at with the post change notifier rather than the one you tried to go for. If you don't do this then for UP you'll end up recaculating lpj based on the wrong frequency.
Agree. We would add it here. Thanks for pointing out.
On second thought it should always be there irrespective of failures as in our case it may happen that eventually CPU sets to a clock <= desired clock. So we would do following
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); ret = clk_set_rate(cpu_clk, freqs.new * 1000); if (ret)
pr_err("Could not change cpu clk rate\n");freqs.new = clk_get_rate(cpu_clk); cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
Is it fine?
Signature · 2 lines
regards Shiraz
PATCH v4 38/62 SPEAr CPU freq: Adding support for CPU Freq framework
Quoted 10 lines · Shiraz Hashim
On second thought it should always be there irrespective of failures as in our case it may happen that eventually CPU sets to a clock <= desired clock. So we would do following
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); ret =clk_set_rate(cpu_clk, freqs.new * 1000); if (ret)pr_err("Could not change cpu clk rate\n");freqs.new =
clk_get_rate(cpu_clk);cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
It probably makes more sense to do:
newfreq = clk_round_rate(cpu_clk, freqs.new * 1000);
if (newfreq < 0) {
pr_err("Invalid frequency blah blah\n");
return newfreq;
}
freqs.new = newfreq / 1000;
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
ret = clk_set_rate(cpu_clk, newfreq);
if (ret) {
pr_err("Could not change cpu clk rate\n");
freqs.new = clk_get_rate(cpu_clk) / 1000;
}
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);so that the prechange notifier gets the actual frequency to be switched to too. In theory clk_set_rate() should only fail if the new frequency couldn't be set for some reason.
PATCH v4 38/62 SPEAr CPU freq: Adding support for CPU Freq framework
Quoted 29 lines · Russell King - ARM Linux
Quoted 10 lines · Shiraz Hashim
On second thought it should always be there irrespective of failures as in our case it may happen that eventually CPU sets to a clock <= desired clock. So we would do following
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); ret =clk_set_rate(cpu_clk, freqs.new * 1000); if (ret)
? ? ? ?pr_err("Could not change cpu clk rate\n"); freqs.new =clk_get_rate(cpu_clk);cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);It probably makes more sense to do:
? ? ? ?newfreq =
clk_round_rate(cpu_clk, freqs.new * 1000); ? ? ? ?if (newfreq < 0) {
? ? ? ? ? ? ? ?pr_err("Invalid frequency blah blah\n"); ? ? ? ? ? ? ? ?return newfreq;
? ? ? ?}? ? ? ?freqs.new = newfreq / 1000;
? ? ? ?cpufreq_notify_transition(&freqs,CPUFREQ_PRECHANGE); ? ? ? ?ret =clk_set_rate(cpu_clk, newfreq);
? ? ? ?if (ret) {
? ? ? ? ? ? ? ?pr_err("Could not change cpu clk rate\n"); ? ? ? ? ? ? ? ?freqs.new =clk_get_rate(cpu_clk)/ 1000; ? ? ? ?}
? ? ? ?cpufreq_notify_transition(&freqs,CPUFREQ_POSTCHANGE);
Quoted 4 lines
so that the prechange notifier gets the actual frequency to be switched to too. ?In theory
clk_set_rate()should only fail if the new frequency couldn't be set for some reason.
Ok.
PATCH v4 39/62 ST SPEAr13xx: Adding CPU hotplug support added for SMP platforms
In reply to Viresh KumarFrom: Deepak Sikri <[email protected]>
--- arch/arm/mach-spear13xx/Makefile | 1 + arch/arm/mach-spear13xx/hotplug.c | 121 +++++++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+), 0 deletions(-) create mode 100644 arch/arm/mach-spear13xx/hotplug.c
arch/arm/mach-spear13xx/Makefile +1 -0
@@ -5,6 +5,7 @@ # common files obj-y += spear13xx.o clock.o obj-$(CONFIG_SMP) += platsmp.o headsmp.o +obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o obj-$(CONFIG_LOCAL_TIMERS) += localtimer.o obj-$(CONFIG_PCIEPORTBUS) += pcie.o obj-$(CONFIG_PM) += pm.o sleep.o
arch/arm/mach-spear13xx/hotplug.c new file +121 -0
121 lines not on this page · raw message
Signature · 1 line
1.7.2.2
PATCH v4 40/62 ST SPEAr: replace readl, writel with readl_relaxed, writel_relaxed in uncompress.h
In reply to Viresh Kumarreadl also calls outer cache maintainance operations which are not available during Linux uncompression. This patch replaces readl, writel with readl_relaxed and writel_relaxed.
--- arch/arm/plat-spear/include/plat/uncompress.h | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
arch/arm/plat-spear/include/plat/uncompress.h +2 -2
@@ -24,10 +24,10 @@ static inline void putc(int c) {void __iomem *base = (void __iomem *)SPEAR_DBG_UART_BASE ; -while (readl (base + UART01x_FR) & UART01x_FR_TXFF) +while (readl_relaxed (base + UART01x_FR) & UART01x_FR_TXFF)barrier (); -writel (c, base + UART01x_DR); +writel_relaxed (c, base + UART01x_DR); }static inline void flush (void )
Signature · 1 line
1.7.2.2
PATCH v4 41/62 ST SPEAr13xx: add L2 cache support
In reply to Viresh KumarFrom: Shiraz Hashim <[email protected]>
--- arch/arm/mach-spear13xx/spear13xx.c | 19 +++++++++++++++++++ arch/arm/mm/Kconfig | 2 +- 2 files changed, 20 insertions(+), 1 deletions(-)
arch/arm/mach-spear13xx/spear13xx.c +19 -0
@@ -21,6 +21,7 @@#include <asm/irq.h> #include <asm/localtimer.h> #include <asm/mach/arch.h> +#include <asm/hardware/cache-l2x0.h> #include <asm/smp_twd.h> #include <mach/irqs.h> #include <mach/generic.h>
@@ -393,6 +394,17 @@ struct platform_device spear13xx_sdhci_device = {/* Do spear13xx familiy common initialization part here */ void __init spear13xx_init (void ) { +#ifdef CONFIG_CACHE_L2X0 +/* +* 512KB (64KB/way), 8-way associativity, parity supported +* +* TODO: 0x249, picked from nomadik, to be analyzed +* Comment from nomadik: +* At full speed latency must be >=2, so 0x249 in low bits +*/ +l2x0_init (__io_address (SPEAR13XX_L2CC_BASE ),0x00260249 ,0xfe00ffff ); +#endif +sdhci_enable (); }
@@ -415,6 +427,13 @@ struct map_desc spear13xx_io_desc[] __initdata = { .pfn = __phys_to_pfn(SPEAR13XX_A9SM_PERIP_BASE), .length = SZ_8K, .type = MT_DEVICE +#ifdef CONFIG_CACHE_L2X0 + }, { + .virtual = IO_ADDRESS(SPEAR13XX_L2CC_BASE), + .pfn = __phys_to_pfn(SPEAR13XX_L2CC_BASE), + .length = SZ_4K, + .type = MT_DEVICE +#endif }, { .virtual = IO_ADDRESS(SPEAR13XX_MISC_BASE), .pfn = __phys_to_pfn(SPEAR13XX_MISC_BASE),
arch/arm/mm/Kconfig +1 -1
@@ -813,7 +813,7 @@ config CACHE_L2X0 depends on REALVIEW_EB_ARM11MP || MACH_REALVIEW_PB11MP || MACH_REALVIEW_PB1176 || \ REALVIEW_EB_A9MP || ARCH_MX35 || ARCH_MX31 || MACH_REALVIEW_PBX || \ ARCH_NOMADIK || ARCH_OMAP4 || ARCH_S5PV310 || ARCH_TEGRA || \ - ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || ARCH_SHMOBILE + ARCH_SPEAR13XX || ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || ARCH_SHMOBILE default y select OUTER_CACHE select OUTER_CACHE_SYNC
Signature · 1 line
1.7.2.2
PATCH v4 42/62 ST SPEAr13xx: Modified static mappings
In reply to Viresh KumarFrom: Shiraz Hashim <[email protected]>
The new static io mappings map regions in 0xE...,.... space to 0xF...,.... and those in space 0x6...,.... to 0xE...,.... range. This is done to accomodate regions of RAS configuration registers to be used by clock frameowrk and possibly others.
--- arch/arm/mach-spear13xx/include/mach/hardware.h | 7 ++++++- arch/arm/mach-spear13xx/include/mach/vmalloc.h | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-)
arch/arm/mach-spear13xx/include/mach/hardware.h +6 -1
@@ -17,7 +17,12 @@#include <mach/spear.h> /* Vitual to physical translation of statically mapped space */ -#define IO_ADDRESS (x) (x | 0xF0000000) +/* +* if phy_addr is 0x8...,.... and above then map it to 0xF...,.... +* else map it to 0xE...,.... +*/ + +#define IO_ADDRESS (x) ((x) | ((((x) >> 31) << 28) | 0xE0000000))/* typesafe io address */ #define __io_address (n) __io(IO_ADDRESS(n))
arch/arm/mach-spear13xx/include/mach/vmalloc.h +1 -1
@@ -13,6 +13,6 @@#ifndef __MACH_VMALLOC_H#define __MACH_VMALLOC_H -#include <plat/vmalloc.h> +#define VMALLOC_END 0xEC800000UL#endif /* __MACH_VMALLOC_H */
Signature · 1 line
1.7.2.2
PATCH v4 43/62 SPEAr1310: Adding Static Mapping for RAS Area
In reply to Viresh KumarThis patch adds static mapping for RAS area in SPEAr1310.
--- arch/arm/mach-spear13xx/include/mach/generic.h | 1 + arch/arm/mach-spear13xx/spear1310.c | 17 +++++++++++++++++ arch/arm/mach-spear13xx/spear1310_evb.c | 2 +- 3 files changed, 19 insertions(+), 1 deletions(-)
arch/arm/mach-spear13xx/include/mach/generic.h +1 -0
@@ -68,6 +68,7 @@ extern struct platform_device spear1310_can1_device;/* Add spear1310 machine function declarations here */ void __init spear1310_init (void ); +void __init spear1310_map_io (void );#endif /* CONFIG_MACH_SPEAR1310 */
arch/arm/mach-spear13xx/spear1310.c +17 -0
@@ -55,6 +55,23 @@ struct platform_device spear1310_can1_device = { .resource = can1_resources, }; +/* Following will create 1310 specific static virtual/physical mappings */ +struct map_desc spear1310_io_desc[]__initdata = { + { + .virtual =IO_ADDRESS (SPEAR1310_RAS_BASE ), + .pfn =__phys_to_pfn (SPEAR1310_RAS_BASE ), + .length =SZ_4K , + .type =MT_DEVICE + }, +}; + +/* This will create static memory mapping for selected devices */ +void __init spear1310_map_io (void ) +{ +spear13xx_map_io (); +iotable_init (spear1310_io_desc,ARRAY_SIZE (spear1310_io_desc)); +} +void __init spear1310_init (void ) {/* call spear13xx family common init function */
arch/arm/mach-spear13xx/spear1310_evb.c +1 -1
@@ -126,7 +126,7 @@ static void __init spear1310_evb_init(void)MACHINE_START (SPEAR1310 ,"ST-SPEAR1310-EVB" ) .boot_params = 0x00000100, - .map_io = spear13xx_map_io, + .map_io = spear1310_map_io, .init_irq = spear13xx_init_irq, .timer = &spear13xx_timer, .init_machine = spear1310_evb_init,
Signature · 1 line
1.7.2.2
PATCH v4 44/62 SPEAr: Adding and Updating Clock definitions
In reply to Viresh Kumar--- arch/arm/mach-spear13xx/clock.c | 210 ++++++++++++++++++++- arch/arm/mach-spear13xx/include/mach/misc_regs.h | 19 ++ arch/arm/mach-spear3xx/clock.c | 6 +- arch/arm/mach-spear6xx/clock.c | 4 +- 4 files changed, 224 insertions(+), 15 deletions(-)
arch/arm/mach-spear13xx/clock.c +200 -10
@@ -355,6 +355,7 @@ static struct aux_clk_config uart_synth_config = {/* aux rate configuration table, in ascending order of rates */ struct aux_rate_tbl aux_rtbl[] = {/* For PLL1div2 = 500 MHz */ + {.xscale =2 , .yscale =21 , .eq =1 },/* 48 MHz */ {.xscale =1 , .yscale =6 , .eq =1 },/* 83 MHz */ {.xscale =1 , .yscale =4 , .eq =1 },/* 125 MHz */ {.xscale =1 , .yscale =3 , .eq =1 },/* 166 MHz */
@@ -369,7 +370,7 @@ static struct clk uart_synth_clk = { .calc_rate = &aux_calc_rate, .recalc = &aux_clk_recalc, .set_rate = &aux_clk_set_rate, - .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 0}, + .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 1}, .private_data = &uart_synth_config, };
@@ -415,7 +416,7 @@ static struct clk sdhci_synth_clk = { .calc_rate = &aux_calc_rate, .recalc = &aux_clk_recalc, .set_rate = &aux_clk_set_rate, - .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 2}, + .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 0}, .private_data = &sdhci_synth_config, };
@@ -441,7 +442,7 @@ static struct clk cfxd_synth_clk = { .calc_rate = &aux_calc_rate, .recalc = &aux_clk_recalc, .set_rate = &aux_clk_set_rate, - .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 2}, + .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 0}, .private_data = &cfxd_synth_config, };
@@ -467,7 +468,7 @@ static struct clk c3_synth_clk = { .calc_rate = &aux_calc_rate, .recalc = &aux_clk_recalc, .set_rate = &aux_clk_set_rate, - .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 0}, + .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 1}, .private_data = &c3_synth_config, };
@@ -579,7 +580,7 @@ static struct pclk_sel gmac_phy_pclk_sel = { };/* gmac phy clock */ -static struct clk gmac_phy_clk = { +static struct clk gmac_phy0_clk = { .flags =ALWAYS_ENABLED , .pclk_sel = &gmac_phy_pclk_sel, .pclk_sel_shift =GMAC_PHY_CLK_SHIFT ,
@@ -697,8 +698,8 @@ static struct clk jpeg_clk = { .recalc = &follow_parent, }; -/* gmac clock */ -static struct clk gmac_clk = { +/* gmac clock :Fixed Part*/ +static struct clk gmac0_clk = { .pclk = &ahb_clk, .en_reg =PERIP1_CLK_ENB , .en_reg_bit =GMAC_CLK_ENB ,
@@ -839,6 +840,92 @@ static struct clk kbd_clk = { .recalc = &follow_parent, }; +/* RAS CLOCKS */ +/* pll3 generated clock */ +static struct clk ras_pll3_clk = { + .pclk = &pll3_clk, + .en_reg =RAS_CLK_ENB , + .en_reg_bit =PLL3_CLK_ENB , + .recalc = &follow_parent, +}; + +/* pll2 generated clock */ +static struct clk ras_pll2_clk = { + .pclk = &pll2_clk, + .en_reg =RAS_CLK_ENB , + .en_reg_bit =PLL2_CLK_ENB , + .recalc = &follow_parent, +}; + +/* 125MHz clock generated on Tx pad */ +static struct clk ras_tx125_clk = { + .pclk = &gmii_txclk125_pad, + .en_reg =RAS_CLK_ENB , + .en_reg_bit =C125_CLK_ENB , + .recalc = &follow_parent, +}; + +/* 30 MHz clock generated by USB PHy Pll */ +static struct clk ras_30Mhz_clk = { + .rate =30000000 , + .en_reg =RAS_CLK_ENB , + .en_reg_bit =C30_CLK_ENB , +}; + +/* 48 MHz clock generated by USB PHy Pll */ +static struct clk ras_48Mhz_clk = { + .pclk = &pll5_clk, + .en_reg =RAS_CLK_ENB , + .en_reg_bit =C48_CLK_ENB , + .recalc = &follow_parent, +}; + +/* osc3 generated clock */ +static struct clk ras_osc3_clk = { + .pclk = &ahb_clk, + .en_reg =RAS_CLK_ENB , + .en_reg_bit =OSC3_CLK_ENB , + .recalc = &follow_parent, +}; + +/* osc2 generated clock */ +static struct clk ras_osc2_clk = { + .pclk = &osc2_32k_clk, + .en_reg =RAS_CLK_ENB , + .en_reg_bit =OSC2_CLK_ENB , + .recalc = &follow_parent, +}; + +/* osc1 generated clock */ +static struct clk ras_osc1_clk = { + .pclk = &osc1_24m_clk, + .en_reg =RAS_CLK_ENB , + .en_reg_bit =OSC1_CLK_ENB , + .recalc = &follow_parent, +}; + +/* apb generated clock */ +static struct clk ras_pclk_clk = { + .pclk = &apb_clk, + .en_reg =RAS_CLK_ENB , + .en_reg_bit =PCLK_CLK_ENB , + .recalc = &follow_parent, +}; + +/* ahb generated clock */ +static struct clk ras_aclk_clk = { + .pclk = &ahb_clk, + .en_reg =RAS_CLK_ENB , + .en_reg_bit =ACLK_CLK_ENB , + .recalc = &follow_parent, +}; + +/* External pad 50 MHz clock for phy operation */ +static struct clk ras_tx50_clk = { + .flags =ALWAYS_ENABLED , + .rate =50000000 , +}; +/* spear1300 machine specific clock structures */ #ifdef CONFIG_MACH_SPEAR1300
@@ -859,10 +946,92 @@ static struct clk can1_clk = { .pclk = &apb_clk, .recalc = &follow_parent, }; + +/* gmac clocks :RAS part*/ +static struct clk gmac_ras1_clk = { + .flags =ALWAYS_ENABLED , + .pclk = &ras_aclk_clk, + .recalc = &follow_parent, +}; + +static struct clk gmac_ras2_clk = { + .flags =ALWAYS_ENABLED , + .pclk = &ras_aclk_clk, + .recalc = &follow_parent, +}; + +static struct clk gmac_ras3_clk = { + .flags =ALWAYS_ENABLED , + .pclk = &ras_aclk_clk, + .recalc = &follow_parent, +}; + +static struct clk gmac_ras4_clk = { + .flags =ALWAYS_ENABLED , + .pclk = &ras_aclk_clk, + .recalc = &follow_parent, +}; + +/* phy clock parent select */ +static struct pclk_info phy_pclk_info[] = { + { + .pclk = &ras_pll2_clk, + .pclk_val =0x8 , + }, { + .pclk = &ras_tx125_clk, + .pclk_val =0x4 , + }, { + .pclk = &ras_tx50_clk, + .pclk_val =0x0 , + }, +}; + +static struct pclk_sel phy_pclk_sel = { + .pclk_info = phy_pclk_info, + .pclk_count =ARRAY_SIZE (phy_pclk_info), + .pclk_sel_reg = (unsigned int *)(IO_ADDRESS (SPEAR1310_RAS_CTRL_REG1 )), + .pclk_sel_mask =SPEAR1310_PHY_CLK_MASK , +}; + +/* Phy 1 Clock */ +struct clk gmac_phy1_clk = { + .flags =ALWAYS_ENABLED , + .pclk_sel = &phy_pclk_sel, + .pclk_sel_shift =SPEAR1310_PHY_CLK_SHIFT , + .recalc = &follow_parent, +}; + +/* Phy 2 Clock */ +static struct clk gmac_phy2_clk = { + .flags =ALWAYS_ENABLED , + .pclk_sel = &phy_pclk_sel, + .pclk_sel_shift =SPEAR1310_PHY_CLK_SHIFT , + .recalc = &follow_parent, +}; + +/* Phy 3 Clock */ +static struct clk gmac_phy3_clk = { + .flags =ALWAYS_ENABLED , + .pclk_sel = &phy_pclk_sel, + .pclk_sel_shift =SPEAR1310_PHY_CLK_SHIFT , + .recalc = &follow_parent, +}; + +/* Phy 4 Clock */ +static struct clk gmac_phy4_clk = { + .flags =ALWAYS_ENABLED , + .pclk_sel = &phy_pclk_sel, + .pclk_sel_shift =SPEAR1310_PHY_CLK_SHIFT , + .recalc = &follow_parent, +}; +#endif +static struct clk dummy_apb_pclk; +/* array of all spear 13xx clock lookups */ static struct clk_lookup spear_clk_lookups[] = { + { .con_id ="apb_pclk" , .clk = &dummy_apb_pclk},/* root clks */ {.con_id ="osc1_24m_clk" , .clk = &osc1_24m_clk}, {.con_id ="osc2_32k_clk" , .clk = &osc2_32k_clk},
@@ -896,7 +1065,20 @@ static struct clk_lookup spear_clk_lookups[] = { {.con_id = "cfxd_synth_clk", .clk = &cfxd_synth_clk}, {.con_id = "gmac_phy_input_clk", .clk = &gmac_phy_input_clk}, {.con_id = "gmac_phy_synth_clk", .clk = &gmac_phy_synth_clk}, - {.con_id = "gmac_phy_clk", .clk = &gmac_phy_clk}, + {.dev_id = "stmmacphy.0", .clk = &gmac_phy0_clk}, + + /* RAS clocks */ + {.con_id = "ras_pll3_clk", .clk = &ras_pll3_clk}, + {.con_id = "ras_pll2_clk", .clk = &ras_pll2_clk}, + {.con_id = "ras_tx125_clk", .clk = &ras_tx125_clk}, + {.con_id = "ras_30Mhz_clk", .clk = &ras_30Mhz_clk}, + {.con_id = "ras_48Mhz_clk", .clk = &ras_48Mhz_clk}, + {.con_id = "ras_osc3_clk", .clk = &ras_osc3_clk}, + {.con_id = "ras_osc2_clk", .clk = &ras_osc2_clk}, + {.con_id = "ras_osc1_clk", .clk = &ras_osc1_clk}, + {.con_id = "ras_pclk_clk", .clk = &ras_pclk_clk}, + {.con_id = "ras_aclk_clk", .clk = &ras_aclk_clk}, + {.con_id = "ras_tx50_clk", .clk = &ras_tx50_clk}, /* clocks having multiple parent source from above clocks */ {.dev_id = "clcd", .clk = &clcd_clk},
@@ -910,12 +1092,12 @@ static struct clk_lookup spear_clk_lookups[] = { {.dev_id = "smi", .clk = &smi_clk}, {.con_id = "usbh.0_clk", .clk = &uhci0_clk}, {.con_id = "usbh.1_clk", .clk = &uhci1_clk}, - {.dev_id = "usbd", .clk = &usbd_clk}, + {.dev_id = "designware_udc", .clk = &usbd_clk}, {.dev_id = "i2c_designware.0", .clk = &i2c_clk}, {.dev_id = "dma0", .clk = &dma0_clk}, {.dev_id = "dma1", .clk = &dma1_clk}, {.dev_id = "jpeg", .clk = &jpeg_clk}, - {.dev_id = "gmac", .clk = &gmac_clk}, + {.dev_id = "stmmaceth.0", .clk = &gmac0_clk}, {.dev_id = "c3", .clk = &c3_clk}, {.dev_id = "pcie0", .clk = &pcie0_clk}, {.dev_id = "pcie1", .clk = &pcie1_clk},
@@ -944,6 +1126,14 @@ static struct clk_lookup spear_clk_lookups[] = { #ifdef CONFIG_MACH_SPEAR1310 {.dev_id = "c_can_platform.0", .clk = &can0_clk}, {.dev_id = "c_can_platform.1", .clk = &can1_clk}, + {.dev_id = "stmmaceth.1", .clk = &gmac_ras1_clk}, + {.dev_id = "stmmaceth.2", .clk = &gmac_ras2_clk}, + {.dev_id = "stmmaceth.3", .clk = &gmac_ras3_clk}, + {.dev_id = "stmmaceth.4", .clk = &gmac_ras4_clk}, + {.dev_id = "stmmacphy.1", .clk = &gmac_phy1_clk}, + {.dev_id = "stmmacphy.2", .clk = &gmac_phy2_clk}, + {.dev_id = "stmmacphy.3", .clk = &gmac_phy3_clk}, + {.dev_id = "stmmacphy.4", .clk = &gmac_phy4_clk}, #endif };
arch/arm/mach-spear13xx/include/mach/misc_regs.h +19 -0
@@ -191,6 +191,25 @@#define JPEG_SOF_RST 28#define PERIP2_SW_RST ((unsigned int *)(MISC_BASE + 0x280))#define RAS_CLK_ENB ((unsigned int *)(MISC_BASE + 0x284)) +/* RAS_CLK_ENB register masks */ +#define ACLK_CLK_ENB 0 +#define PCLK_CLK_ENB 1 +#define OSC1_CLK_ENB 2 +#define OSC2_CLK_ENB 3 +#define OSC3_CLK_ENB 4 +#define C48_CLK_ENB 5 +#define C30_CLK_ENB 6 +#define C125_CLK_ENB 7 +#define PLL2_CLK_ENB 8 +#define PLL3_CLK_ENB 9 +#define PCLK0_CLK_ENB 10 +#define PCLK1_CLK_ENB 11 +#define PCLK2_CLK_ENB 12 +#define PCLK3_CLK_ENB 13 +#define SYN0_CLK_ENB 14 +#define SYN1_CLK_ENB 15 +#define SYN2_CLK_ENB 16 +#define SYN3_CLK_ENB 17#define RAS_SW_RST ((unsigned int *)(MISC_BASE + 0x288))#define PLL1_SYNT ((unsigned int *)(MISC_BASE + 0x28c))#define I2S_CLK_CFG ((unsigned int *)(MISC_BASE + 0x290))
arch/arm/mach-spear3xx/clock.c +3 -3
@@ -713,7 +713,7 @@ static struct clk pwm_clk = {/* array of all spear 3xx clock lookups */ static struct clk_lookup spear_clk_lookups[] = { - { .con_id ="apb_pclk" , .clk = &dummy_apb_pclk}, + { .con_id ="apb_pclk" , .clk = &dummy_apb_pclk},/* root clks */ { .con_id ="osc_32k_clk" , .clk = &osc_32k_clk}, { .con_id ="osc_24m_clk" , .clk = &osc_24m_clk},
@@ -738,8 +738,8 @@ static struct clk_lookup spear_clk_lookups[] = { { .dev_id = "gpt1", .clk = &gpt1_clk}, { .dev_id = "gpt2", .clk = &gpt2_clk}, /* clock derived from pll3 clk */ + { .dev_id = "designware_udc", .clk = &usbd_clk}, { .con_id = "usbh_clk", .clk = &usbh_clk}, - { .dev_id = "usbd", .clk = &usbd_clk}, /* clock derived from ahb clk */ { .con_id = "ahbmult2_clk", .clk = &ahbmult2_clk}, { .con_id = "ddr_clk", .clk = &ddr_clk},
@@ -755,7 +755,7 @@ static struct clk_lookup spear_clk_lookups[] = { { .dev_id = "ssp-pl022.0", .clk = &ssp0_clk}, { .dev_id = "gpio", .clk = &gpio_clk}, #if defined(CONFIG_MACH_SPEAR310) || defined(CONFIG_MACH_SPEAR320) - { .dev_id = "physmap-flash", .clk = &emi_clk}, + { .con_id = "emi", .clk = &emi_clk}, #endif #if defined(CONFIG_MACH_SPEAR300) || defined(CONFIG_MACH_SPEAR310) || \ defined(CONFIG_MACH_SPEAR320)
arch/arm/mach-spear6xx/clock.c +2 -2
@@ -685,7 +685,7 @@ static struct clk dummy_apb_pclk;/* array of all spear 6xx clock lookups */ static struct clk_lookup spear_clk_lookups[] = { - { .con_id ="apb_pclk" , .clk = &dummy_apb_pclk}, + { .con_id ="apb_pclk" , .clk = &dummy_apb_pclk},/* root clks */ { .con_id ="osc_32k_clk" , .clk = &osc_32k_clk}, { .con_id ="osc_30m_clk" , .clk = &osc_30m_clk},
@@ -714,9 +714,9 @@ static struct clk_lookup spear_clk_lookups[] = { { .dev_id = "gpt2", .clk = &gpt2_clk}, { .dev_id = "gpt3", .clk = &gpt3_clk}, /* clock derived from pll3 clk */ + { .dev_id = "designware_udc", .clk = &usbd_clk}, { .con_id = "usbh.0_clk", .clk = &usbh0_clk}, { .con_id = "usbh.1_clk", .clk = &usbh1_clk}, - { .dev_id = "usbd", .clk = &usbd_clk}, /* clock derived from ahb clk */ { .con_id = "ahbmult2_clk", .clk = &ahbmult2_clk}, { .con_id = "ddr_clk", .clk = &ddr_clk},
Signature · 1 line
1.7.2.2
PATCH v4 45/62 SPEAr : Pad multiplexing handling modified
In reply to Viresh KumarFrom: Vipin Kumar <[email protected]>
Until now, the platform code assumed 1 32 bit register to be used for pad multiplexing. This assumption is not true for SPEAr13xx devices, so the generic implementation of pad multiplexing adopts a new concepts of multiple multiplexing registers.
--- arch/arm/mach-spear3xx/include/mach/generic.h | 3 + arch/arm/mach-spear3xx/spear300.c | 314 ++++++++++++++---- arch/arm/mach-spear3xx/spear310.c | 118 +++++-- arch/arm/mach-spear3xx/spear320.c | 387 +++++++++++++++++----- arch/arm/mach-spear3xx/spear3xx.c | 451 ++++++++++++++++++++----- arch/arm/plat-spear/include/plat/padmux.h | 28 ++- arch/arm/plat-spear/padmux.c | 28 +- 7 files changed, 1040 insertions(+), 289 deletions(-)
arch/arm/mach-spear3xx/include/mach/generic.h +3 -0
@@ -147,6 +147,7 @@ extern struct pmx_dev pmx_telecom_boot_pins;extern struct pmx_dev pmx_telecom_sdhci_4bit;extern struct pmx_dev pmx_telecom_sdhci_8bit;extern struct pmx_dev pmx_gpio1; +#define PAD_MUX_CONFIG_REG 0x00/* Add spear300 machine function declarations here */ void __init spear300_init (void );
@@ -178,6 +179,7 @@ extern struct pmx_dev pmx_uart3_4_5;extern struct pmx_dev pmx_fsmc;extern struct pmx_dev pmx_rs485_0_1;extern struct pmx_dev pmx_tdm0; +#define PAD_MUX_CONFIG_REG 0x08/* Add spear310 machine function declarations here */ void __init spear310_init (void );
@@ -227,6 +229,7 @@ extern struct pmx_dev pmx_mii1;extern struct pmx_dev pmx_smii0;extern struct pmx_dev pmx_smii1;extern struct pmx_dev pmx_i2c1; +#define PAD_MUX_CONFIG_REG 0x0C/* Add spear320 machine function declarations here */ void __init spear320_init (void );
arch/arm/mach-spear3xx/spear300.c +245 -69
570 lines not on this page · raw message
arch/arm/mach-spear3xx/spear310.c +89 -29
207 lines not on this page · raw message
arch/arm/mach-spear3xx/spear320.c +309 -78
651 lines not on this page · raw message
arch/arm/mach-spear3xx/spear3xx.c +361 -90
757 lines not on this page · raw message
arch/arm/plat-spear/include/plat/padmux.h +20 -8
@@ -28,26 +28,42 @@ struct pmx_reg { };/* +* struct pmx_mux_reg: configuration structure every group of modes of a device +* +* offset: multiplexing register offset +* mask: mask for supported mode +* value: value to be written +*/ +struct pmx_mux_reg { +u32 offset; +u32 mask; +u32 value; +}; + +/* * struct pmx_dev_mode: configuration structure every group of modes of a device * * ids: all modes for this configuration -* mask: mask for supported mode +* mux_regs: array of mux registers, masks and values to enable the device in +* this group of modes +* mux_reg_cnt: count of mux_regs elements */ struct pmx_dev_mode {u32 ids; -u32 mask; +struct pmx_mux_reg *mux_regs; +u8 mux_reg_cnt; };/* * struct pmx_mode: mode definition structure * * name: mode name -* mask: mode mask +* value: mode value */ struct pmx_mode {char *name;u32 id; -u32 mask; +u32 value; };/*
@@ -57,14 +73,12 @@ struct pmx_mode {* modes: device configuration array for different modes supported * mode_count: size of modes array * is_active: is peripheral active/enabled -* enb_on_reset: if 1, mask bits to be cleared in reg otherwise to be set in reg */ struct pmx_dev {char *name;struct pmx_dev_mode *modes;u8 mode_count;bool is_active; -bool enb_on_reset; };/*
@@ -75,7 +89,6 @@ struct pmx_dev {* devs_count: ARRAY_SIZE of devs * base: base address of soc config registers * mode_reg: structure of mode config register -* mux_reg: structure of device mux config register */ struct pmx_driver {struct pmx_mode *mode;
@@ -83,7 +96,6 @@ struct pmx_driver {u8 devs_count;u32 *base;struct pmx_reg mode_reg; -struct pmx_reg mux_reg; };/* pmx functions */
arch/arm/plat-spear/padmux.c +13 -15
@@ -21,13 +21,11 @@* * base: base address of configuration registers * mode_reg: mode configurations -* mux_reg: muxing configurations * active_mode: pointer to current active mode */ struct pmx {u32 base;struct pmx_reg mode_reg; -struct pmx_reg mux_reg;struct pmx_mode *active_mode; };
@@ -51,7 +49,7 @@ static int pmx_mode_set(struct pmx_mode *mode) val =readl (pmx->base + pmx->mode_reg.offset); val &= ~pmx->mode_reg.mask; - val |= mode->mask & pmx->mode_reg.mask; + val |= mode->value & pmx->mode_reg.mask;writel (val, pmx->base + pmx->mode_reg.offset);return 0 ;
@@ -66,19 +64,18 @@ static int pmx_mode_set(struct pmx_mode *mode)* If peripheral is not supported by current mode then request is rejected. * Conflicts between peripherals are not handled and peripherals will be * enabled in the order they are present in pmx_dev array. -* In case of conflicts last peripheral enabled will be present. +* In case of conflicts last peripheral enabled will remain present. * Returns -ve on Err otherwise 0 */ static int pmx_devs_enable (struct pmx_dev **devs,u8 count) { -u32 val, i, mask; +u32 val, i;if (!count)return -EINVAL ; - val =readl (pmx->base + pmx->mux_reg.offset);for (i =0 ; i < count; i++) { -u8 j =0 ; +u8 k, j =0 ;if (!devs[i]->name || !devs[i]->modes) {printk (KERN_ERR "padmux: dev name or modes is null\n" );
@@ -103,15 +100,18 @@ static int pmx_devs_enable(struct pmx_dev **devs, u8 count) }/* enable peripheral */ - mask = devs[i]->modes[j].mask & pmx->mux_reg.mask; -if (devs[i]->enb_on_reset) - val &= ~mask; -else - val |= mask; +for (k =0 ; k < devs[i]->modes[j].mux_reg_cnt; k++) { +struct pmx_mux_reg *mux_reg = + &devs[i]->modes[j].mux_regs[k]; + + val =readl (pmx->base + mux_reg->offset); + val &= ~mux_reg->mask; + val |= mux_reg->value & mux_reg->mask; +writel (val, pmx->base + mux_reg->offset); + } devs[i]->is_active = true; } -writel (val, pmx->base + pmx->mux_reg.offset);kfree (pmx);/* this will ensure that multiplexing can't be changed now */
@@ -144,8 +144,6 @@ int pmx_register(struct pmx_driver *driver) pmx->base = (u32 )driver->base; pmx->mode_reg.offset = driver->mode_reg.offset; pmx->mode_reg.mask = driver->mode_reg.mask; - pmx->mux_reg.offset = driver->mux_reg.offset; - pmx->mux_reg.mask = driver->mux_reg.mask;/* choose mode to enable */ if (driver->mode) {
Signature · 1 line
1.7.2.2
PATCH v4 46/62 SPEAr13xx : Fixed part devices in SPEAr13xx addded to the generic implementation
In reply to Viresh KumarFrom: Vipin Kumar <[email protected]>
--- arch/arm/mach-spear13xx/include/mach/generic.h | 164 ++++++++ arch/arm/mach-spear13xx/include/mach/spear.h | 3 + arch/arm/mach-spear13xx/spear1300.c | 15 + arch/arm/mach-spear13xx/spear1300_evb.c | 25 ++ arch/arm/mach-spear13xx/spear1310.c | 15 + arch/arm/mach-spear13xx/spear1310_evb.c | 25 ++ arch/arm/mach-spear13xx/spear13xx.c | 528 ++++++++++++++++++++++++ arch/arm/plat-spear/Makefile | 1 + 8 files changed, 776 insertions(+), 0 deletions(-)
arch/arm/mach-spear13xx/include/mach/generic.h +164 -0
@@ -19,6 +19,168 @@#include <linux/amba/bus.h> #include <asm/mach/time.h> #include <asm/mach/map.h> +#include <plat/padmux.h> + +/* +* Function enable (Pad multiplexing register) offsets +*/ +#define PAD_MUX_CONFIG_REG_0 0x0 +#define PAD_MUX_CONFIG_REG_1 0x4 +#define PAD_MUX_CONFIG_REG_2 0x8 +#define PAD_MUX_CONFIG_REG_3 0xC + +/* pad mux declarations */ +#define PMX_I2S1_MASK (1 << 3) +#define PMX_I2S2_MASK (1 << 16)/* Offset 4 */ +#define PMX_CLCD1_MASK (1 << 5) +#define PMX_CLCD2_MASK (1 << 3)/* Offset 4 */ +#define PMX_EGPIO00_MASK (1 << 6) +#define PMX_EGPIO01_MASK (1 << 7) +#define PMX_EGPIO02_MASK (1 << 8) +#define PMX_EGPIO03_MASK (1 << 9) +#define PMX_EGPIO04_MASK (1 << 10) +#define PMX_EGPIO05_MASK (1 << 11) +#define PMX_EGPIO06_MASK (1 << 12) +#define PMX_EGPIO07_MASK (1 << 13) +#define PMX_EGPIO08_MASK (1 << 14) +#define PMX_EGPIO09_MASK (1 << 15) +#define PMX_EGPIO10_MASK (1 << 5)/* Offset 4 */ +#define PMX_EGPIO11_MASK (1 << 6)/* Offset 4 */ +#define PMX_EGPIO12_MASK (1 << 7)/* Offset 4 */ +#define PMX_EGPIO13_MASK (1 << 8)/* Offset 4 */ +#define PMX_EGPIO14_MASK (1 << 9)/* Offset 4 */ +#define PMX_EGPIO15_MASK (1 << 10)/* Offset 4 */ +#define PMX_EGPIO_0_GRP_MASK (PMX_EGPIO00_MASK | PMX_EGPIO01_MASK | \ + PMX_EGPIO02_MASK | PMX_EGPIO03_MASK | PMX_EGPIO04_MASK | \ + PMX_EGPIO05_MASK | PMX_EGPIO06_MASK | PMX_EGPIO07_MASK | \ + PMX_EGPIO08_MASK | PMX_EGPIO09_MASK) +#define PMX_EGPIO_1_GRP_MASK (PMX_EGPIO10_MASK | PMX_EGPIO11_MASK | \ + PMX_EGPIO12_MASK | PMX_EGPIO13_MASK | PMX_EGPIO14_MASK | \ + PMX_EGPIO15_MASK) + +#define PMX_SMI_MASK (1 << 16) +#define PMX_SMINCS2_MASK (1 << 1)/* Offset 4 */ +#define PMX_SMINCS3_MASK (1 << 2)/* Offset 4 */ + +#define PMX_GMIICLK_MASK (1 << 18) +#define PMX_GMIICOL_CRS_XFERER_MIITXCLK_MASK (1 << 19) +#define PMX_RXCLK_RDV_TXEN_D03_MASK (1 << 20) +#define PMX_GMIID47_MASK (1 << 21) +#define PMX_MDC_MDIO_MASK (1 << 22) + +#define PMX_GMII_MASK (PMX_GMIICLK_MASK | \ + PMX_GMIICOL_CRS_XFERER_MIITXCLK_MASK | \ + PMX_RXCLK_RDV_TXEN_D03_MASK | PMX_GMIID47_MASK | \ + PMX_MDC_MDIO_MASK) + +#define PMX_NAND8_MASK (1 << 17) +#define PMX_NFAD023_MASK (1 << 24) +#define PMX_NFAD24_MASK (1 << 25) +#define PMX_NFAD25_MASK (1 << 26) +#define PMX_NFWPRT1_MASK (1 << 24)/* Offset 4 */ +#define PMX_NFWPRT2_MASK (1 << 26)/* Offset 4 */ +#define PMX_NFWPRT3_MASK (1 << 28) +#define PMX_NFRSTPWDWN0_MASK (1 << 29) +#define PMX_NFRSTPWDWN1_MASK (1 << 30) +#define PMX_NFRSTPWDWN2_MASK (1 << 31) +#define PMX_NFRSTPWDWN3_MASK (1 << 0)/* Offset 4 */ +#define PMX_NFCE1_MASK (1 << 20)/* Offset 4 */ +#define PMX_NFCE2_MASK (1 << 22)/* Offset 4 */ +#define PMX_NFCE3_MASK (1 << 27) +#define PMX_NFIO815_MASK (1 << 18)/* Offset 4 */ + +#define PMX_NAND8BIT_0_MASK (PMX_NAND8_MASK | PMX_NFAD023_MASK | \ + PMX_NFAD24_MASK | PMX_NFAD25_MASK | PMX_NFWPRT3_MASK | \ + PMX_NFRSTPWDWN0_MASK | PMX_NFRSTPWDWN1_MASK | \ + PMX_NFRSTPWDWN2_MASK | PMX_NFCE3_MASK) +#define PMX_NAND8BIT_1_MASK (PMX_NFRSTPWDWN3_MASK) + +#define PMX_NAND8BIT4DEV_0_MASK (PMX_NAND8BIT_0_MASK) +#define PMX_NAND8BIT4DEV_1_MASK (PMX_NAND8BIT_1_MASK | PMX_NFCE1_MASK | \ + PMX_NFCE2_MASK | PMX_NFWPRT1_MASK | PMX_NFWPRT2_MASK) + +#define PMX_NAND16BIT_0_MASK (PMX_NAND8BIT_0_MASK) +#define PMX_NAND16BIT_1_MASK (PMX_NAND8BIT_1_MASK | PMX_NFIO815_MASK) +#define PMX_NAND16BIT4DEV_0_MASK (PMX_NAND8BIT4DEV_0_MASK) +#define PMX_NAND16BIT4DEV_1_MASK (PMX_NAND8BIT4DEV_1_MASK | \ + PMX_NFIO815_MASK) + +#define PMX_KBD_ROW0_MASK (1 << 25)/* Offset 4 */ +#define PMX_KBD_ROW1_MASK (1 << 23)/* Offset 4 */ +#define PMX_KBD_ROWCOL25_MASK (1 << 17)/* Offset 4 */ +#define PMX_KBD_ROWCOL68_MASK (1 << 4)/* Offset 4 */ +#define PMX_KBD_COL0_MASK (1 << 21)/* Offset 4 */ +#define PMX_KBD_COL1_MASK (1 << 19)/* Offset 4 */ +#define PMX_KEYBOARD_MASK (PMX_KBD_ROW0_MASK | PMX_KBD_ROW1_MASK | \ + PMX_KBD_ROWCOL25_MASK | PMX_KBD_ROWCOL68_MASK | \ + PMX_KBD_COL0_MASK | PMX_KBD_COL1_MASK) + +#define PMX_UART0_MASK (1 << 1) +#define PMX_I2C_MASK (1 << 2) +#define PMX_SSP_MASK (1 << 4) +#define PMX_UART0_MODEM_MASK (1 << 11)/* Offset 4 */ +#define PMX_GPT0_TMR1_MASK (1 << 12)/* Offset 4 */ +#define PMX_GPT0_TMR2_MASK (1 << 13)/* Offset 4 */ +#define PMX_GPT1_TMR1_MASK (1 << 14)/* Offset 4 */ +#define PMX_GPT1_TMR2_MASK (1 << 15)/* Offset 4 */ + +#define PMX_MCIDATA0_MASK (1 << 27)/* Offset 4 */ +#define PMX_MCIDATA1_MASK (1 << 28)/* Offset 4 */ +#define PMX_MCIDATA2_MASK (1 << 29)/* Offset 4 */ +#define PMX_MCIDATA3_MASK (1 << 30)/* Offset 4 */ +#define PMX_MCIDATA4_MASK (1 << 31)/* Offset 4 */ +#define PMX_MCIDATA5_MASK (1 << 0)/* Offset 8 */ +#define PMX_MCIDATA6_MASK (1 << 1)/* Offset 8 */ +#define PMX_MCIDATA7_MASK (1 << 2)/* Offset 8 */ +#define PMX_MCIDATA1SD_MASK (1 << 3)/* Offset 8 */ +#define PMX_MCIDATA2SD_MASK (1 << 4)/* Offset 8 */ +#define PMX_MCIDATA3SD_MASK (1 << 5)/* Offset 8 */ +#define PMX_MCIADDR0ALE_MASK (1 << 6)/* Offset 8 */ +#define PMX_MCIADDR1CLECLK_MASK (1 << 7)/* Offset 8 */ +#define PMX_MCIADDR2_MASK (1 << 8)/* Offset 8 */ +#define PMX_MCICECF_MASK (1 << 9)/* Offset 8 */ +#define PMX_MCICEXD_MASK (1 << 10)/* Offset 8 */ +#define PMX_MCICESDMMC_MASK (1 << 11)/* Offset 8 */ +#define PMX_MCICDCF1_MASK (1 << 12)/* Offset 8 */ +#define PMX_MCICDCF2_MASK (1 << 13)/* Offset 8 */ +#define PMX_MCICDXD_MASK (1 << 14)/* Offset 8 */ +#define PMX_MCICDSDMMC_MASK (1 << 15)/* Offset 8 */ +#define PMX_MCIDATADIR_MASK (1 << 16)/* Offset 8 */ +#define PMX_MCIDMARQWP_MASK (1 << 17)/* Offset 8 */ +#define PMX_MCIIORDRE_MASK (1 << 18)/* Offset 8 */ +#define PMX_MCIIOWRWE_MASK (1 << 19)/* Offset 8 */ +#define PMX_MCIRESETCF_MASK (1 << 20)/* Offset 8 */ +#define PMX_MCICS0CE_MASK (1 << 21)/* Offset 8 */ +#define PMX_MCICFINTR_MASK (1 << 22)/* Offset 8 */ +#define PMX_MCIIORDY_MASK (1 << 23)/* Offset 8 */ +#define PMX_MCICS1_MASK (1 << 24)/* Offset 8 */ +#define PMX_MCIDMAACK_MASK (1 << 25)/* Offset 8 */ +#define PMX_MCISDCMD_MASK (1 << 26)/* Offset 8 */ +#define PMX_MCILEDS_MASK (1 << 27)/* Offset 8 */ + +#define PMX_MCIFALL_1_MASK (0xF8000000) +#define PMX_MCIFALL_2_MASK (0x0FFFFFFF) + +/* pad mux devices */ +extern struct pmx_dev pmx_i2c; +extern struct pmx_dev pmx_ssp; +extern struct pmx_dev pmx_i2s2; +extern struct pmx_dev pmx_clcd1; +extern struct pmx_dev pmx_clcd2; +extern struct pmx_dev pmx_egpio_grp; +extern struct pmx_dev pmx_smi_2_chips; +extern struct pmx_dev pmx_smi_4_chips; +extern struct pmx_dev pmx_gmii; +extern struct pmx_dev pmx_nand_8bit; +extern struct pmx_dev pmx_nand_16bit; +extern struct pmx_dev pmx_keyboard; +extern struct pmx_dev pmx_uart0; +extern struct pmx_dev pmx_uart0_modem; +extern struct pmx_dev pmx_gpt_0_1; +extern struct pmx_dev pmx_gpt_0_2; +extern struct pmx_dev pmx_gpt_1_1; +extern struct pmx_dev pmx_gpt_1_2; +extern struct pmx_dev pmx_mcif;/* * Each GPT has 2 timer channels
@@ -28,6 +190,8 @@#define SPEAR_GPT0_CHAN0_IRQ IRQ_GPT0_TMR0#define SPEAR_GPT0_CHAN1_IRQ IRQ_GPT0_TMR1 +extern struct pmx_driver pmx_driver; +/* Add spear13xx family device structure declarations here */ extern struct amba_device spear13xx_gpio_device[];extern struct amba_device spear13xx_ssp_device;
arch/arm/mach-spear13xx/include/mach/spear.h +3 -0
@@ -88,6 +88,9 @@#define SPEAR13XX_MCIF_CF_BASE UL(0xB2800000)#define SPEAR13XX_MCIF_SDHCI_BASE UL(0xB3000000) +/* Pad multiplexing base */ +#define SPEAR13XX_FUNC_ENB_BASE UL(0xE0700650) +/* Debug uart for linux, will be used for debug and uncompress messages */ #define SPEAR_DBG_UART_BASE SPEAR13XX_UART_BASE#define VA_SPEAR_DBG_UART_BASE VA_SPEAR13XX_UART_BASE
arch/arm/mach-spear13xx/spear1300.c +15 -0
@@ -14,10 +14,25 @@#include <mach/generic.h> #include <mach/spear.h> +/* pmx driver structure */ +struct pmx_driver pmx_driver; +/* Add spear1300 specific devices here */ void __init spear1300_init (void ) { +int ret; +/* call spear13xx family common init function */ spear13xx_init (); + +/* pmx initialization */ + pmx_driver.base =ioremap (SPEAR13XX_FUNC_ENB_BASE ,SZ_4K ); +if (pmx_driver.base) { + ret =pmx_register (&pmx_driver); +if (ret) +pr_err ("padmux: registeration failed. err no: %d\n" , + ret); +iounmap (pmx_driver.base); + } }
arch/arm/mach-spear13xx/spear1300_evb.c +25 -0
@@ -26,6 +26,26 @@#include <plat/fsmc.h> #include <plat/spi.h> +/* padmux devices to enable */ +static struct pmx_dev *pmx_devs[] = { +/* spear13xx specific devices */ + &pmx_i2c, + &pmx_i2s1, + &pmx_i2s2, + &pmx_clcd1, + &pmx_clcd2, + &pmx_egpio_grp, + &pmx_gmii, + &pmx_keyboard, + &pmx_mcif, + &pmx_nand_8bit, + &pmx_smi_4_chips, + &pmx_ssp, + &pmx_uart0, + +/* spear1300 specific devices */ +}; +static struct amba_device *amba_devs[]__initdata = { &spear13xx_gpio_device[0 ], &spear13xx_gpio_device[1 ],
@@ -88,6 +108,11 @@ static void __init spear1300_evb_init(void) {unsigned int i; +/* padmux initialization, must be done before spear1300_init */ + pmx_driver.mode =NULL ; + pmx_driver.devs = pmx_devs; + pmx_driver.devs_count =ARRAY_SIZE (pmx_devs); +/* set keyboard plat data */ kbd_set_plat_data (&spear13xx_kbd_device, &kbd_data);
arch/arm/mach-spear13xx/spear1310.c +15 -0
@@ -16,6 +16,9 @@#include <mach/generic.h> #include <mach/hardware.h> +/* pmx driver structure */ +struct pmx_driver pmx_driver; +/* Add spear1310 specific devices here */ /* CAN device registeration */
@@ -74,6 +77,18 @@ void __init spear1310_map_io(void)void __init spear1310_init (void ) { +int ret; +/* call spear13xx family common init function */ spear13xx_init (); + +/* pmx initialization */ + pmx_driver.base =ioremap (SPEAR13XX_FUNC_ENB_BASE ,SZ_4K ); +if (pmx_driver.base) { + ret =pmx_register (&pmx_driver); +if (ret) +pr_err ("padmux: registeration failed. err no: %d\n" , + ret); +iounmap (pmx_driver.base); + } }
arch/arm/mach-spear13xx/spear1310_evb.c +25 -0
@@ -26,6 +26,26 @@#include <mach/spear.h> #include <mach/pcie.h> +/* padmux devices to enable */ +static struct pmx_dev *pmx_devs[] = { +/* spear13xx specific devices */ + &pmx_i2c, + &pmx_i2s1, + &pmx_i2s2, + &pmx_clcd1, + &pmx_clcd2, + &pmx_egpio_grp, + &pmx_gmii, + &pmx_keyboard, + &pmx_mcif, + &pmx_nand_8bit, + &pmx_smi_4_chips, + &pmx_ssp, + &pmx_uart0, + +/* spear1310 specific devices */ +}; +static struct amba_device *amba_devs[]__initdata = {/* spear13xx specific devices */ &spear13xx_gpio_device[0 ],
@@ -94,6 +114,11 @@ static void __init spear1310_evb_init(void) {unsigned int i; +/* padmux initialization, must be done before spear1300_init */ + pmx_driver.mode =NULL ; + pmx_driver.devs = pmx_devs; + pmx_driver.devs_count =ARRAY_SIZE (pmx_devs); +/* set keyboard plat data */ kbd_set_plat_data (&spear13xx_kbd_device, &kbd_data);
arch/arm/mach-spear13xx/spear13xx.c +528 -0
531 lines not on this page · raw message
arch/arm/plat-spear/Makefile +1 -0
@@ -5,6 +5,7 @@ # Common support obj-y := clcd.o clock.o pll_clk.o time.o +obj-$(CONFIG_ARCH_SPEAR13XX) += padmux.o obj-$(CONFIG_ARCH_SPEAR3XX) += shirq.o padmux.o obj-$(CONFIG_CPU_FREQ) += cpufreq.o obj-$(CONFIG_MACH_SPEAR310) += plgpio.o
Signature · 1 line
1.7.2.2
PATCH v4 47/62 SPEAr : Updating pad multiplexing support
In reply to Viresh KumarFrom: Vipin Kumar <[email protected]>
This patch makes the following changes
-> Addition of SPEAr1310 pad multiplexing devices.
-> A few bugfixes eg. clcd1 and clcd2 removed and clcd/clcd_hires added -> Support for modifying multiple regiters in different address ranges
--- arch/arm/mach-spear13xx/include/mach/generic.h | 50 +++- arch/arm/mach-spear13xx/include/mach/spear.h | 3 - arch/arm/mach-spear13xx/spear1300.c | 11 +- arch/arm/mach-spear13xx/spear1300_evb.c | 5 +- arch/arm/mach-spear13xx/spear1310.c | 346 +++++++++++++++++++++++- arch/arm/mach-spear13xx/spear1310_evb.c | 17 +- arch/arm/mach-spear13xx/spear13xx.c | 169 +++++++----- arch/arm/mach-spear3xx/include/mach/generic.h | 12 +- arch/arm/mach-spear3xx/include/mach/spear300.h | 1 - arch/arm/mach-spear3xx/spear300.c | 67 ++--- arch/arm/mach-spear3xx/spear310.c | 20 +- arch/arm/mach-spear3xx/spear320.c | 61 ++--- arch/arm/mach-spear3xx/spear3xx.c | 60 ++-- arch/arm/plat-spear/include/plat/padmux.h | 10 +- arch/arm/plat-spear/padmux.c | 36 ++- 15 files changed, 626 insertions(+), 242 deletions(-)
arch/arm/mach-spear13xx/include/mach/generic.h +40 -10
@@ -24,10 +24,21 @@/* * Function enable (Pad multiplexing register) offsets */ -#define PAD_MUX_CONFIG_REG_0 0x0 -#define PAD_MUX_CONFIG_REG_1 0x4 -#define PAD_MUX_CONFIG_REG_2 0x8 -#define PAD_MUX_CONFIG_REG_3 0xC +/* Pad multiplexing base */ +#define SPEAR13XX_FUNC_ENB_BASE UL(0xE0700650) +#define SPEAR13XX_PCM_CFG_BASE UL(0xE0700100) + +#define PAD_MUX_CONFIG_REG_0 UL(0xE0700650) +#define PAD_MUX_CONFIG_REG_1 UL(0xE0700654) +#define PAD_MUX_CONFIG_REG_2 UL(0xE0700658) +#define PAD_MUX_CONFIG_REG_3 UL(0xE070065C) + +#if defined(CONFIG_MACH_SPEAR1310 ) +#define SPEAR1310_FUNC_CNTL_0 UL(0x6C800000) + +#define PMX_SMII_MASK (1 << 24)/* Func cntl reg0 */ +#define PMX_EGPIO7_MASK (1 << 2)/* Pcm cfg reg */ +#endif /* pad mux declarations */ #define PMX_I2S1_MASK (1 << 3)
@@ -111,9 +122,8 @@#define PMX_KBD_ROWCOL68_MASK (1 << 4)/* Offset 4 */ #define PMX_KBD_COL0_MASK (1 << 21)/* Offset 4 */ #define PMX_KBD_COL1_MASK (1 << 19)/* Offset 4 */ -#define PMX_KEYBOARD_MASK (PMX_KBD_ROW0_MASK | PMX_KBD_ROW1_MASK | \ - PMX_KBD_ROWCOL25_MASK | PMX_KBD_ROWCOL68_MASK | \ - PMX_KBD_COL0_MASK | PMX_KBD_COL1_MASK) +#define PMX_KEYBOARD_6X6_MASK (PMX_KBD_ROW0_MASK | PMX_KBD_ROW1_MASK | \ + PMX_KBD_ROWCOL25_MASK | PMX_KBD_COL0_MASK | PMX_KBD_COL1_MASK)#define PMX_UART0_MASK (1 << 1)#define PMX_I2C_MASK (1 << 2)
@@ -164,16 +174,18 @@/* pad mux devices */ extern struct pmx_dev pmx_i2c;extern struct pmx_dev pmx_ssp; +extern struct pmx_dev pmx_i2s1;extern struct pmx_dev pmx_i2s2; -extern struct pmx_dev pmx_clcd1; -extern struct pmx_dev pmx_clcd2; +extern struct pmx_dev pmx_clcd; +extern struct pmx_dev pmx_clcd_hires;extern struct pmx_dev pmx_egpio_grp;extern struct pmx_dev pmx_smi_2_chips;extern struct pmx_dev pmx_smi_4_chips;extern struct pmx_dev pmx_gmii;extern struct pmx_dev pmx_nand_8bit;extern struct pmx_dev pmx_nand_16bit; -extern struct pmx_dev pmx_keyboard; +extern struct pmx_dev pmx_keyboard_6x6; +extern struct pmx_dev pmx_keyboard_9x9;extern struct pmx_dev pmx_uart0;extern struct pmx_dev pmx_uart0_modem;extern struct pmx_dev pmx_gpt_0_1;
@@ -182,6 +194,24 @@ extern struct pmx_dev pmx_gpt_1_1;extern struct pmx_dev pmx_gpt_1_2;extern struct pmx_dev pmx_mcif; +#if defined(CONFIG_MACH_SPEAR1310 ) +extern struct pmx_dev pmx_uart1_modem; +extern struct pmx_dev pmx_uart_1; +extern struct pmx_dev pmx_uart_2; +extern struct pmx_dev pmx_uart_3_4_5; +extern struct pmx_dev pmx_rs485_hdlc_1_2; +extern struct pmx_dev pmx_tdm_hdlc_1_2; +extern struct pmx_dev pmx_nand32bit; +extern struct pmx_dev pmx_fsmc16bit_4_chips; +extern struct pmx_dev pmx_fsmc32bit_4_chips; +extern struct pmx_dev pmx_gmii1; +extern struct pmx_dev pmx_rgmii; +extern struct pmx_dev pmx_i2c1; +extern struct pmx_dev pmx_smii_0_1_2; +extern struct pmx_dev pmx_can; +extern struct pmx_dev pmx_uart1_modem; +#endif +/* * Each GPT has 2 timer channels * Following GPT channels will be used as clock source and clockevent
arch/arm/mach-spear13xx/include/mach/spear.h +0 -3
@@ -88,9 +88,6 @@#define SPEAR13XX_MCIF_CF_BASE UL(0xB2800000)#define SPEAR13XX_MCIF_SDHCI_BASE UL(0xB3000000) -/* Pad multiplexing base */ -#define SPEAR13XX_FUNC_ENB_BASE UL(0xE0700650) -/* Debug uart for linux, will be used for debug and uncompress messages */ #define SPEAR_DBG_UART_BASE SPEAR13XX_UART_BASE#define VA_SPEAR_DBG_UART_BASE VA_SPEAR13XX_UART_BASE
arch/arm/mach-spear13xx/spear1300.c +3 -8
@@ -27,12 +27,7 @@ void __init spear1300_init(void)spear13xx_init ();/* pmx initialization */ - pmx_driver.base =ioremap (SPEAR13XX_FUNC_ENB_BASE ,SZ_4K ); -if (pmx_driver.base) { - ret =pmx_register (&pmx_driver); -if (ret) -pr_err ("padmux: registeration failed. err no: %d\n" , - ret); -iounmap (pmx_driver.base); - } + ret =pmx_register (&pmx_driver); +if (ret) +pr_err ("padmux: registeration failed. err no: %d\n" , ret); }
arch/arm/mach-spear13xx/spear1300_evb.c +2 -3
@@ -32,11 +32,10 @@ static struct pmx_dev *pmx_devs[] = { &pmx_i2c, &pmx_i2s1, &pmx_i2s2, - &pmx_clcd1, - &pmx_clcd2, + &pmx_clcd, &pmx_egpio_grp, &pmx_gmii, - &pmx_keyboard, + &pmx_keyboard_6x6, &pmx_mcif, &pmx_nand_8bit, &pmx_smi_4_chips,
arch/arm/mach-spear13xx/spear1310.c +338 -8
356 lines not on this page · raw message
arch/arm/mach-spear13xx/spear1310_evb.c +11 -6
@@ -31,19 +31,24 @@ static struct pmx_dev *pmx_devs[] = {/* spear13xx specific devices */ &pmx_i2c, &pmx_i2s1, - &pmx_i2s2, - &pmx_clcd1, - &pmx_clcd2, &pmx_egpio_grp, &pmx_gmii, - &pmx_keyboard, + &pmx_keyboard_6x6, &pmx_mcif, &pmx_nand_8bit, - &pmx_smi_4_chips, - &pmx_ssp, + &pmx_smi_2_chips, &pmx_uart0,/* spear1310 specific devices */ + &pmx_can, + &pmx_i2c1, + &pmx_smii_0_1_2, + &pmx_fsmc16bit_4_chips, + &pmx_rs485_hdlc_1_2, + &pmx_tdm_hdlc_1_2, + &pmx_uart_1, + &pmx_uart_2, + &pmx_uart_3_4_5, }; static struct amba_device *amba_devs[] __initdata = {
arch/arm/mach-spear13xx/spear13xx.c +100 -69
353 lines not on this page · raw message
arch/arm/mach-spear3xx/include/mach/generic.h +9 -3
@@ -147,7 +147,10 @@ extern struct pmx_dev pmx_telecom_boot_pins;extern struct pmx_dev pmx_telecom_sdhci_4bit;extern struct pmx_dev pmx_telecom_sdhci_8bit;extern struct pmx_dev pmx_gpio1; -#define PAD_MUX_CONFIG_REG 0x00 + +/* pad multiplexing support */ +#define PAD_MUX_CONFIG_REG 0x99000000 +#define MODE_CONFIG_REG 0x99000004/* Add spear300 machine function declarations here */ void __init spear300_init (void );
@@ -179,7 +182,7 @@ extern struct pmx_dev pmx_uart3_4_5;extern struct pmx_dev pmx_fsmc;extern struct pmx_dev pmx_rs485_0_1;extern struct pmx_dev pmx_tdm0; -#define PAD_MUX_CONFIG_REG 0x08 +#define PAD_MUX_CONFIG_REG 0xB4000008/* Add spear310 machine function declarations here */ void __init spear310_init (void );
@@ -229,7 +232,10 @@ extern struct pmx_dev pmx_mii1;extern struct pmx_dev pmx_smii0;extern struct pmx_dev pmx_smii1;extern struct pmx_dev pmx_i2c1; -#define PAD_MUX_CONFIG_REG 0x0C + +/* pad multiplexing support */ +#define PAD_MUX_CONFIG_REG 0xB300000C +#define MODE_CONFIG_REG 0xB3000010/* Add spear320 machine function declarations here */ void __init spear320_init (void );
arch/arm/mach-spear3xx/include/mach/spear300.h +0 -1
@@ -45,7 +45,6 @@#define SPEAR300_NOR_2_BASE UL(0x92000000)#define SPEAR300_NOR_3_BASE UL(0x93000000)#define SPEAR300_FSMC_BASE UL(0x94000000) -#define SPEAR300_SOC_CONFIG_BASE UL(0x99000000)#define SPEAR300_KEYBOARD_BASE UL(0xA0000000)#define SPEAR300_GPIO_BASE UL(0xA9000000)
arch/arm/mach-spear3xx/spear300.c +30 -37
217 lines not on this page · raw message
arch/arm/mach-spear3xx/spear310.c +9 -11
@@ -26,7 +26,7 @@/* Pad multiplexing for emi_cs_0_1_4_5 devices */ static struct pmx_mux_reg pmx_emi_cs_0_1_4_5_mux[] = { { - .offset =PAD_MUX_CONFIG_REG , + .address =PAD_MUX_CONFIG_REG , .mask =PMX_TIMER_3_4_MASK , .value =0 , },
@@ -48,7 +48,7 @@ struct pmx_dev pmx_emi_cs_0_1_4_5 = {/* Pad multiplexing for emi_cs_2_3 devices */ static struct pmx_mux_reg pmx_emi_cs_2_3_mux[] = { { - .offset =PAD_MUX_CONFIG_REG , + .address =PAD_MUX_CONFIG_REG , .mask =PMX_TIMER_1_2_MASK , .value =0 , },
@@ -70,7 +70,7 @@ struct pmx_dev pmx_emi_cs_2_3 = {/* Pad multiplexing for uart1 device */ static struct pmx_mux_reg pmx_uart1_mux[] = { { - .offset =PAD_MUX_CONFIG_REG , + .address =PAD_MUX_CONFIG_REG , .mask =PMX_FIRDA_MASK , .value =0 , },
@@ -92,7 +92,7 @@ struct pmx_dev pmx_uart1 = {/* Pad multiplexing for uart2 device */ static struct pmx_mux_reg pmx_uart2_mux[] = { { - .offset =PAD_MUX_CONFIG_REG , + .address =PAD_MUX_CONFIG_REG , .mask =PMX_TIMER_1_2_MASK , .value =0 , },
@@ -114,7 +114,7 @@ struct pmx_dev pmx_uart2 = {/* Pad multiplexing for uart3_4_5 devices */ static struct pmx_mux_reg pmx_uart3_4_5_mux[] = { { - .offset =PAD_MUX_CONFIG_REG , + .address =PAD_MUX_CONFIG_REG , .mask =PMX_UART0_MODEM_MASK , .value =0 , },
@@ -136,7 +136,7 @@ struct pmx_dev pmx_uart3_4_5 = {/* Pad multiplexing for fsmc device */ static struct pmx_mux_reg pmx_fsmc_mux[] = { { - .offset =PAD_MUX_CONFIG_REG , + .address =PAD_MUX_CONFIG_REG , .mask =PMX_SSP_CS_MASK , .value =0 , },
@@ -158,7 +158,7 @@ struct pmx_dev pmx_fsmc = {/* Pad multiplexing for rs485_0_1 devices */ static struct pmx_mux_reg pmx_rs485_0_1_mux[] = { { - .offset =PAD_MUX_CONFIG_REG , + .address =PAD_MUX_CONFIG_REG , .mask =PMX_MII_MASK , .value =0 , },
@@ -180,7 +180,7 @@ struct pmx_dev pmx_rs485_0_1 = {/* Pad multiplexing for tdm0 device */ static struct pmx_mux_reg pmx_tdm0_mux[] = { { - .offset =PAD_MUX_CONFIG_REG , + .address =PAD_MUX_CONFIG_REG , .mask =PMX_MII_MASK , .value =0 , },
@@ -524,9 +524,7 @@ void __init spear310_init(void) }/* pmx initialization */ - pmx_driver.base = base; ret =pmx_register (&pmx_driver);if (ret) -printk (KERN_ERR "padmux: registeration failed. err no: %d\n" , - ret); +pr_err ("padmux: registeration failed. err no: %d\n" , ret); }
arch/arm/mach-spear3xx/spear320.c +28 -33
235 lines not on this page · raw message
arch/arm/mach-spear3xx/spear3xx.c +30 -30
240 lines not on this page · raw message
arch/arm/plat-spear/include/plat/padmux.h +4 -6
@@ -19,23 +19,23 @@/* * struct pmx_reg: configuration structure for mode reg and mux reg * -* offset: offset of mode reg +* address: physical address of mode reg * mask: mask of mode reg */ struct pmx_reg { -u32 offset; +u32 address;u32 mask; };/* * struct pmx_mux_reg: configuration structure every group of modes of a device * -* offset: multiplexing register offset +* address: physical address of multiplexing register * mask: mask for supported mode * value: value to be written */ struct pmx_mux_reg { -u32 offset; +u32 address;u32 mask;u32 value; };
@@ -87,14 +87,12 @@ struct pmx_dev {* mode: mode to be set * devs: array of pointer to pmx devices * devs_count: ARRAY_SIZE of devs -* base: base address of soc config registers * mode_reg: structure of mode config register */ struct pmx_driver {struct pmx_mode *mode;struct pmx_dev **devs;u8 devs_count; -u32 *base;struct pmx_reg mode_reg; };
arch/arm/plat-spear/padmux.c +22 -14
@@ -19,12 +19,10 @@/* * struct pmx: pmx definition structure * -* base: base address of configuration registers * mode_reg: mode configurations * active_mode: pointer to current active mode */ struct pmx { -u32 base;struct pmx_reg mode_reg;struct pmx_mode *active_mode; };
@@ -40,17 +38,22 @@ static struct pmx *pmx;*/ static int pmx_mode_set (struct pmx_mode *mode) { -u32 val; +u32 val, *address;if (!mode->name)return -EFAULT ; pmx->active_mode = mode; - val =readl (pmx->base + pmx->mode_reg.offset); - val &= ~pmx->mode_reg.mask; - val |= mode->value & pmx->mode_reg.mask; -writel (val, pmx->base + pmx->mode_reg.offset); + address =ioremap (pmx->mode_reg.address,SZ_16 ); +if (address) { + val =readl (address); + val &= ~pmx->mode_reg.mask; + val |= mode->value & pmx->mode_reg.mask; +writel (val, address); + +iounmap (address); + }return 0 ; }
@@ -70,6 +73,7 @@ static int pmx_mode_set(struct pmx_mode *mode)static int pmx_devs_enable (struct pmx_dev **devs,u8 count) {u32 val, i; +u32 *address;if (!count)return -EINVAL ;
@@ -104,10 +108,15 @@ static int pmx_devs_enable(struct pmx_dev **devs, u8 count)struct pmx_mux_reg *mux_reg = &devs[i]->modes[j].mux_regs[k]; - val =readl (pmx->base + mux_reg->offset); - val &= ~mux_reg->mask; - val |= mux_reg->value & mux_reg->mask; -writel (val, pmx->base + mux_reg->offset); + address =ioremap (mux_reg->address,SZ_16 ); +if (address) { + val =readl (address); + val &= ~mux_reg->mask; + val |= mux_reg->value & mux_reg->mask; +writel (val, address); + +iounmap (address); + } } devs[i]->is_active = true;
@@ -134,15 +143,14 @@ int pmx_register(struct pmx_driver *driver)if (pmx)return -EPERM ; -if (!driver->base || !driver->devs) +if (!driver->devs)return -EFAULT ; pmx =kzalloc (sizeof (*pmx),GFP_KERNEL );if (!pmx)return -ENOMEM ; - pmx->base = (u32 )driver->base; - pmx->mode_reg.offset = driver->mode_reg.offset; + pmx->mode_reg.address = driver->mode_reg.address; pmx->mode_reg.mask = driver->mode_reg.mask;/* choose mode to enable */
Signature · 1 line
1.7.2.2
PATCH v4 48/62 ST SPEAr3xx: Passing pmx devices address from machine *.c files
In reply to Viresh KumarAll spear3xx machines have different pad mux register addresses. In order to have single image for all spear3xx boards, we need to pass this address from machine specific files to fix addresses of pmx devs found in spear3xx.c
--- arch/arm/mach-spear3xx/include/mach/generic.h | 11 +++--- arch/arm/mach-spear3xx/spear300.c | 27 +++----------- arch/arm/mach-spear3xx/spear310.c | 11 ++---- arch/arm/mach-spear3xx/spear320.c | 31 ++-------------- arch/arm/mach-spear3xx/spear3xx.c | 48 +++++++++--------------- 5 files changed, 36 insertions(+), 92 deletions(-)
arch/arm/mach-spear3xx/include/mach/generic.h +6 -5
@@ -49,6 +49,7 @@ void __init spear_setup_timer(void);void __init spear3xx_map_io (void );void __init spear3xx_init_irq (void );void __init spear3xx_init (void ); +void spear3xx_pmx_init_addr (struct pmx_driver *driver,unsigned int addr);/* pad mux declarations */ #define PMX_FIRDA_MASK (1 << 14)
@@ -149,8 +150,8 @@ extern struct pmx_dev pmx_telecom_sdhci_8bit;extern struct pmx_dev pmx_gpio1;/* pad multiplexing support */ -#define PAD_MUX_CONFIG_REG 0x99000000 -#define MODE_CONFIG_REG 0x99000004 +#define SPEAR300_PAD_MUX_CONFIG_REG 0x99000000 +#define SPEAR300_MODE_CONFIG_REG 0x99000004/* Add spear300 machine function declarations here */ void __init spear300_init (void );
@@ -182,7 +183,7 @@ extern struct pmx_dev pmx_uart3_4_5;extern struct pmx_dev pmx_fsmc;extern struct pmx_dev pmx_rs485_0_1;extern struct pmx_dev pmx_tdm0; -#define PAD_MUX_CONFIG_REG 0xB4000008 +#define SPEAR310_PAD_MUX_CONFIG_REG 0xB4000008/* Add spear310 machine function declarations here */ void __init spear310_init (void );
@@ -234,8 +235,8 @@ extern struct pmx_dev pmx_smii1;extern struct pmx_dev pmx_i2c1;/* pad multiplexing support */ -#define PAD_MUX_CONFIG_REG 0xB300000C -#define MODE_CONFIG_REG 0xB3000010 +#define SPEAR320_PAD_MUX_CONFIG_REG 0xB300000C +#define SPEAR320_MODE_CONFIG_REG 0xB3000010/* Add spear320 machine function declarations here */ void __init spear320_init (void );
arch/arm/mach-spear3xx/spear300.c +5 -22
@@ -118,7 +118,6 @@ struct pmx_mode caml_lcd_mode = {/* Pad multiplexing for FSMC 2 NAND devices */ static struct pmx_mux_reg pmx_fsmc_2_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_FIRDA_MASK , .value =0 , },
@@ -142,7 +141,6 @@ struct pmx_dev pmx_fsmc_2_chips = {/* Pad multiplexing for FSMC 4 NAND devices */ static struct pmx_mux_reg pmx_fsmc_4_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_FIRDA_MASK |PMX_UART0_MASK , .value =0 , },
@@ -166,7 +164,6 @@ struct pmx_dev pmx_fsmc_4_chips = {/* Pad multiplexing for Keyboard device */ static struct pmx_mux_reg pmx_kbd_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =0x0 , .value =0 , },
@@ -192,7 +189,6 @@ struct pmx_dev pmx_keyboard = {/* Pad multiplexing for CLCD device */ static struct pmx_mux_reg pmx_clcd_pfmode_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_TIMER_1_2_MASK |PMX_TIMER_3_4_MASK , .value =0 , },
@@ -200,7 +196,6 @@ static struct pmx_mux_reg pmx_clcd_pfmode_mux[] = {static struct pmx_mux_reg pmx_clcd_lcdmode_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_TIMER_3_4_MASK , .value =0 , },
@@ -228,7 +223,6 @@ struct pmx_dev pmx_clcd = {/* Pad multiplexing for Telecom GPIO device */ static struct pmx_mux_reg pmx_gpio_lcdmode_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_MII_MASK , .value =0 , },
@@ -236,7 +230,6 @@ static struct pmx_mux_reg pmx_gpio_lcdmode_mux[] = {static struct pmx_mux_reg pmx_gpio_fonemode_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_MII_MASK |PMX_TIMER_1_2_MASK |PMX_TIMER_3_4_MASK , .value =0 , },
@@ -244,7 +237,6 @@ static struct pmx_mux_reg pmx_gpio_fonemode_mux[] = {static struct pmx_mux_reg pmx_gpio_atai2smode_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_MII_MASK |PMX_TIMER_3_4_MASK , .value =0 , },
@@ -252,7 +244,6 @@ static struct pmx_mux_reg pmx_gpio_atai2smode_mux[] = {static struct pmx_mux_reg pmx_gpio_lendfonemode_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_MII_MASK |PMX_TIMER_1_2_MASK , .value =0 , },
@@ -260,7 +251,6 @@ static struct pmx_mux_reg pmx_gpio_lendfonemode_mux[] = {static struct pmx_mux_reg pmx_gpio_atawi2smode_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_MII_MASK |PMX_TIMER_1_2_MASK |PMX_TIMER_3_4_MASK |PMX_UART0_MODEM_MASK , .value =0 ,
@@ -300,7 +290,6 @@ struct pmx_dev pmx_telecom_gpio = {/* Pad multiplexing for TDM device */ static struct pmx_mux_reg pmx_tdm_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_UART0_MODEM_MASK |PMX_SSP_CS_MASK , .value =0 , },
@@ -327,7 +316,6 @@ struct pmx_dev pmx_telecom_tdm = {/* Pad multiplexing for spi cs i2c device */ static struct pmx_mux_reg pmx_spi_cs_i2c_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_TIMER_1_2_MASK |PMX_TIMER_3_4_MASK , .value =0 , },
@@ -352,7 +340,6 @@ struct pmx_dev pmx_telecom_spi_cs_i2c_clk = {static struct pmx_mux_reg pmx_caml_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_MII_MASK , .value =0 , },
@@ -360,7 +347,6 @@ static struct pmx_mux_reg pmx_caml_mux[] = {static struct pmx_mux_reg pmx_camu_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_TIMER_1_2_MASK |PMX_TIMER_3_4_MASK |PMX_MII_MASK , .value =0 , },
@@ -387,7 +373,6 @@ struct pmx_dev pmx_telecom_camera = {/* Pad multiplexing for dac device */ static struct pmx_mux_reg pmx_dac_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_TIMER_1_2_MASK , .value =0 , },
@@ -411,7 +396,6 @@ struct pmx_dev pmx_telecom_dac = {/* Pad multiplexing for spi cs i2c device */ static struct pmx_mux_reg pmx_i2s_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_UART0_MODEM_MASK , .value =0 , },
@@ -437,7 +421,6 @@ struct pmx_dev pmx_telecom_i2s = {/* Pad multiplexing for bootpins device */ static struct pmx_mux_reg pmx_bootpins_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_UART0_MODEM_MASK |PMX_TIMER_1_2_MASK |PMX_TIMER_3_4_MASK , .value =0 ,
@@ -461,7 +444,6 @@ struct pmx_dev pmx_telecom_boot_pins = {/* Pad multiplexing for sdhci 4bit device */ static struct pmx_mux_reg pmx_sdhci_4bit_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_GPIO_PIN0_MASK |PMX_GPIO_PIN1_MASK |PMX_GPIO_PIN2_MASK |PMX_GPIO_PIN3_MASK |PMX_GPIO_PIN4_MASK |PMX_GPIO_PIN5_MASK ,
@@ -490,7 +472,6 @@ struct pmx_dev pmx_telecom_sdhci_4bit = {/* Pad multiplexing for spi cs i2c device */ static struct pmx_mux_reg pmx_sdhci_8bit_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_GPIO_PIN0_MASK |PMX_GPIO_PIN1_MASK |PMX_GPIO_PIN2_MASK |PMX_GPIO_PIN3_MASK |PMX_GPIO_PIN4_MASK |PMX_GPIO_PIN5_MASK |PMX_MII_MASK ,
@@ -518,7 +499,6 @@ struct pmx_dev pmx_telecom_sdhci_8bit = {/* Pad multiplexing for spi cs i2c device */ static struct pmx_mux_reg pmx_gpio1_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_UART0_MODEM_MASK |PMX_TIMER_1_2_MASK |PMX_TIMER_3_4_MASK , .value =0 ,
@@ -541,7 +521,7 @@ struct pmx_dev pmx_gpio1 = {/* pmx driver structure */ struct pmx_driver pmx_driver = { - .mode_reg = {.address =MODE_CONFIG_REG , .mask =0x0000000f }, + .mode_reg = {.address =SPEAR300_MODE_CONFIG_REG , .mask =0x0000000f }, };/* Add spear300 specific devices here */
@@ -777,7 +757,7 @@ struct spear_shirq shirq_ras1 = {void sdhci_i2s_mem_enable (u8 mask) {u32 val; -void __iomem *config =ioremap (MODE_CONFIG_REG ,SZ_16 ); +void __iomem *config =ioremap (SPEAR300_MODE_CONFIG_REG ,SZ_16 );if (!config) {pr_debug ("sdhci_i2s_enb: ioremap fail\n" );return ;
@@ -809,6 +789,9 @@ void __init spear300_init(void)printk (KERN_ERR "Error registering Shared IRQ\n" ); } +/* This fixes addresses of all pmx devices for spear300 */ +spear3xx_pmx_init_addr (&pmx_driver,SPEAR300_PAD_MUX_CONFIG_REG ); +/* pmx initialization */ ret =pmx_register (&pmx_driver);if (ret)
arch/arm/mach-spear3xx/spear310.c +3 -8
@@ -26,7 +26,6 @@/* Pad multiplexing for emi_cs_0_1_4_5 devices */ static struct pmx_mux_reg pmx_emi_cs_0_1_4_5_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_TIMER_3_4_MASK , .value =0 , },
@@ -48,7 +47,6 @@ struct pmx_dev pmx_emi_cs_0_1_4_5 = {/* Pad multiplexing for emi_cs_2_3 devices */ static struct pmx_mux_reg pmx_emi_cs_2_3_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_TIMER_1_2_MASK , .value =0 , },
@@ -70,7 +68,6 @@ struct pmx_dev pmx_emi_cs_2_3 = {/* Pad multiplexing for uart1 device */ static struct pmx_mux_reg pmx_uart1_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_FIRDA_MASK , .value =0 , },
@@ -92,7 +89,6 @@ struct pmx_dev pmx_uart1 = {/* Pad multiplexing for uart2 device */ static struct pmx_mux_reg pmx_uart2_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_TIMER_1_2_MASK , .value =0 , },
@@ -114,7 +110,6 @@ struct pmx_dev pmx_uart2 = {/* Pad multiplexing for uart3_4_5 devices */ static struct pmx_mux_reg pmx_uart3_4_5_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_UART0_MODEM_MASK , .value =0 , },
@@ -136,7 +131,6 @@ struct pmx_dev pmx_uart3_4_5 = {/* Pad multiplexing for fsmc device */ static struct pmx_mux_reg pmx_fsmc_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_SSP_CS_MASK , .value =0 , },
@@ -158,7 +152,6 @@ struct pmx_dev pmx_fsmc = {/* Pad multiplexing for rs485_0_1 devices */ static struct pmx_mux_reg pmx_rs485_0_1_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_MII_MASK , .value =0 , },
@@ -180,7 +173,6 @@ struct pmx_dev pmx_rs485_0_1 = {/* Pad multiplexing for tdm0 device */ static struct pmx_mux_reg pmx_tdm0_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_MII_MASK , .value =0 , },
@@ -523,6 +515,9 @@ void __init spear310_init(void)printk (KERN_ERR "Error registering Shared IRQ 4\n" ); } +/* This fixes addresses of all pmx devices for spear310 */ +spear3xx_pmx_init_addr (&pmx_driver,SPEAR310_PAD_MUX_CONFIG_REG ); +/* pmx initialization */ ret =pmx_register (&pmx_driver);if (ret)
arch/arm/mach-spear3xx/spear320.c +4 -27
@@ -58,7 +58,6 @@ struct pmx_mode small_printers_mode = {/* Pad multiplexing for CLCD device */ static struct pmx_mux_reg pmx_clcd_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =0x0 , .value =0 , },
@@ -81,7 +80,6 @@ struct pmx_dev pmx_clcd = {/* Pad multiplexing for EMI (Parallel NOR flash) device */ static struct pmx_mux_reg pmx_emi_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_TIMER_1_2_MASK |PMX_TIMER_3_4_MASK , .value =0 , },
@@ -104,7 +102,6 @@ struct pmx_dev pmx_emi = {/* Pad multiplexing for FSMC (NAND flash) device */ static struct pmx_mux_reg pmx_fsmc_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =0x0 , .value =0 , },
@@ -127,7 +124,6 @@ struct pmx_dev pmx_fsmc = {/* Pad multiplexing for SPP device */ static struct pmx_mux_reg pmx_spp_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =0x0 , .value =0 , },
@@ -150,7 +146,6 @@ struct pmx_dev pmx_spp = {/* Pad multiplexing for SDHCI device */ static struct pmx_mux_reg pmx_sdhci_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_TIMER_1_2_MASK |PMX_TIMER_3_4_MASK , .value =0 , },
@@ -174,7 +169,6 @@ struct pmx_dev pmx_sdhci = {/* Pad multiplexing for I2S device */ static struct pmx_mux_reg pmx_i2s_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_UART0_MODEM_MASK , .value =0 , },
@@ -197,7 +191,6 @@ struct pmx_dev pmx_i2s = {/* Pad multiplexing for UART1 device */ static struct pmx_mux_reg pmx_uart1_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_GPIO_PIN0_MASK |PMX_GPIO_PIN1_MASK , .value =0 , },
@@ -220,7 +213,6 @@ struct pmx_dev pmx_uart1 = {/* Pad multiplexing for UART1 Modem device */ static struct pmx_mux_reg pmx_uart1_modem_autoexp_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_TIMER_1_2_MASK |PMX_TIMER_3_4_MASK |PMX_SSP_CS_MASK , .value =0 ,
@@ -229,7 +221,6 @@ static struct pmx_mux_reg pmx_uart1_modem_autoexp_mux[] = {static struct pmx_mux_reg pmx_uart1_modem_smallpri_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_GPIO_PIN3_MASK |PMX_GPIO_PIN4_MASK |PMX_GPIO_PIN5_MASK |PMX_SSP_CS_MASK , .value =0 ,
@@ -257,7 +248,6 @@ struct pmx_dev pmx_uart1_modem = {/* Pad multiplexing for UART2 device */ static struct pmx_mux_reg pmx_uart2_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_FIRDA_MASK , .value =0 , },
@@ -280,7 +270,6 @@ struct pmx_dev pmx_uart2 = {/* Pad multiplexing for Touchscreen device */ static struct pmx_mux_reg pmx_touchscreen_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_SSP_CS_MASK , .value =0 , },
@@ -303,7 +292,6 @@ struct pmx_dev pmx_touchscreen = {/* Pad multiplexing for CAN device */ static struct pmx_mux_reg pmx_can_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_GPIO_PIN2_MASK |PMX_GPIO_PIN3_MASK |PMX_GPIO_PIN4_MASK |PMX_GPIO_PIN5_MASK , .value =0 ,
@@ -327,7 +315,6 @@ struct pmx_dev pmx_can = {/* Pad multiplexing for SDHCI LED device */ static struct pmx_mux_reg pmx_sdhci_led_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_SSP_CS_MASK , .value =0 , },
@@ -350,7 +337,6 @@ struct pmx_dev pmx_sdhci_led = {/* Pad multiplexing for PWM0 device */ static struct pmx_mux_reg pmx_pwm0_net_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_UART0_MODEM_MASK , .value =0 , },
@@ -358,7 +344,6 @@ static struct pmx_mux_reg pmx_pwm0_net_mux[] = {static struct pmx_mux_reg pmx_pwm0_autoexpsmallpri_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_MII_MASK , .value =0 , },
@@ -385,7 +370,6 @@ struct pmx_dev pmx_pwm0 = {/* Pad multiplexing for PWM1 device */ static struct pmx_mux_reg pmx_pwm1_net_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_UART0_MODEM_MASK , .value =0 , },
@@ -393,7 +377,6 @@ static struct pmx_mux_reg pmx_pwm1_net_mux[] = {static struct pmx_mux_reg pmx_pwm1_autoexpsmallpri_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_MII_MASK , .value =0 , },
@@ -420,7 +403,6 @@ struct pmx_dev pmx_pwm1 = {/* Pad multiplexing for PWM2 device */ static struct pmx_mux_reg pmx_pwm2_net_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_SSP_CS_MASK , .value =0 , },
@@ -428,7 +410,6 @@ static struct pmx_mux_reg pmx_pwm2_net_mux[] = {static struct pmx_mux_reg pmx_pwm2_autoexpsmallpri_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_MII_MASK , .value =0 , },
@@ -455,7 +436,6 @@ struct pmx_dev pmx_pwm2 = {/* Pad multiplexing for PWM3 device */ static struct pmx_mux_reg pmx_pwm3_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_MII_MASK , .value =0 , },
@@ -478,7 +458,6 @@ struct pmx_dev pmx_pwm3 = {/* Pad multiplexing for SSP1 device */ static struct pmx_mux_reg pmx_ssp1_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_MII_MASK , .value =0 , },
@@ -501,7 +480,6 @@ struct pmx_dev pmx_ssp1 = {/* Pad multiplexing for SSP2 device */ static struct pmx_mux_reg pmx_ssp2_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_MII_MASK , .value =0 , },
@@ -524,7 +502,6 @@ struct pmx_dev pmx_ssp2 = {/* Pad multiplexing for mii1 device */ static struct pmx_mux_reg pmx_mii1_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =0x0 , .value =0 , },
@@ -547,7 +524,6 @@ struct pmx_dev pmx_mii1 = {/* Pad multiplexing for smii0 device */ static struct pmx_mux_reg pmx_smii0_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_MII_MASK , .value =0 , },
@@ -570,7 +546,6 @@ struct pmx_dev pmx_smii0 = {/* Pad multiplexing for smii1 device */ static struct pmx_mux_reg pmx_smii1_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =PMX_MII_MASK , .value =0 , },
@@ -593,7 +568,6 @@ struct pmx_dev pmx_smii1 = {/* Pad multiplexing for i2c1 device */ static struct pmx_mux_reg pmx_i2c1_mux[] = { { - .address =PAD_MUX_CONFIG_REG , .mask =0x0 , .value =0 , },
@@ -615,7 +589,7 @@ struct pmx_dev pmx_i2c1 = {/* pmx driver structure */ struct pmx_driver pmx_driver = { - .mode_reg = {.address =MODE_CONFIG_REG , .mask =0x00000007 }, + .mode_reg = {.address =SPEAR320_MODE_CONFIG_REG , .mask =0x00000007 }, };/* Add spear320 specific devices here */
@@ -1015,6 +989,9 @@ void __init spear320_init(void)printk (KERN_ERR "Error registering Shared IRQ 4\n" ); } +/* This fixes addresses of all pmx devices for spear320 */ +spear3xx_pmx_init_addr (&pmx_driver,SPEAR320_PAD_MUX_CONFIG_REG ); +/* pmx initialization */ ret =pmx_register (&pmx_driver);if (ret)
arch/arm/mach-spear3xx/spear3xx.c +18 -30
231 lines not on this page · raw message
Signature · 1 line
1.7.2.2
PATCH v4 49/62 ST SPEAr Clock Framework: Updating for single image solution
In reply to Viresh KumarThis patch creates different clk_lookup arrays for individual machines. These lookup arrays will be registered only if that specific machine is current machine.
--- arch/arm/mach-spear13xx/clock.c | 29 ++++++++++-- arch/arm/mach-spear3xx/clock.c | 75 +++++++++++++++++++----------- arch/arm/mach-spear6xx/clock.c | 8 +++- arch/arm/plat-spear/clock.c | 8 +--- arch/arm/plat-spear/include/plat/clock.h | 2 +- 5 files changed, 82 insertions(+), 40 deletions(-)
arch/arm/mach-spear13xx/clock.c +25 -4
@@ -1117,13 +1117,17 @@ static struct clk_lookup spear_clk_lookups[] = { {.dev_id = "gpio1", .clk = &gpio1_clk}, {.dev_id = "keyboard", .clk = &kbd_clk}, {.dev_id = "wdt", .clk = &wdt_clk}, +}; - /* spear1300 machine specific clock structures */ +/* array of all spear 1300 clock lookups */ #ifdef CONFIG_MACH_SPEAR1300 +static struct clk_lookup spear1300_clk_lookups[] = { +};#endif - /* spear1310 machine specific clock structures */ +/* array of all spear 1310 clock lookups */ #ifdef CONFIG_MACH_SPEAR1310 +static struct clk_lookup spear1310_clk_lookups[] = { {.dev_id ="c_can_platform.0" , .clk = &can0_clk}, {.dev_id ="c_can_platform.1" , .clk = &can1_clk}, {.dev_id = "stmmaceth.1", .clk = &gmac_ras1_clk},
@@ -1134,11 +1138,28 @@ static struct clk_lookup spear_clk_lookups[] = { {.dev_id = "stmmacphy.2", .clk = &gmac_phy2_clk}, {.dev_id = "stmmacphy.3", .clk = &gmac_phy3_clk}, {.dev_id = "stmmacphy.4", .clk = &gmac_phy4_clk}, -#endif }; +#endif /* machine clk init */ void __init spear13xx_clk_init(void) { -clk_init (spear_clk_lookups,ARRAY_SIZE (spear_clk_lookups), &ddr_clk); + int i, cnt; + struct clk_lookup *lookups; + + if (machine_is_spear1300()) { + cnt = ARRAY_SIZE(spear1300_clk_lookups); + lookups = spear1300_clk_lookups; + } else { + cnt = ARRAY_SIZE(spear1310_clk_lookups); + lookups = spear1310_clk_lookups; + } + + for (i = 0; i < ARRAY_SIZE(spear_clk_lookups); i++) + clk_register(&spear_clk_lookups[i]); + + for (i = 0; i < cnt; i++) + clk_register(&lookups[i]); + + clk_init(&ddr_clk); }
arch/arm/mach-spear3xx/clock.c +48 -27
106 lines not on this page · raw message
arch/arm/mach-spear6xx/clock.c +7 -1
@@ -14,6 +14,7 @@#include <linux/init.h> #include <linux/kernel.h> #include <mach/misc_regs.h> +#include <asm/mach-types.h> #include <plat/clock.h> /* root clks */
@@ -740,5 +741,10 @@ static struct clk_lookup spear_clk_lookups[] = {/* machine clk init */ void __init spear6xx_clk_init (void ) { -clk_init (spear_clk_lookups,ARRAY_SIZE (spear_clk_lookups), &ddr_clk); +int i; + +for (i =0 ; i <ARRAY_SIZE (spear_clk_lookups); i++) +clk_register (&spear_clk_lookups[i]); + +clk_init (&ddr_clk); }
arch/arm/plat-spear/clock.c +1 -7
@@ -949,14 +949,8 @@ void recalc_root_clocks(void)spin_unlock_irqrestore (&clocks_lock, flags); } -void __init -clk_init (struct clk_lookup *clk_lookups,u32 count,struct clk *dclk) +void __init clk_init (struct clk *dclk) { -int i; - -for (i =0 ; i < count; i++) -clk_register (&clk_lookups[i]); -recalc_root_clocks ();/* Mark all ancestors of DDR with special flag */
arch/arm/plat-spear/include/plat/clock.h +1 -1
@@ -241,7 +241,7 @@ struct ddr_rate_tbl {* Actually before changing rate of DDRs ancestor, we must put ddr in refresh * state and then change parent. */ -void clk_init (struct clk_lookup *clk_lookups,u32 count,struct clk *dclk); +void clk_init (struct clk *dclk);void clk_register (struct clk_lookup *cl);void recalc_root_clocks (void );
Signature · 1 line
1.7.2.2
PATCH v4 50/62 SPEAr3xx: Make local structures static
In reply to Viresh KumarFrom: Ryan Mallon <[email protected]>
Several structures in arch/arm/mach-spear3xx are not marked static like they should be. Fix this.
--- arch/arm/mach-spear3xx/spear300.c | 6 +++--- arch/arm/mach-spear3xx/spear310.c | 16 ++++++++-------- arch/arm/mach-spear3xx/spear320.c | 12 ++++++------ arch/arm/mach-spear3xx/spear3xx.c | 2 -- 4 files changed, 17 insertions(+), 19 deletions(-)
arch/arm/mach-spear3xx/spear300.c +3 -3
@@ -114,7 +114,6 @@ struct pmx_mode caml_lcd_mode = { .value = 0x0F, }; -/* devices */ /* Pad multiplexing for FSMC 2 NAND devices */ static struct pmx_mux_reg pmx_fsmc_2_mux[] = { {
@@ -700,7 +699,7 @@ struct platform_device sdhci_device = { };/* spear3xx shared irq */ -struct shirq_dev_config shirq_ras1_config[] = { +static struct shirq_dev_config shirq_ras1_config[] = { { .virq =VIRQ_IT_PERS_S , .enb_mask =IT_PERS_S_IRQ_MASK ,
@@ -740,7 +739,8 @@ struct shirq_dev_config shirq_ras1_config[] = { }, }; -struct spear_shirq shirq_ras1 = { + +static struct spear_shirq shirq_ras1 = { .irq =IRQ_GEN_RAS_1 , .dev_config = shirq_ras1_config, .dev_count =ARRAY_SIZE (shirq_ras1_config),
arch/arm/mach-spear3xx/spear310.c +8 -8
@@ -363,7 +363,7 @@ struct platform_device plgpio_device = {/* spear3xx shared irq */ -struct shirq_dev_config shirq_ras1_config[] = { +static struct shirq_dev_config shirq_ras1_config[] = { { .virq =VIRQ_SMII0 , .status_mask =SMII0_IRQ_MASK ,
@@ -391,7 +391,7 @@ struct shirq_dev_config shirq_ras1_config[] = { }, }; -struct spear_shirq shirq_ras1 = { +static struct spear_shirq shirq_ras1 = { .irq =IRQ_GEN_RAS_1 , .dev_config = shirq_ras1_config, .dev_count =ARRAY_SIZE (shirq_ras1_config),
@@ -403,7 +403,7 @@ struct spear_shirq shirq_ras1 = { }, }; -struct shirq_dev_config shirq_ras2_config[] = { +static struct shirq_dev_config shirq_ras2_config[] = { { .virq =VIRQ_UART1 , .status_mask =UART1_IRQ_MASK ,
@@ -422,7 +422,7 @@ struct shirq_dev_config shirq_ras2_config[] = { }, }; -struct spear_shirq shirq_ras2 = { +static struct spear_shirq shirq_ras2 = { .irq =IRQ_GEN_RAS_2 , .dev_config = shirq_ras2_config, .dev_count =ARRAY_SIZE (shirq_ras2_config),
@@ -434,14 +434,14 @@ struct spear_shirq shirq_ras2 = { }, }; -struct shirq_dev_config shirq_ras3_config[] = { +static struct shirq_dev_config shirq_ras3_config[] = { { .virq =VIRQ_EMI , .status_mask =EMI_IRQ_MASK , }, }; -struct spear_shirq shirq_ras3 = { +static struct spear_shirq shirq_ras3 = { .irq =IRQ_GEN_RAS_3 , .dev_config = shirq_ras3_config, .dev_count =ARRAY_SIZE (shirq_ras3_config),
@@ -453,7 +453,7 @@ struct spear_shirq shirq_ras3 = { }, }; -struct shirq_dev_config shirq_intrcomm_ras_config[] = { +static struct shirq_dev_config shirq_intrcomm_ras_config[] = { { .virq =VIRQ_TDM_HDLC , .status_mask =TDM_HDLC_IRQ_MASK ,
@@ -466,7 +466,7 @@ struct shirq_dev_config shirq_intrcomm_ras_config[] = { }, }; -struct spear_shirq shirq_intrcomm_ras = { +static struct spear_shirq shirq_intrcomm_ras = { .irq =IRQ_INTRCOMM_RAS_ARM , .dev_config = shirq_intrcomm_ras_config, .dev_count =ARRAY_SIZE (shirq_intrcomm_ras_config),
arch/arm/mach-spear3xx/spear320.c +6 -6
@@ -835,7 +835,7 @@ struct platform_device sdhci_device = { };/* spear3xx shared irq */ -struct shirq_dev_config shirq_ras1_config[] = { +static struct shirq_dev_config shirq_ras1_config[] = { { .virq =VIRQ_EMI , .status_mask =EMI_IRQ_MASK ,
@@ -851,7 +851,7 @@ struct shirq_dev_config shirq_ras1_config[] = { }, }; -struct spear_shirq shirq_ras1 = { +static struct spear_shirq shirq_ras1 = { .irq =IRQ_GEN_RAS_1 , .dev_config = shirq_ras1_config, .dev_count =ARRAY_SIZE (shirq_ras1_config),
@@ -864,7 +864,7 @@ struct spear_shirq shirq_ras1 = { }, }; -struct shirq_dev_config shirq_ras3_config[] = { +static struct shirq_dev_config shirq_ras3_config[] = { { .virq =VIRQ_PLGPIO , .enb_mask =GPIO_IRQ_MASK ,
@@ -883,7 +883,7 @@ struct shirq_dev_config shirq_ras3_config[] = { }, }; -struct spear_shirq shirq_ras3 = { +static struct spear_shirq shirq_ras3 = { .irq =IRQ_GEN_RAS_3 , .dev_config = shirq_ras3_config, .dev_count =ARRAY_SIZE (shirq_ras3_config),
@@ -897,7 +897,7 @@ struct spear_shirq shirq_ras3 = { }, }; -struct shirq_dev_config shirq_intrcomm_ras_config[] = { +static struct shirq_dev_config shirq_intrcomm_ras_config[] = { { .virq =VIRQ_CANU , .status_mask =CAN_U_IRQ_MASK ,
@@ -945,7 +945,7 @@ struct shirq_dev_config shirq_intrcomm_ras_config[] = { }, }; -struct spear_shirq shirq_intrcomm_ras = { +static struct spear_shirq shirq_intrcomm_ras = { .irq =IRQ_INTRCOMM_RAS_ARM , .dev_config = shirq_intrcomm_ras_config, .dev_count =ARRAY_SIZE (shirq_intrcomm_ras_config),
arch/arm/mach-spear3xx/spear3xx.c +0 -2
@@ -273,7 +273,6 @@ void __init spear3xx_map_io(void) }/* pad multiplexing support */ -/* devices */ /* Pad multiplexing for firda device */ static struct pmx_mux_reg pmx_firda_mux[] = {
@@ -606,7 +605,6 @@ struct pmx_dev pmx_timer_1_2 = { }; #if defined(CONFIG_MACH_SPEAR310) || defined(CONFIG_MACH_SPEAR320) -/* plgpios devices */ /* Pad multiplexing for plgpio_0_1 devices */ static struct pmx_mux_reg pmx_plgpio_0_1_mux[] = { {
Signature · 1 line
1.7.2.2
PATCH v4 51/62 SPEAR3xx: Rename register/irq defines to remove naming conflicts
In reply to Viresh KumarFrom: Ryan Mallon <[email protected]>
Prefix register and irq defintions to remove naming conflicts between the three SPEAr3xx platforms.
--- arch/arm/mach-spear3xx/include/mach/generic.h | 4 +- arch/arm/mach-spear3xx/include/mach/gpio.h | 3 +- arch/arm/mach-spear3xx/include/mach/irqs.h | 207 ++++++++++++------------ arch/arm/mach-spear3xx/include/mach/spear300.h | 26 ++-- arch/arm/mach-spear3xx/include/mach/spear310.h | 44 +++--- arch/arm/mach-spear3xx/include/mach/spear320.h | 48 +++--- arch/arm/mach-spear3xx/spear300.c | 73 ++++----- arch/arm/mach-spear3xx/spear310.c | 108 ++++++------ arch/arm/mach-spear3xx/spear320.c | 154 +++++++++--------- arch/arm/mach-spear3xx/spear3xx.c | 23 ++-- 10 files changed, 346 insertions(+), 344 deletions(-)
arch/arm/mach-spear3xx/include/mach/generic.h +2 -2
@@ -27,8 +27,8 @@* Following GPT channels will be used as clock source and clockevent */ #define SPEAR_GPT0_BASE SPEAR3XX_ML1_TMR_BASE -#define SPEAR_GPT0_CHAN0_IRQ IRQ_CPU_GPT1_1 -#define SPEAR_GPT0_CHAN1_IRQ IRQ_CPU_GPT1_2 +#define SPEAR_GPT0_CHAN0_IRQ SPEAR3XX_IRQ_CPU_GPT1_1 +#define SPEAR_GPT0_CHAN1_IRQ SPEAR3XX_IRQ_CPU_GPT1_2/* Add spear3xx family device structure declarations here */ extern struct amba_device gpio_device;
arch/arm/mach-spear3xx/include/mach/gpio.h +2 -1
@@ -51,8 +51,9 @@#define RAS_GPIO_5 13#define RAS_GPIO_6 14#define RAS_GPIO_7 15 +#endif -#elif defined(CONFIG_MACH_SPEAR310 ) || defined(CONFIG_MACH_SPEAR320 ) +#if defined(CONFIG_MACH_SPEAR310 ) || defined(CONFIG_MACH_SPEAR320 )#define PLGPIO_0 8#define PLGPIO_1 9#define PLGPIO_2 10
arch/arm/mach-spear3xx/include/mach/irqs.h +104 -103
243 lines not on this page · raw message
arch/arm/mach-spear3xx/include/mach/spear300.h +13 -13
@@ -20,19 +20,19 @@#define SPEAR300_TELECOM_BASE UL(0x50000000)/* Interrupt registers offsets and masks */ -#define INT_ENB_MASK_REG 0x54 -#define INT_STS_MASK_REG 0x58 -#define IT_PERS_S_IRQ_MASK (1 << 0) -#define IT_CHANGE_S_IRQ_MASK (1 << 1) -#define I2S_IRQ_MASK (1 << 2) -#define TDM_IRQ_MASK (1 << 3) -#define CAMERA_L_IRQ_MASK (1 << 4) -#define CAMERA_F_IRQ_MASK (1 << 5) -#define CAMERA_V_IRQ_MASK (1 << 6) -#define KEYBOARD_IRQ_MASK (1 << 7) -#define GPIO1_IRQ_MASK (1 << 8) - -#define SHIRQ_RAS1_MASK 0x1FF +#define SPEAR300_INT_ENB_MASK_REG 0x54 +#define SPEAR300_INT_STS_MASK_REG 0x58 +#define SPEAR300_IT_PERS_S_IRQ_MASK (1 << 0) +#define SPEAR300_IT_CHANGE_S_IRQ_MASK (1 << 1) +#define SPEAR300_I2S_IRQ_MASK (1 << 2) +#define SPEAR300_TDM_IRQ_MASK (1 << 3) +#define SPEAR300_CAMERA_L_IRQ_MASK (1 << 4) +#define SPEAR300_CAMERA_F_IRQ_MASK (1 << 5) +#define SPEAR300_CAMERA_V_IRQ_MASK (1 << 6) +#define SPEAR300_KEYBOARD_IRQ_MASK (1 << 7) +#define SPEAR300_GPIO1_IRQ_MASK (1 << 8) + +#define SPEAR300_SHIRQ_RAS1_MASK 0x1FF#define SPEAR300_CLCD_BASE UL(0x60000000)#define SPEAR300_SDHCI_BASE UL(0x70000000)
arch/arm/mach-spear3xx/include/mach/spear310.h +22 -22
51 lines not on this page · raw message
arch/arm/mach-spear3xx/include/mach/spear320.h +24 -24
55 lines not on this page · raw message
arch/arm/mach-spear3xx/spear300.c +36 -37
123 lines not on this page · raw message
arch/arm/mach-spear3xx/spear310.c +54 -54
219 lines not on this page · raw message
arch/arm/mach-spear3xx/spear320.c +77 -77
270 lines not on this page · raw message
arch/arm/mach-spear3xx/spear3xx.c +12 -11
@@ -22,13 +22,14 @@#include <mach/generic.h> #include <mach/spear.h> -#define SPEAR3XX_WKUP_SRCS (1 << IRQ_MAC_1 | 1 << IRQ_USB_DEV | \ - 1 << IRQ_BASIC_RTC | 1 << IRQ_BASIC_GPIO) +#define SPEAR3XX_WKUP_SRCS (1 << SPEAR3XX_IRQ_MAC_1 | 1 << \ + SPEAR3XX_IRQ_USB_DEV | 1 << SPEAR3XX_IRQ_BASIC_RTC | 1 << \ + SPEAR3XX_IRQ_BASIC_GPIO)/* Add spear3xx machines common devices here */ /* gpio device registration */ static struct pl061_platform_data gpio_plat_data = { .gpio_base =0 , - .irq_base =SPEAR_GPIO_INT_BASE , + .irq_base =SPEAR3XX_GPIO_INT_BASE , };struct amba_device gpio_device = {
@@ -41,7 +42,7 @@ struct amba_device gpio_device = { .end = SPEAR3XX_ICM3_GPIO_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, - .irq = {IRQ_BASIC_GPIO, NO_IRQ}, + .irq = {SPEAR3XX_IRQ_BASIC_GPIO, NO_IRQ}, };/* ssp device registration */
@@ -71,7 +72,7 @@ struct amba_device ssp0_device = { .end = SPEAR3XX_ICM1_SSP_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, - .irq = {IRQ_SSP, NO_IRQ}, + .irq = {SPEAR3XX_IRQ_SSP, NO_IRQ}, };/* uart device registration */
@@ -84,7 +85,7 @@ struct amba_device uart_device = { .end = SPEAR3XX_ICM1_UART_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, - .irq = {IRQ_UART, NO_IRQ}, + .irq = {SPEAR3XX_IRQ_UART, NO_IRQ}, };/* watchdog device registeration */
@@ -106,7 +107,7 @@ static struct resource i2c_resources[] = { .end = SPEAR3XX_ICM1_I2C_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, { - .start = IRQ_I2C, + .start = SPEAR3XX_IRQ_I2C, .flags = IORESOURCE_IRQ, }, };
@@ -129,7 +130,7 @@ static struct resource ehci_resources[] = { .flags = IORESOURCE_MEM, }, [1] = { - .start = IRQ_USB_H_EHCI_0, + .start = SPEAR3XX_IRQ_USB_H_EHCI_0, .flags = IORESOURCE_IRQ, }, };
@@ -141,7 +142,7 @@ static struct resource ohci0_resources[] = { .flags = IORESOURCE_MEM, }, [1] = { - .start = IRQ_USB_H_OHCI_0, + .start = SPEAR3XX_IRQ_USB_H_OHCI_0, .flags = IORESOURCE_IRQ, }, };
@@ -153,7 +154,7 @@ static struct resource ohci1_resources[] = { .flags = IORESOURCE_MEM, }, [1] = { - .start = IRQ_USB_H_OHCI_1, + .start = SPEAR3XX_IRQ_USB_H_OHCI_1, .flags = IORESOURCE_IRQ, }, };
@@ -208,7 +209,7 @@ static struct resource rtc_resources[] = { .end = SPEAR3XX_ICM3_RTC_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, { - .start = IRQ_BASIC_RTC, + .start = SPEAR3XX_IRQ_BASIC_RTC, .flags = IORESOURCE_IRQ, }, };
Signature · 1 line
1.7.2.2