sunxi: Bug fixes, sun4i and sun5i support, pmic support and network improvements
Subsystems (6)
v2 cover sunxi: Bug fixes, sun4i and sun5i support, pmic support and network improvements
Hi All,
Here is v2 of my patch series to be applied on top of Ian's recently merged basic sun7i support.
This patch series begins with a few bug fixes found while working on preparing the rest of the series, adds sun4i and sun5i support, pmic support (which is necessary to clock the CPU at its max speed), and rounds things of with some networking fixes / additions.
Changes since v1:
-Improved various commit messages
-Various small typo fixes
-Cleaned up the axp209 and axp152 drivers
Regards,
Hans
PATCH v2 1/12 sunxi: mksunxiboot: Fix loading of files with a size which is not a multiple of 4
We should not be aligning the amount of bytes which we try to read from the disk, this leads to trying to read more bytes then there are which fails.
file_size is already aligned to BLOCK_SIZE before being stored in img.header.length, so there is no need for load_size at all.
--- tools/mksunxiboot.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
tools/mksunxiboot.c +4 -6
@@ -77,7 +77,7 @@ int main(int argc, char *argv[]) {int fd_in, fd_out;struct boot_img img; -unsigned file_size, load_size; +unsigned file_size;int count;if (argc <2 ) {
@@ -101,8 +101,6 @@ int main(int argc, char *argv[])if (file_size >SRAM_LOAD_MAX_SIZE ) {fprintf (stderr,"ERROR: File too large!\n" );return EXIT_FAILURE ; - }else { - load_size =ALIGN (file_size,sizeof (int )); } fd_out =open (argv[2 ],O_WRONLY |O_CREAT ,0666 );
@@ -113,8 +111,8 @@ int main(int argc, char *argv[])/* read file to buffer to calculate checksum */ lseek (fd_in,0 ,SEEK_SET ); - count =read (fd_in, img.code, load_size); -if (count != load_size) { + count =read (fd_in, img.code, file_size); +if (count != file_size) {perror ("Reading input image" );return EXIT_FAILURE ; }
@@ -126,7 +124,7 @@ int main(int argc, char *argv[]) & 0x00FFFFFF);memcpy (img.header.magic,BOOT0_MAGIC ,8 );/* no '0' termination */ img.header.length = -ALIGN (load_size +sizeof (struct boot_file_head ),BLOCK_SIZE ); +ALIGN (file_size +sizeof (struct boot_file_head ),BLOCK_SIZE );gen_check_sum (&img.header); count =write (fd_out, &img, img.header.length);
Signature · 1 line
1.9.0
PATCH v2 2/12 sunxi: Fix u-boot-spl.lds to refer to .vectors
In reply to Hans de GoedeAdjust the u-boot-spl.lds linker script to match the changes made in the 41623c91b09a0c865fab41acdaff30f060f29ad6 "arm: move exception handling out of start.S files" commit.
--- arch/arm/cpu/armv7/sunxi/u-boot-spl.lds | 1 + 1 file changed, 1 insertion(+)
arch/arm/cpu/armv7/sunxi/u-boot-spl.lds +1 -0
@@ -27,6 +27,7 @@ SECTIONS .text : { __start = .; + *(.vectors) arch/arm/cpu/armv7/start.o (.text) *(.text*) } > .sram
Signature · 1 line
1.9.0
PATCH v2 3/12 sunxi: Remove mmc DMA support
In reply to Hans de GoedeThe DMA code in sunxi_mmc.c is broken. mmc_trans_data_by_dma() allocates the dma descriptors on the stack, and then exits while the dma transfer is in progress, so the dma engine is reading stack memory which at that point may be re-used. So far we've gotten away with this by luck, but recent u-boot changes have shifted the stack start address by 16 bytes, which combined with dma alignment now exposes this problem.
Since we end up just busy waiting for the dma engine anyway, this commit fixes things by simply removing the dma code, resulting in smaller bug-free code.
--- drivers/mmc/sunxi_mmc.c | 140 ++--------------------------------------- include/configs/sunxi-common.h | 1 - 2 files changed, 6 insertions(+), 135 deletions(-)
drivers/mmc/sunxi_mmc.c +6 -134
@@ -16,28 +16,6 @@#include <asm/arch/cpu.h> #include <asm/arch/mmc.h> -struct sunxi_mmc_des { -u32 reserved1_1:1 ; -u32 dic:1 ;/* disable interrupt on completion */ -u32 last_des:1 ;/* 1-this data buffer is the last buffer */ -u32 first_des:1 ;/* 1-data buffer is the first buffer, -0-data buffer contained in the next -descriptor is 1st buffer */ -u32 des_chain:1 ;/* 1-the 2nd address in the descriptor is the -next descriptor address */ -u32 end_of_ring:1 ;/* 1-last descriptor flag when using dual -data buffer in descriptor */ -u32 reserved1_2:24 ; -u32 card_err_sum:1 ;/* transfer error flag */ -u32 own:1 ;/* des owner:1-idma owns it, 0-host owns it */ -#define SDXC_DES_NUM_SHIFT 16 -#define SDXC_DES_BUFFER_MAX_LEN (1 << SDXC_DES_NUM_SHIFT) -u32 data_buf1_sz:16 ; -u32 data_buf2_sz:16 ; -u32 buf_addr_ptr1; -u32 buf_addr_ptr2; -}; -struct sunxi_mmc_host {unsigned mmc_no;uint32_t *mclkreg;
@@ -189,6 +167,9 @@ static int mmc_core_init(struct mmc *mmc)/* Reset controller */ writel (SUNXI_MMC_GCTRL_RESET , &mmchost->reg->gctrl); +udelay (1000 ); +/* Always read / write data through the CPU */ +writel (SUNXI_MMC_GCTRL_ACCESS_BY_AHB , &mmchost->reg->gctrl);return 0 ; }
@@ -220,85 +201,6 @@ static int mmc_trans_data_by_cpu(struct mmc *mmc, struct mmc_data *data)return 0 ; } -static int mmc_trans_data_by_dma (struct mmc *mmc,struct mmc_data *data) -{ -struct sunxi_mmc_host *mmchost = mmc->priv; -unsigned byte_cnt = data->blocksize * data->blocks; -unsigned char *buff; -unsigned des_idx =0 ; -unsigned buff_frag_num = - (byte_cnt +SDXC_DES_BUFFER_MAX_LEN -1 ) >>SDXC_DES_NUM_SHIFT ; -unsigned remain; -unsigned i, rval; - ALLOC_CACHE_ALIGN_BUFFER(struct sunxi_mmc_des, pdes, buff_frag_num); - - buff = data->flags &MMC_DATA_READ ? - (unsigned char *)data->dest : (unsigned char *)data->src; - remain = byte_cnt & (SDXC_DES_BUFFER_MAX_LEN -1 ); - -flush_cache ((unsigned long )buff, (unsigned long )byte_cnt); -for (i =0 ; i < buff_frag_num; i++, des_idx++) { -memset ((void *)&pdes[des_idx],0 ,sizeof (struct sunxi_mmc_des )); - pdes[des_idx].des_chain =1 ; - pdes[des_idx].own =1 ; - pdes[des_idx].dic =1 ; -if (buff_frag_num >1 && i != buff_frag_num -1 ) - pdes[des_idx].data_buf1_sz =0 ;/* 0 == max_len */ -else - pdes[des_idx].data_buf1_sz = remain; - - pdes[des_idx].buf_addr_ptr1 = - (u32 ) buff + i *SDXC_DES_BUFFER_MAX_LEN ; -if (i ==0 ) - pdes[des_idx].first_des =1 ; - -if (i == buff_frag_num -1 ) { - pdes[des_idx].dic =0 ; - pdes[des_idx].last_des =1 ; - pdes[des_idx].end_of_ring =1 ; - pdes[des_idx].buf_addr_ptr2 =0 ; - }else { - pdes[des_idx].buf_addr_ptr2 = (u32)&pdes[des_idx +1 ]; - } - } -flush_cache ((unsigned long )pdes, -sizeof (struct sunxi_mmc_des ) * (des_idx +1 )); - - rval =readl (&mmchost->reg->gctrl); -/* Enable DMA */ -writel (rval |SUNXI_MMC_GCTRL_DMA_RESET |SUNXI_MMC_GCTRL_DMA_ENABLE , - &mmchost->reg->gctrl); -/* Reset iDMA */ -writel (SUNXI_MMC_IDMAC_RESET , &mmchost->reg->dmac); -/* Enable iDMA */ -writel (SUNXI_MMC_IDMAC_FIXBURST |SUNXI_MMC_IDMAC_ENABLE , - &mmchost->reg->dmac); - rval =readl (&mmchost->reg->idie) & - ~(SUNXI_MMC_IDIE_TXIRQ |SUNXI_MMC_IDIE_RXIRQ ); -if (data->flags &MMC_DATA_WRITE ) - rval |=SUNXI_MMC_IDIE_TXIRQ ; -else - rval |=SUNXI_MMC_IDIE_RXIRQ ; -writel (rval, &mmchost->reg->idie); -writel ((u32 ) pdes, &mmchost->reg->dlba); -writel ((0x2 <<28 ) | (0x7 <<16 ) | (0x01 <<3 ), - &mmchost->reg->ftrglevel); - -return 0 ; -} - -static void mmc_enable_dma_accesses (struct mmc *mmc,int dma) -{ -struct sunxi_mmc_host *mmchost = mmc->priv; - -unsigned int gctrl =readl (&mmchost->reg->gctrl); -if (dma) - gctrl &= ~SUNXI_MMC_GCTRL_ACCESS_BY_AHB ; -else - gctrl |=SUNXI_MMC_GCTRL_ACCESS_BY_AHB ; -writel (gctrl, &mmchost->reg->gctrl); -} -static int mmc_rint_wait (struct mmc *mmc,unsigned int timeout_msecs,unsigned int done_bit,const char *what) {
@@ -327,7 +229,6 @@ static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,unsigned int timeout_msecs;int error =0 ;unsigned int status =0 ; -unsigned int usedma =0 ;unsigned int bytecnt =0 ;if (mmchost->fatal_err)
@@ -378,20 +279,8 @@ static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, bytecnt = data->blocksize * data->blocks;debug ("trans data %d bytes\n" , bytecnt); -#if defined(CONFIG_MMC_SUNXI_USE_DMA ) && !defined(CONFIG_SPL_BUILD ) -if (bytecnt >64 ) { -#else -if (0 ) { -#endif - usedma =1 ; -mmc_enable_dma_accesses (mmc,1 ); - ret =mmc_trans_data_by_dma (mmc, data); -writel (cmdval | cmd->cmdidx, &mmchost->reg->cmd); - }else { -mmc_enable_dma_accesses (mmc,0 ); -writel (cmdval | cmd->cmdidx, &mmchost->reg->cmd); - ret =mmc_trans_data_by_cpu (mmc, data); - } +writel (cmdval | cmd->cmdidx, &mmchost->reg->cmd); + ret =mmc_trans_data_by_cpu (mmc, data);if (ret) { error =readl (&mmchost->reg->rint) & \SUNXI_MMC_RINT_INTERRUPT_ERROR_BIT ;
@@ -405,7 +294,7 @@ static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, goto out;if (data) { - timeout_msecs = usedma ?120 * bytecnt :120 ; + timeout_msecs =120 ;debug ("cacl timeout %x msec\n" , timeout_msecs); error = mmc_rint_wait(mmc, timeout_msecs, data->blocks > 1 ?
@@ -442,23 +331,6 @@ static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,debug ("mmc resp 0x%08x\n" , cmd->response[0 ]); } out: -if (data && usedma) { -/* IDMASTAREG -* IDST[0] : idma tx int -* IDST[1] : idma rx int -* IDST[2] : idma fatal bus error -* IDST[4] : idma descriptor invalid -* IDST[5] : idma error summary -* IDST[8] : idma normal interrupt sumary -* IDST[9] : idma abnormal interrupt sumary -*/ - status =readl (&mmchost->reg->idst); -writel (status, &mmchost->reg->idst); -writel (0 , &mmchost->reg->idie); -writel (0 , &mmchost->reg->dmac); -writel (readl (&mmchost->reg->gctrl) & ~SUNXI_MMC_GCTRL_DMA_ENABLE , - &mmchost->reg->gctrl); - }if (error <0 ) {writel (SUNXI_MMC_GCTRL_RESET , &mmchost->reg->gctrl);mmc_update_clk (mmc);
include/configs/sunxi-common.h +0 -1
@@ -70,7 +70,6 @@#define CONFIG_CMD_MMC #define CONFIG_MMC_SUNXI #define CONFIG_MMC_SUNXI_SLOT 0 -#define CONFIG_MMC_SUNXI_USE_DMA #define CONFIG_ENV_IS_IN_MMC #define CONFIG_SYS_MMC_ENV_DEV 0/* first detected MMC controller */
Signature · 1 line
1.9.0
PATCH v2 4/12 sunxi: Implement reset_cpu
In reply to Hans de GoedeThere is no way to reset the cpu, so use the watchdog for this.
--- arch/arm/cpu/armv7/sunxi/board.c | 7 +++++++ arch/arm/include/asm/arch-sunxi/timer.h | 5 +++++ 2 files changed, 12 insertions(+)
arch/arm/cpu/armv7/sunxi/board.c +7 -0
@@ -56,6 +56,13 @@ int gpio_init(void)void reset_cpu (ulong addr) { +static const struct sunxi_wdog *wdog = + &((struct sunxi_timer_reg *)SUNXI_TIMER_BASE )->wdog; + +/* Set the watchdog for its shortest interval (.5s) and wait */ +writel (WDT_MODE_RESET_EN |WDT_MODE_EN , &wdog->mode); +writel (WDT_CTRL_KEY |WDT_CTRL_RESTART , &wdog->ctl); +while (1 ); }/* do some early init */
arch/arm/include/asm/arch-sunxi/timer.h +5 -0
@@ -11,6 +11,11 @@#ifndef _SUNXI_TIMER_H_#define _SUNXI_TIMER_H_ +#define WDT_CTRL_RESTART (0x1 << 0) +#define WDT_CTRL_KEY (0x0a57 << 1) +#define WDT_MODE_EN (0x1 << 0) +#define WDT_MODE_RESET_EN (0x1 << 1) +#ifndef __ASSEMBLY__#include <linux/types.h>
Signature · 1 line
1.9.0
PATCH v2 5/12 sunxi: Add sun4i support
In reply to Hans de GoedeAdd support for the Allwinner A10 SoC also known as the Allwinner sun4i family, and add the Cubieboard board which uses the A10 SoC.
Compared to sun7 only the DRAM controller is a bit different:
-Controller reset bits are inverted, but only for Rev. A -Different hpcr values
-No MBUS on sun4i
-Various other initialization changes
--- arch/arm/cpu/armv7/sunxi/Makefile | 2 + arch/arm/cpu/armv7/sunxi/cpu_info.c | 7 ++++ arch/arm/cpu/armv7/sunxi/dram.c | 81 +++++++++++++++++++++++++++++++++++-- board/sunxi/Makefile | 1 + board/sunxi/dram_cubieboard.c | 31 ++++++++++++++ boards.cfg | 1 + include/configs/sun4i.h | 23 +++++++++++ 7 files changed, 143 insertions(+), 3 deletions(-) create mode 100644 board/sunxi/dram_cubieboard.c create mode 100644 include/configs/sun4i.h
arch/arm/cpu/armv7/sunxi/Makefile +2 -0
@@ -11,6 +11,7 @@ obj-y += timer.o obj-y += board.o obj-y += clock.o obj-y += pinmux.o +obj-$(CONFIG_SUN4I) += clock_sun4i.o obj-$(CONFIG_SUN7I) += clock_sun4i.o ifndef CONFIG_SPL_BUILD
@@ -18,6 +19,7 @@ obj-y += cpu_info.o endif ifdef CONFIG_SPL_BUILD +obj-$(CONFIG_SUN4I) += dram.o obj-$(CONFIG_SUN7I) += dram.o ifdef CONFIG_SPL_FEL obj-y += start.o
arch/arm/cpu/armv7/sunxi/cpu_info.c +7 -0
@@ -13,7 +13,14 @@#ifdef CONFIG_DISPLAY_CPUINFO int print_cpuinfo (void ) { +#ifdef CONFIG_SUN4I +puts ("CPU: Allwinner A10 (SUN4I)\n" ); +#elif definedCONFIG_SUN7I puts ("CPU: Allwinner A20 (SUN7I)\n" ); +#else +#warning Please update cpu_info.c with correct CPU information +puts ("CPU: SUNXI Family\n" ); +#endif return 0 ; }#endif
arch/arm/cpu/armv7/sunxi/dram.c +78 -3
151 lines not on this page · raw message
board/sunxi/Makefile +1 -0
@@ -10,4 +10,5 @@ # obj-y += board.o obj-$(CONFIG_SUNXI_GMAC) += gmac.o +obj-$(CONFIG_CUBIEBOARD) += dram_cubieboard.o obj-$(CONFIG_CUBIETRUCK) += dram_cubietruck.o
board/sunxi/dram_cubieboard.c new file +31 -0
@@ -0,0 +1,31 @@ +/* this file is generated, don't edit it yourself */ + +#include <common.h> +#include <asm/arch/dram.h> + +static struct dram_para dram_para = { + .clock =480 , + .type =3 , + .rank_num =1 , + .density =4096 , + .io_width =16 , + .bus_width =32 , + .cas =6 , + .zq =123 , + .odt_en =0 , + .size =1024 , + .tpr0 =0x30926692 , + .tpr1 =0x1090 , + .tpr2 =0x1a0c8 , + .tpr3 =0 , + .tpr4 =0 , + .tpr5 =0 , + .emr1 =0 , + .emr2 =0 , + .emr3 =0 , +}; + +unsigned long sunxi_dram_init (void ) +{ +return dramc_init (&dram_para); +}
boards.cfg +1 -0
@@ -381,6 +381,7 @@ Active arm armv7 rmobile renesas lager Active arm armv7 s5pc1xx samsung goni s5p_goni - Przemyslaw Marczak <[email protected]> Active arm armv7 s5pc1xx samsung smdkc100 smdkc100 - Minkyu Kang <[email protected]> Active arm armv7 socfpga altera socfpga socfpga_cyclone5 - - +Active arm armv7 sunxi - sunxi Cubieboard sun4i:CUBIEBOARD,SPL Hans de Goede <[email protected]> Active arm armv7 sunxi - sunxi Cubietruck sun7i:CUBIETRUCK,SPL,SUNXI_GMAC,RGMII - Active arm armv7 sunxi - sunxi Cubietruck_FEL sun7i:CUBIETRUCK,SPL_FEL,SUNXI_GMAC,RGMII - Active arm armv7 u8500 st-ericsson snowball snowball - Mathieu Poirier <[email protected]>
include/configs/sun4i.h new file +23 -0
@@ -0,0 +1,23 @@ +/* +* (C) Copyright 2012-2013 Henrik Nordstrom <[email protected]> +* +* Configuration settings for the Allwinner A10 (sun4i) CPU +* +* SPDX-License-Identifier: GPL-2.0+ +*/ +#ifndef __CONFIG_H +#define __CONFIG_H + +/* +* A10 specific configuration +*/ +#define CONFIG_SUN4I /* sun4i SoC generation */ + +#define CONFIG_SYS_PROMPT "sun4i# " + +/* +* Include common sunxi configuration where most the settings are +*/ +#include <configs/sunxi-common.h> + +#endif /* __CONFIG_H */
Signature · 1 line
1.9.0
PATCH v2 5/12 sunxi: Add sun4i support
Quoted 9 lines · Hans de Goede
Add support for the Allwinner A10 SoC also known as the Allwinner sun4i family, and add the Cubieboard board which uses the A10 SoC.
Compared to sun7 only the DRAM controller is a bit different:
(quoted diff) +0
-4-Controller reset bits are inverted, but only for Rev. A -Different hpcr values -No MBUS on sun4i -Various other initialization changes
Quoted 4 lines
Signed-off-by Henrik Nordstrom <[email protected]>Signed-off-by Stefan Roese <[email protected]>Signed-off-by Oliver Schinagl <[email protected]>Signed-off-by Hans de Goede <[email protected]>
PATCH v2 6/12 sunxi: Add sun5i support
In reply to Hans de GoedeAdd support for the Allwinner A13 and A10s SoCs also know as the Allwinner sun5i family, and the A13-OLinuXinoM A13 based and r7-tv-dongle A10s based boards.
The only differences compared to the already supported sun4i and sun7i families are all in the DRAM controller initialization:
-Different hcpr values
-Different MBUS settings
-Some other small initialization changes
--- arch/arm/cpu/armv7/sunxi/Makefile | 2 ++ arch/arm/cpu/armv7/sunxi/board.c | 12 ++++++++++++ arch/arm/cpu/armv7/sunxi/cpu_info.c | 8 ++++++++ arch/arm/cpu/armv7/sunxi/dram.c | 21 +++++++++++++++++++++ board/sunxi/Makefile | 2 ++ board/sunxi/dram_a13_oli_micro.c | 32 ++++++++++++++++++++++++++++++++ board/sunxi/dram_r7dongle.c | 31 +++++++++++++++++++++++++++++++ boards.cfg | 2 ++ include/configs/sun5i.h | 23 +++++++++++++++++++++++ include/configs/sunxi-common.h | 2 ++ 10 files changed, 135 insertions(+) create mode 100644 board/sunxi/dram_a13_oli_micro.c create mode 100644 board/sunxi/dram_r7dongle.c create mode 100644 include/configs/sun5i.h
arch/arm/cpu/armv7/sunxi/Makefile +2 -0
@@ -12,6 +12,7 @@ obj-y += board.o obj-y += clock.o obj-y += pinmux.o obj-$(CONFIG_SUN4I) += clock_sun4i.o +obj-$(CONFIG_SUN5I) += clock_sun4i.o obj-$(CONFIG_SUN7I) += clock_sun4i.o ifndef CONFIG_SPL_BUILD
@@ -20,6 +21,7 @@ endif ifdef CONFIG_SPL_BUILD obj-$(CONFIG_SUN4I) += dram.o +obj-$(CONFIG_SUN5I) += dram.o obj-$(CONFIG_SUN7I) += dram.o ifdef CONFIG_SPL_FEL obj-y += start.o
arch/arm/cpu/armv7/sunxi/board.c +12 -0
@@ -47,9 +47,21 @@ u32 spl_boot_mode(void)int gpio_init (void ) { +#if CONFIG_CONS_INDEX ==1 && (defined(CONFIG_SUN4I ) || defined(CONFIG_SUN7I ))sunxi_gpio_set_cfgpin (SUNXI_GPB (22 ),SUN4I_GPB22_UART0_TX );sunxi_gpio_set_cfgpin (SUNXI_GPB (23 ),SUN4I_GPB23_UART0_RX );sunxi_gpio_set_pull (SUNXI_GPB (23 ),1 ); +#elif CONFIG_CONS_INDEX ==1 && defined(CONFIG_SUN5I ) +sunxi_gpio_set_cfgpin (SUNXI_GPB (19 ),SUN5I_GPB19_UART0_TX ); +sunxi_gpio_set_cfgpin (SUNXI_GPB (20 ),SUN5I_GPB20_UART0_RX ); +sunxi_gpio_set_pull (SUNXI_GPB (20 ),1 ); +#elif CONFIG_CONS_INDEX ==2 && defined(CONFIG_SUN5I ) +sunxi_gpio_set_cfgpin (SUNXI_GPG (3 ),SUN5I_GPG3_UART1_TX ); +sunxi_gpio_set_cfgpin (SUNXI_GPG (4 ),SUN5I_GPG4_UART1_RX ); +sunxi_gpio_set_pull (SUNXI_GPG (4 ),1 ); +#else +#error Unsupported console port number. Please fix pin mux settings in board.c +#endif return 0 ; }
arch/arm/cpu/armv7/sunxi/cpu_info.c +8 -0
@@ -15,6 +15,14 @@ int print_cpuinfo(void) {#ifdef CONFIG_SUN4I puts ("CPU: Allwinner A10 (SUN4I)\n" ); +#elif definedCONFIG_SUN5I +u32 val =readl (SUNXI_SID_BASE +0x08 ); +switch ((val >>12 ) &0xf ) { +case 0 :puts ("CPU: Allwinner A12 (SUN5I)\n" );break ; +case 3 :puts ("CPU: Allwinner A13 (SUN5I)\n" );break ; +case 7 :puts ("CPU: Allwinner A10s (SUN5I)\n" );break ; +default :puts ("CPU: Allwinner A1X (SUN5I)\n" ); + }#elif definedCONFIG_SUN7I puts ("CPU: Allwinner A20 (SUN7I)\n" );#else
arch/arm/cpu/armv7/sunxi/dram.c +21 -0
@@ -155,6 +155,16 @@ static void mctl_enable_dllx(u32 phase) } static u32 hpcr_value[32] = { +#ifdef CONFIG_SUN5I +0 ,0 ,0 ,0 , +0 ,0 ,0 ,0 , +0 ,0 ,0 ,0 , +0 ,0 ,0 ,0 , +0x1031 ,0x1031 ,0x0735 ,0x1035 , +0x1035 ,0x0731 ,0x1031 ,0 , +0x0301 ,0x0301 ,0x0301 ,0x0301 , + 0x0301, 0x0301, 0x0301, 0 +#endif #ifdef CONFIG_SUN4I0x0301 ,0x0301 ,0x0301 ,0x0301 , 0x0301, 0x0301, 0, 0,
@@ -257,9 +267,15 @@ static void mctl_setup_dram_clock(u32 clk)#if defined(CONFIG_SUN5I ) || defined(CONFIG_SUN7I )/* setup MBUS clock */ reg_val = CCM_MBUS_CTRL_GATE | +#ifdef CONFIG_SUN7I CCM_MBUS_CTRL_CLK_SRC (CCM_MBUS_CTRL_CLK_SRC_PLL6 ) |CCM_MBUS_CTRL_N (CCM_MBUS_CTRL_N_X (2 )) |CCM_MBUS_CTRL_M (CCM_MBUS_CTRL_M_X (2 )); +#else /* defined(CONFIG_SUN5I) */ +CCM_MBUS_CTRL_CLK_SRC (CCM_MBUS_CTRL_CLK_SRC_PLL5 ) | +CCM_MBUS_CTRL_N (CCM_MBUS_CTRL_N_X (1 )) | +CCM_MBUS_CTRL_M (CCM_MBUS_CTRL_M_X (2 )); +#endif writel (reg_val, &ccm->mbus_clk_cfg);#endif
@@ -468,6 +484,11 @@ unsigned long dramc_init(struct dram_para *para)/* setup DRAM relative clock */ mctl_setup_dram_clock (para->clock); +#ifdef CONFIG_SUN5I +/* Disable any pad power save control */ +writel (0 , &dram->ppwrsctl); +#endif +/* reset external DRAM */ #ifndef CONFIG_SUN7I mctl_ddr3_reset ();
board/sunxi/Makefile +2 -0
@@ -10,5 +10,7 @@ # obj-y += board.o obj-$(CONFIG_SUNXI_GMAC) += gmac.o +obj-$(CONFIG_A13_OLINUXINOM) += dram_a13_oli_micro.o obj-$(CONFIG_CUBIEBOARD) += dram_cubieboard.o obj-$(CONFIG_CUBIETRUCK) += dram_cubietruck.o +obj-$(CONFIG_R7DONGLE) += dram_r7dongle.o
board/sunxi/dram_a13_oli_micro.c new file +32 -0
@@ -0,0 +1,32 @@ +/* this file is generated, don't edit it yourself */ + +#include <common.h> +#include <asm/arch/dram.h> + +static struct dram_para dram_para = { + .clock =408 , + .type =3 , + .rank_num =1 , + .density =2048 , + .io_width =16 , + .bus_width =16 , + .cas =9 , + .zq =123 , + .odt_en =0 , + .size =256 , + .tpr0 =0x42d899b7 , + .tpr1 =0xa090 , + .tpr2 =0x22a00 , + .tpr3 =0 , + .tpr4 =0 , + .tpr5 =0 , + .emr1 =0 , + .emr2 =0x10 , + .emr3 =0 , + +}; + +unsigned long sunxi_dram_init (void ) +{ +return dramc_init (&dram_para); +}
board/sunxi/dram_r7dongle.c new file +31 -0
@@ -0,0 +1,31 @@ +/* this file is generated, don't edit it yourself */ + +#include <common.h> +#include <asm/arch/dram.h> + +static struct dram_para dram_para = { + .clock =384 , + .type =3 , + .rank_num =1 , + .density =2048 , + .io_width =8 , + .bus_width =32 , + .cas =9 , + .zq =123 , + .odt_en =0 , + .size =1024 , + .tpr0 =0x42d899b7 , + .tpr1 =0xa090 , + .tpr2 =0x22a00 , + .tpr3 =0 , + .tpr4 =0 , + .tpr5 =0 , + .emr1 =0x04 , + .emr2 =0x10 , + .emr3 =0 , +}; + +unsigned long sunxi_dram_init (void ) +{ +return dramc_init (&dram_para); +}
boards.cfg +2 -0
@@ -381,9 +381,11 @@ Active arm armv7 rmobile renesas lager Active arm armv7 s5pc1xx samsung goni s5p_goni - Przemyslaw Marczak <[email protected]> Active arm armv7 s5pc1xx samsung smdkc100 smdkc100 - Minkyu Kang <[email protected]> Active arm armv7 socfpga altera socfpga socfpga_cyclone5 - - +Active arm armv7 sunxi - sunxi A13-OLinuXinoM sun5i:A13_OLINUXINOM,SPL,CONS_INDEX=2 Hans de Goede <[email protected]> Active arm armv7 sunxi - sunxi Cubieboard sun4i:CUBIEBOARD,SPL Hans de Goede <[email protected]> Active arm armv7 sunxi - sunxi Cubietruck sun7i:CUBIETRUCK,SPL,SUNXI_GMAC,RGMII - Active arm armv7 sunxi - sunxi Cubietruck_FEL sun7i:CUBIETRUCK,SPL_FEL,SUNXI_GMAC,RGMII - +Active arm armv7 sunxi - sunxi r7-tv-dongle sun5i:R7DONGLE,SPL Hans de Goede <[email protected]> Active arm armv7 u8500 st-ericsson snowball snowball - Mathieu Poirier <[email protected]> Active arm armv7 u8500 st-ericsson u8500 u8500_href - - Active arm armv7 vf610 freescale vf610twr vf610twr vf610twr:IMX_CONFIG=board/freescale/vf610twr/imximage.cfg Alison Wang <[email protected]>
include/configs/sun5i.h new file +23 -0
@@ -0,0 +1,23 @@ +/* +* (C) Copyright 2012-2013 Henrik Nordstrom <[email protected]> +* +* Configuration settings for the Allwinner A13 (sun5i) CPU +* +* SPDX-License-Identifier: GPL-2.0+ +*/ +#ifndef __CONFIG_H +#define __CONFIG_H + +/* +* High Level Configuration Options +*/ +#define CONFIG_SUN5I /* sun5i SoC generation */ + +#define CONFIG_SYS_PROMPT "sun5i# " + +/* +* Include common sunxi configuration where most the settings are +*/ +#include <configs/sunxi-common.h> + +#endif /* __CONFIG_H */
include/configs/sunxi-common.h +2 -0
@@ -161,7 +161,9 @@#undef CONFIG_CMD_NET#undef CONFIG_CMD_NFS +#ifndef CONFIG_CONS_INDEX #define CONFIG_CONS_INDEX 1/* UART0 */ +#endif #ifdef CONFIG_SUNXI_GMAC #define CONFIG_DESIGNWARE_ETH /* GMAC can use designware driver */
Signature · 1 line
1.9.0
PATCH v2 6/12 sunxi: Add sun5i support
Quoted 11 lines · Hans de Goede
Add support for the Allwinner A13 and A10s SoCs also know as the Allwinner sun5i family, and the A13-OLinuXinoM A13 based and r7-tv-dongle A10s based boards.
The only differences compared to the already supported sun4i and sun7i families are all in the DRAM controller initialization:
(quoted diff) +0
-3-Different hcpr values -Different MBUS settings -Some other small initialization changes
Quoted 4 lines
Signed-off-by Henrik Nordstrom <[email protected]>Signed-off-by Stefan Roese <[email protected]>Signed-off-by Oliver Schinagl <[email protected]>Signed-off-by Hans de Goede <[email protected]>
PATCH v2 7/12 sunxi: Add i2c support
In reply to Hans de GoedeAdd support for the i2c controller found on all Allwinner sunxi SoCs, this is the same controller as found on the Marvell orion5x and kirkwood SoC families, with a slightly different register layout, so this patch uses the existing mvtwsi code.
--- arch/arm/cpu/armv7/sunxi/board.c | 6 ++++++ arch/arm/include/asm/arch-sunxi/i2c.h | 15 +++++++++++++++ board/sunxi/board.c | 7 +++++++ drivers/i2c/Makefile | 1 + drivers/i2c/mvtwsi.c | 18 ++++++++++++++++++ include/configs/sunxi-common.h | 9 +++++++++ 6 files changed, 56 insertions(+) create mode 100644 arch/arm/include/asm/arch-sunxi/i2c.h
arch/arm/cpu/armv7/sunxi/board.c +6 -0
@@ -11,6 +11,7 @@*/ #include <common.h> +#include <i2c.h> #include <netdev.h> #include <miiphy.h> #include <serial.h>
@@ -91,11 +92,16 @@ void s_init(void)clock_init ();timer_init ();gpio_init (); +i2c_init_board ();#ifdef CONFIG_SPL_BUILD gd = &gdata;preloader_console_init (); +#ifdef CONFIG_SPL_I2C_SUPPORT +/* Needed early by sunxi_board_init if PMU is enabled */ +i2c_init (CONFIG_SYS_I2C_SPEED ,CONFIG_SYS_I2C_SLAVE ); +#endif sunxi_board_init ();#endif }
arch/arm/include/asm/arch-sunxi/i2c.h new file +15 -0
@@ -0,0 +1,15 @@ +/* +* Copyright 2014 - Hans de Goede <[email protected]> +* +* SPDX-License-Identifier: GPL-2.0+ +*/ +#ifndef _SUNXI_I2C_H_ +#define _SUNXI_I2C_H_ + +#include <asm/arch/cpu.h> + +#define CONFIG_I2C_MVTWSI_BASE SUNXI_TWI0_BASE +/* This is abp0-clk on sun4i/5i/7i / abp1-clk on sun6i/sun8i which is 24MHz */ +#define CONFIG_SYS_TCLK 24000000 + +#endif
board/sunxi/board.c +7 -0
@@ -106,6 +106,13 @@ int board_mmc_init(bd_t *bis) }#endif +void i2c_init_board (void ) +{ +sunxi_gpio_set_cfgpin (SUNXI_GPB (0 ),SUNXI_GPB0_TWI0 ); +sunxi_gpio_set_cfgpin (SUNXI_GPB (1 ),SUNXI_GPB0_TWI0 ); +clock_twi_onoff (0 ,1 ); +} +#ifdef CONFIG_SPL_BUILD void sunxi_board_init (void ) {
drivers/i2c/Makefile +1 -0
@@ -27,5 +27,6 @@ obj-$(CONFIG_SYS_I2C_RCAR) += rcar_i2c.o obj-$(CONFIG_SYS_I2C_S3C24X0) += s3c24x0_i2c.o obj-$(CONFIG_SYS_I2C_SH) += sh_i2c.o obj-$(CONFIG_SYS_I2C_SOFT) += soft_i2c.o +obj-$(CONFIG_SYS_I2C_SUNXI) += mvtwsi.o obj-$(CONFIG_SYS_I2C_TEGRA) += tegra_i2c.o obj-$(CONFIG_SYS_I2C_ZYNQ) += zynq_i2c.o
drivers/i2c/mvtwsi.c +18 -0
@@ -22,6 +22,8 @@#include <asm/arch/orion5x.h> #elif defined(CONFIG_KIRKWOOD )#include <asm/arch/kirkwood.h> +#elif defined(CONFIG_SUNXI ) +#include <asm/arch/i2c.h> #else #error Driver mvtwsi not supported by SoC or board#endif
@@ -30,6 +32,20 @@* TWSI register structure */ +#ifdef CONFIG_SUNXI + +struct mvtwsi_registers { + u32 slave_address; + u32 xtnd_slave_addr; + u32 data; + u32 control; + u32 status; + u32 baudrate; + u32 soft_reset; +}; + +#else + struct mvtwsi_registers { u32 slave_address; u32 data;
@@ -43,6 +59,8 @@ struct mvtwsi_registers { u32 soft_reset; }; +#endif +/* * Control register fields */
include/configs/sunxi-common.h +9 -0
@@ -161,6 +161,15 @@#undef CONFIG_CMD_NET#undef CONFIG_CMD_NFS +/* I2C */ +#define CONFIG_SPL_I2C_SUPPORT +/* No CONFIG_SYS_I2C as we use the non converted mvtwsi driver */ +#define CONFIG_HARD_I2C +#define CONFIG_SYS_I2C_SUNXI +#define CONFIG_SYS_I2C_SPEED 400000 +#define CONFIG_SYS_I2C_SLAVE 0x7f +#define CONFIG_CMD_I2C +#ifndef CONFIG_CONS_INDEX #define CONFIG_CONS_INDEX 1/* UART0 */ #endif
Signature · 1 line
1.9.0
PATCH v2 7/12 sunxi: Add i2c support
Hello Hans,
Am 03.06.2014 21:41, schrieb Hans de Goede:
Quoted 16 lines
Add support for the i2c controller found on all Allwinner sunxi SoCs, this is the same controller as found on the Marvell orion5x and kirkwood SoC families, with a slightly different register layout, so this patch uses the existing mvtwsi code.
Signed-off-by Hans de Goede<[email protected]>Acked-by Ian Campbell<[email protected]>--- arch/arm/cpu/armv7/sunxi/board.c | 6 ++++++ arch/arm/include/asm/arch-sunxi/i2c.h | 15 +++++++++++++++ board/sunxi/board.c | 7 +++++++ drivers/i2c/Makefile | 1 + drivers/i2c/mvtwsi.c | 18 ++++++++++++++++++ include/configs/sunxi-common.h | 9 +++++++++ 6 files changed, 56 insertions(+)create mode 100644
arch/arm/include/asm/arch-sunxi/i2c.h
[...]
include/configs/sunxi-common.h line 167
Quoted 12 lines
include/configs/sunxi-common.h +4
-0@@ -161,6 +161,15 @@#undef CONFIG_CMD_NET#undef CONFIG_CMD_NFS +/* I2C */ +#define CONFIG_SPL_I2C_SUPPORT +/* No CONFIG_SYS_I2C as we use the non converted mvtwsi driver */ +#define CONFIG_HARD_I2C
NACK. Goal is to get rid of HARD_I2C define ... please convert this driver to fit with CONFIG_SYS_I2C framework.
A fast look in this driver, this should not to be to hard, as this driver does not support multi busses...
A good example for porting a i2c driver with no multibus support is:
commit 0bdffe71fddeaa46768a39305797e4512dee0f15
Author: Heiko Schocher <[email protected]> Date: Fri Nov 8 07:30:53 2013 +0100
i2c, zynq: convert zynq i2c driver to new multibus/multiadapter framework
include/configs/sunxi-common.h line 175
Quoted 8 lines
include/configs/sunxi-common.h +5
-0+#define CONFIG_SYS_I2C_SUNXI +#define CONFIG_SYS_I2C_SPEED 400000 +#define CONFIG_SYS_I2C_SLAVE 0x7f +#define CONFIG_CMD_I2C +#ifndef CONFIG_CONS_INDEX #define CONFIG_CONS_INDEX 1/* UART0 */ #endif
bye,
Heiko
Signature · 2 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
PATCH v2 7/12 sunxi: Add i2c support
Hi,
Quoted 38 lines · Heiko Schocher
Hello Hans,
Am 03.06.2014 21:41, schrieb Hans de Goede:
Quoted 16 lines
Add support for the i2c controller found on all Allwinner sunxi SoCs, this is the same controller as found on the Marvell orion5x and kirkwood SoC families, with a slightly different register layout, so this patch uses the existing mvtwsi code.
Signed-off-by Hans de Goede<[email protected]>Acked-by Ian Campbell<[email protected]>--- arch/arm/cpu/armv7/sunxi/board.c | 6 ++++++ arch/arm/include/asm/arch-sunxi/i2c.h | 15 +++++++++++++++ board/sunxi/board.c | 7 +++++++ drivers/i2c/Makefile | 1 + drivers/i2c/mvtwsi.c | 18 ++++++++++++++++++ include/configs/sunxi-common.h | 9 +++++++++ 6 files changed, 56 insertions(+)create mode 100644
arch/arm/include/asm/arch-sunxi/i2c.h[...]
include/configs/sunxi-common.h line 167
Quoted 12 lines
include/configs/sunxi-common.h +4
-0@@ -161,6 +161,15 @@#undef CONFIG_CMD_NET#undef CONFIG_CMD_NFS +/* I2C */ +#define CONFIG_SPL_I2C_SUPPORT +/* No CONFIG_SYS_I2C as we use the non converted mvtwsi driver */ +#define CONFIG_HARD_I2C NACK. Goal is to get rid of
HARD_I2Cdefine ... please convert this driver to fit withCONFIG_SYS_I2Cframework.
A fast look in this driver, this should not to be to hard, as this driver does not support multi busses...
Quoted 7 lines
A good example for porting a i2c driver with no multibus support is:
commit
0bdffe71fddeaa46768a39305797e4512dee0f15Author: Heiko Schocher <[email protected]> Date: Fri Nov 8 07:30:53 2013 +0100i2c, zynq: convert zynq i2c driver to new multibus/multiadapter framework
Ok, one patch converting the mvtwsi driver to CONFIG_SYS_I2C coming up.
Note I've tested this on multiple sunxi boards / SoC generations, but I don't have any kirkwood or orion5x boards, so I cannot guarantee that this patch won't cause regressions there (I've compile tested the patch with kirkwood and orion5x board configs).
Regards,
Hans
PATCH v2 8/12 sunxi: Add axp209 pmic support
In reply to Hans de GoedeFrom: Henrik Nordstrom <[email protected]>
Add support for the x-powers axp209 pmic which is found on most A10, A13 and A20 boards.
And enable AXP209 support for the Cubietruck and Cubieboard boards.
While changing the boards.cfg lines for the Cubietruck, add Ian and me as board maintainers for the Cubietruck.
--- board/sunxi/board.c | 22 +++++ boards.cfg | 6 +- drivers/power/Makefile | 1 + drivers/power/axp209.c | 180 +++++++++++++++++++++++++++++++++++++++++ include/axp209.h | 15 ++++ include/configs/sun4i.h | 1 + include/configs/sun5i.h | 1 + include/configs/sun7i.h | 1 + include/configs/sunxi-common.h | 5 ++ 9 files changed, 229 insertions(+), 3 deletions(-) create mode 100644 drivers/power/axp209.c create mode 100644 include/axp209.h
board/sunxi/board.c +22 -0
@@ -12,6 +12,9 @@*/ #include <common.h> +#ifdef CONFIG_AXP209_POWER +#include <axp209.h> +#endif #include <asm/arch/clock.h> #include <asm/arch/dram.h> #include <asm/arch/gpio.h>
@@ -116,12 +119,31 @@ void i2c_init_board(void)#ifdef CONFIG_SPL_BUILD void sunxi_board_init (void ) { +int power_failed =0 ;unsigned long ramsize; +#ifdef CONFIG_AXP209_POWER + power_failed |=axp209_init (); + power_failed |=axp209_set_dcdc2 (1400 ); + power_failed |=axp209_set_dcdc3 (1250 ); + power_failed |=axp209_set_ldo2 (3000 ); + power_failed |=axp209_set_ldo3 (2800 ); + power_failed |=axp209_set_ldo4 (2800 ); +#endif +printf ("DRAM:" ); ramsize =sunxi_dram_init ();printf (" %lu MiB\n" , ramsize >>20 );if (!ramsize)hang (); + +/* +* Only clock up the CPU to full speed if we are reasonably +* assured it's being powered with suitable core voltage +*/ +if (!power_failed) +clock_set_pll1 (CONFIG_CLK_FULL_SPEED ); +else +printf ("Failed to set core voltage! Can't set CPU frequency\n" ); }#endif
boards.cfg +3 -3
@@ -382,9 +382,9 @@ Active arm armv7 s5pc1xx samsung goni Active arm armv7 s5pc1xx samsung smdkc100 smdkc100 - Minkyu Kang <[email protected]> Active arm armv7 socfpga altera socfpga socfpga_cyclone5 - - Active arm armv7 sunxi - sunxi A13-OLinuXinoM sun5i:A13_OLINUXINOM,SPL,CONS_INDEX=2 Hans de Goede <[email protected]> -Active arm armv7 sunxi - sunxi Cubieboard sun4i:CUBIEBOARD,SPL Hans de Goede <[email protected]> -Active arm armv7 sunxi - sunxi Cubietruck sun7i:CUBIETRUCK,SPL,SUNXI_GMAC,RGMII - -Active arm armv7 sunxi - sunxi Cubietruck_FEL sun7i:CUBIETRUCK,SPL_FEL,SUNXI_GMAC,RGMII - +Active arm armv7 sunxi - sunxi Cubieboard sun4i:CUBIEBOARD,SPL,AXP209_POWER Hans de Goede <[email protected]> +Active arm armv7 sunxi - sunxi Cubietruck sun7i:CUBIETRUCK,SPL,AXP209_POWER,SUNXI_GMAC,RGMII Ian Campbell <[email protected]>:Hans de Goede <[email protected]> +Active arm armv7 sunxi - sunxi Cubietruck_FEL sun7i:CUBIETRUCK,SPL_FEL,AXP209_POWER,SUNXI_GMAC,RGMII Ian Campbell <[email protected]>:Hans de Goede <[email protected]> Active arm armv7 sunxi - sunxi r7-tv-dongle sun5i:R7DONGLE,SPL Hans de Goede <[email protected]> Active arm armv7 u8500 st-ericsson snowball snowball - Mathieu Poirier <[email protected]> Active arm armv7 u8500 st-ericsson u8500 u8500_href - -
drivers/power/Makefile +1 -0
@@ -5,6 +5,7 @@ # SPDX-License-Identifier: GPL-2.0+ # +obj-$(CONFIG_AXP209_POWER) += axp209.o obj-$(CONFIG_EXYNOS_TMU) += exynos-tmu.o obj-$(CONFIG_FTPMU010_POWER) += ftpmu010.o obj-$(CONFIG_TPS6586X_POWER) += tps6586x.o
drivers/power/axp209.c new file +180 -0
180 lines not on this page · raw message
include/axp209.h new file +15 -0
@@ -0,0 +1,15 @@ +/* +* (C) Copyright 2012 Henrik Nordstrom <[email protected]> +* +* SPDX-License-Identifier: GPL-2.0+ +*/ + +extern int axp209_set_dcdc2 (int mvolt); +extern int axp209_set_dcdc3 (int mvolt); +extern int axp209_set_ldo2 (int mvolt); +extern int axp209_set_ldo3 (int mvolt); +extern int axp209_set_ldo4 (int mvolt); +extern void axp209_poweroff (void ); +extern int axp209_init (void ); +extern int axp209_poweron_by_dc (void ); +extern int axp209_power_button (void );
include/configs/sun4i.h +1 -0
@@ -12,6 +12,7 @@* A10 specific configuration */ #define CONFIG_SUN4I /* sun4i SoC generation */ +#define CONFIG_CLK_FULL_SPEED 1008000000#define CONFIG_SYS_PROMPT "sun4i# "
include/configs/sun5i.h +1 -0
@@ -12,6 +12,7 @@* High Level Configuration Options */ #define CONFIG_SUN5I /* sun5i SoC generation */ +#define CONFIG_CLK_FULL_SPEED 1008000000#define CONFIG_SYS_PROMPT "sun5i# "
include/configs/sun7i.h +1 -0
@@ -13,6 +13,7 @@* A20 specific configuration */ #define CONFIG_SUN7I /* sun7i SoC generation */ +#define CONFIG_CLK_FULL_SPEED 912000000#define CONFIG_SYS_PROMPT "sun7i# "
include/configs/sunxi-common.h +5 -0
@@ -170,6 +170,11 @@#define CONFIG_SYS_I2C_SLAVE 0x7f#define CONFIG_CMD_I2C +/* PMU */ +#if definedCONFIG_AXP152_POWER || definedCONFIG_AXP209_POWER || definedCONFIG_AXP221_POWER +#define CONFIG_SPL_POWER_SUPPORT +#endif +#ifndef CONFIG_CONS_INDEX #define CONFIG_CONS_INDEX 1/* UART0 */ #endif
Signature · 1 line
1.9.0
PATCH v2 8/12 sunxi: Add axp209 pmic support
drivers/power/axp209.c line 101
Quoted 6 lines · Hans de Goede
drivers/power/axp209.c new file +6
-0+int axp209_set_ldo3 (int mvolt) +{ +int cfg =axp209_mvolt_to_cfg (mvolt,700 ,2275 ,25 ); + +if (mvolt ==-1 ) + cfg =0x80 ;/* determined by LDO3IN pin */
Thus would seem more natural as
if (mvolt == -1) cfg = 0x80; /* comment... */ else cfg = axp209_mvolt_to_cfg(mvolt, 700, 2275, 25);
BTW, I've just noticed that cfg is often an int but axp209_write etc all deal in u8's. Do you not want to be dealing with u8's throughout?
drivers/power/axp209.c line 139
Quoted 13 lines
drivers/power/axp209.c new file +13
-0+void axp209_poweroff (void ) +{ +u8 val; + +if (axp209_read (AXP209_SHUTDOWN , &val) !=0 ) +return ; + + val |=AXP209_POWEROFF ; + +if (axp209_write (AXP209_SHUTDOWN , val) !=0 ) +return ; + +udelay (10000 );/* wait for power to drain */
Is this essentially a "wait to die" loop? i.e. we expect power to disappear while in the middle of it. In which case shouldn't it be infinite? What would happen if we were to return from this function? Nothing actually calls it AFAICT so maybe you can just punt on the whole thing and drop the function for now...
Ian.
PATCH v2 8/12 sunxi: Add axp209 pmic support
Hi,
Quoted 9 lines · Ian Campbell
drivers/power/axp209.c line 101
Quoted 6 lines · Hans de Goede
drivers/power/axp209.c new file +6
-0+int axp209_set_ldo3 (int mvolt) +{ +int cfg =axp209_mvolt_to_cfg (mvolt,700 ,2275 ,25 ); + +if (mvolt ==-1 ) + cfg =0x80 ;/* determined by LDO3IN pin */ Thus would seem more natural as
Quoted 5 lines
if (mvolt == -1) cfg = 0x80; /* comment... */ else cfg = axp209_mvolt_to_cfg(mvolt, 700, 2275, 25);
I Agree that that would be better, fixed in my tree:
https://github.com/jwrdegoede/u-boot-sunxi/commits/sunxi-upstreaming
Note I often rebase + force push this branch.
Quoted 2 lines
BTW, I've just noticed that cfg is often an int but
axp209_writeetc all deal in u8's. Do you not want to be dealing with u8's throughout?
Agreed that this should be u8 everywhere, fixed this for both the axp209 and axp152 code.
Note I won't be re-posting these until the i2c controller conversion to the CONFIG_SYS_I2C framework is sorted out.
Quoted 11 lines
Quoted 11 lines
drivers/power/axp209.c new file +11
-0+void axp209_poweroff (void ) +{ +u8 val; + +if (axp209_read (AXP209_SHUTDOWN , &val) !=0 ) +return ; + + val |=AXP209_POWEROFF ; + +if (axp209_write (AXP209_SHUTDOWN , val) !=0 ) +return ;
Quoted 8 lines
Review
Quoted 2 lines
(quoted diff) +2
-0+ + udelay(10000); /* wait for power to drain */Is this essentially a "wait to die" loop? i.e. we expect power to disappear while in the middle of it. In which case shouldn't it be infinite? What would happen if we were to return from this function? Nothing actually calls it AFAICT so maybe you can just punt on the whole thing and drop the function for now...
I agree that just dropping this function for now is best, done.
Regards,
Hans
PATCH v2 8/12 sunxi: Add axp209 pmic support
Quoted 3 lines · Hans de Goede
https://github.com/jwrdegoede/u-boot-sunxi/commits/sunxi-upstreaming
Note I often rebase + force push this branch.
I noticed ;-)
Quoted 2 lines
Note I won't be re-posting these until the i2c controller conversion to the
CONFIG_SYS_I2Cframework is sorted out.
No problem. Is that a big rework then?
How would you feel about reordering things a bit to push the i2c/power and sun[45]i stuff to the end, most of the rest looks more or less trivial/uncontroversial to me and could potentially be applied sooner rather than later (ulterior motive: this would unblock my AHCI patches ;-))
If you are ok with that in principal then I'm more than happy to do the leg work of git rebase -i.
Ian.
PATCH v2 8/12 sunxi: Add axp209 pmic support
Hi,
Quoted 11 lines · Ian Campbell
Quoted 3 lines · Hans de Goede
https://github.com/jwrdegoede/u-boot-sunxi/commits/sunxi-upstreaming
Note I often rebase + force push this branch.
I noticed ;-)
Quoted 2 lines
Note I won't be re-posting these until the i2c controller conversion to the
CONFIG_SYS_I2Cframework is sorted out.No problem. Is that a big rework then?
Not all that big, I'm working on it now, I hope to have it finished by the end of today.
Quoted 5 lines
How would you feel about reordering things a bit to push the i2c/power and sun[45]i stuff to the end, most of the rest looks more or less trivial/uncontroversial to me and could potentially be applied sooner rather than later (ulterior motive: this would unblock my AHCI patches ;-))
I agree, actually if you look in where your u-boot list mails go you will see a pull-req to Albert there for the entire set I've been working on minus the i2c + axp patches :)
Regards,
Hans
PATCH v2 8/12 sunxi: Add axp209 pmic support
Hi Hans,
Quoted 24 lines · Hans de Goede
Hi,
Quoted 11 lines · Ian Campbell
Quoted 3 lines · Hans de Goede
https://github.com/jwrdegoede/u-boot-sunxi/commits/sunxi-upstreaming
Note I often rebase + force push this branch.
I noticed ;-)
Quoted 2 lines
Note I won't be re-posting these until the i2c controller conversion to the
CONFIG_SYS_I2Cframework is sorted out.No problem. Is that a big rework then?
Not all that big, I'm working on it now, I hope to have it finished by the end of today.
Quoted 5 lines
How would you feel about reordering things a bit to push the i2c/power and sun[45]i stuff to the end, most of the rest looks more or less trivial/uncontroversial to me and could potentially be applied sooner rather than later (ulterior motive: this would unblock my AHCI patches ;-))
Quoted 3 lines
I agree, actually if you look in where your u-boot list mails go you will see a pull-req to Albert there for the entire set I've been working on minus the i2c + axp patches :)
Don't bother with the pull request, as I only apply PRs from git.denx.de U-Boot repositories. I will happily apply your series from Patchwork. Just make sure it is properly assigned to me.
Quoted 3 lines
Regards,
Hans
Amicalement,
Signature · 1 line
Albert.
PATCH v2 8/12 sunxi: Add axp209 pmic support
Hi,
Quoted 29 lines · Albert ARIBAUD
Hi Hans,
Quoted 24 lines · Hans de Goede
Hi,
Quoted 11 lines · Ian Campbell
Quoted 3 lines · Hans de Goede
https://github.com/jwrdegoede/u-boot-sunxi/commits/sunxi-upstreaming
Note I often rebase + force push this branch.
I noticed ;-)
Quoted 2 lines
Note I won't be re-posting these until the i2c controller conversion to the
CONFIG_SYS_I2Cframework is sorted out.No problem. Is that a big rework then?
Not all that big, I'm working on it now, I hope to have it finished by the end of today.
Quoted 5 lines
How would you feel about reordering things a bit to push the i2c/power and sun[45]i stuff to the end, most of the rest looks more or less trivial/uncontroversial to me and could potentially be applied sooner rather than later (ulterior motive: this would unblock my AHCI patches ;-))
Quoted 7 lines
Quoted 3 lines
I agree, actually if you look in where your u-boot list mails go you will see a pull-req to Albert there for the entire set I've been working on minus the i2c + axp patches :)
Don't bother with the pull request, as I only apply PRs from git.denx.de U-Boot repositories. I will happily apply your series from Patchwork. Just make sure it is properly assigned to me.
Ok, since I dropped some patches which need more work from the series, some of the latter ones needed some manual rebasing to apply. So I will send a new version of the set. How do I ensure that those patches end up being assigned to you ? So far I've been sending my patches with you as the "To" of the emails and the list in the Cc, is that sufficient ?
Regards,
Hans
PATCH v2 8/12 sunxi: Add axp209 pmic support
In reply to Hans de GoedeQuoted 9 lines · Hans de Goede
Quoted 5 lines
How would you feel about reordering things a bit to push the i2c/power and sun[45]i stuff to the end, most of the rest looks more or less trivial/uncontroversial to me and could potentially be applied sooner rather than later (ulterior motive: this would unblock my AHCI patches ;-))
I agree, actually if you look in where your u-boot list mails go you will see a pull-req to Albert there for the entire set I've been working on minus the i2c + axp patches :)
Awesome, thanks!
Ian.
PATCH v2 9/12 sunxi: Add axp152 pmic support
In reply to Hans de GoedeAdd support for the x-powers axp152 pmic which is found on most A10s boards and enable it for the r7-tv-dongle board.
--- board/sunxi/board.c | 10 +++++ boards.cfg | 2 +- drivers/power/Makefile | 1 + drivers/power/axp152.c | 112 +++++++++++++++++++++++++++++++++++++++++++++++++ include/axp152.h | 11 +++++ 5 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 drivers/power/axp152.c create mode 100644 include/axp152.h
board/sunxi/board.c +10 -0
@@ -12,6 +12,9 @@*/ #include <common.h> +#ifdef CONFIG_AXP152_POWER +#include <axp152.h> +#endif #ifdef CONFIG_AXP209_POWER #include <axp209.h> #endif
@@ -122,6 +125,13 @@ void sunxi_board_init(void)int power_failed =0 ;unsigned long ramsize; +#ifdef CONFIG_AXP152_POWER + power_failed =axp152_init (); + power_failed |=axp152_set_dcdc2 (1400 ); + power_failed |=axp152_set_dcdc3 (1500 ); + power_failed |=axp152_set_dcdc4 (1250 ); + power_failed |=axp152_set_ldo2 (3000 ); +#endif #ifdef CONFIG_AXP209_POWER power_failed |=axp209_init (); power_failed |=axp209_set_dcdc2 (1400 );
boards.cfg +1 -1
@@ -385,7 +385,7 @@ Active arm armv7 sunxi - sunxi Active arm armv7 sunxi - sunxi Cubieboard sun4i:CUBIEBOARD,SPL,AXP209_POWER Hans de Goede <[email protected]> Active arm armv7 sunxi - sunxi Cubietruck sun7i:CUBIETRUCK,SPL,AXP209_POWER,SUNXI_GMAC,RGMII Ian Campbell <[email protected]>:Hans de Goede <[email protected]> Active arm armv7 sunxi - sunxi Cubietruck_FEL sun7i:CUBIETRUCK,SPL_FEL,AXP209_POWER,SUNXI_GMAC,RGMII Ian Campbell <[email protected]>:Hans de Goede <[email protected]> -Active arm armv7 sunxi - sunxi r7-tv-dongle sun5i:R7DONGLE,SPL Hans de Goede <[email protected]> +Active arm armv7 sunxi - sunxi r7-tv-dongle sun5i:R7DONGLE,SPL,AXP152_POWER Hans de Goede <[email protected]> Active arm armv7 u8500 st-ericsson snowball snowball - Mathieu Poirier <[email protected]> Active arm armv7 u8500 st-ericsson u8500 u8500_href - - Active arm armv7 vf610 freescale vf610twr vf610twr vf610twr:IMX_CONFIG=board/freescale/vf610twr/imximage.cfg Alison Wang <[email protected]>
drivers/power/Makefile +1 -0
@@ -5,6 +5,7 @@ # SPDX-License-Identifier: GPL-2.0+ # +obj-$(CONFIG_AXP152_POWER) += axp152.o obj-$(CONFIG_AXP209_POWER) += axp209.o obj-$(CONFIG_EXYNOS_TMU) += exynos-tmu.o obj-$(CONFIG_FTPMU010_POWER) += ftpmu010.o
drivers/power/axp152.c new file +112 -0
112 lines not on this page · raw message
include/axp152.h new file +11 -0
@@ -0,0 +1,11 @@ +/* +* (C) Copyright 2012 Henrik Nordstrom <[email protected]> +* +* SPDX-License-Identifier: GPL-2.0+ +*/ +int axp152_set_dcdc2 (int mvolt); +int axp152_set_dcdc3 (int mvolt); +int axp152_set_dcdc4 (int mvolt); +int axp152_set_ldo2 (int mvolt); +void axp152_poweroff (void ); +int axp152_init (void );
Signature · 1 line
1.9.0
PATCH v2 9/12 sunxi: Add axp152 pmic support
Quoted 2 lines · Hans de Goede
Add support for the x-powers axp152 pmic which is found on most A10s boards and enable it for the r7-tv-dongle board.
Again just the same comments as on the axp209.
PATCH v2 10/12 net: Rename and cleanup sunxi (Allwinner) emac driver
In reply to Hans de GoedeFrom: Stefan Roese <[email protected]>
There have been 3 versions of the sunxi_emac support patch during its development. Somehow version 2 ended up in upstream u-boot where as the u-boot-sunxi git repo got version 3.
This bumps the version in upstream u-boot to version 3 of the patch:
- Initialize MII clock earlier so mii access to allow independent use
- Name change from WEMAC to EMAC to match mainline kernel & chip manual
- Cosmetic code cleanup
--- drivers/net/Makefile | 2 +- drivers/net/sunxi_emac.c | 521 +++++++++++++++++++++++++++++++++++++++++++++ drivers/net/sunxi_wemac.c | 525 ---------------------------------------------- include/netdev.h | 2 +- 4 files changed, 523 insertions(+), 527 deletions(-) create mode 100644 drivers/net/sunxi_emac.c delete mode 100644 drivers/net/sunxi_wemac.c
drivers/net/Makefile +1 -1
@@ -20,6 +20,7 @@ obj-$(CONFIG_DNET) += dnet.o obj-$(CONFIG_E1000) += e1000.o obj-$(CONFIG_E1000_SPI) += e1000_spi.o obj-$(CONFIG_EEPRO100) += eepro100.o +obj-$(CONFIG_SUNXI_EMAC) += sunxi_emac.o obj-$(CONFIG_ENC28J60) += enc28j60.o obj-$(CONFIG_EP93XX) += ep93xx_eth.o obj-$(CONFIG_ETHOC) += ethoc.o
@@ -51,7 +52,6 @@ obj-$(CONFIG_RTL8169) += rtl8169.o obj-$(CONFIG_SH_ETHER) += sh_eth.o obj-$(CONFIG_SMC91111) += smc91111.o obj-$(CONFIG_SMC911X) += smc911x.o -obj-$(CONFIG_SUNXI_WEMAC) += sunxi_wemac.o obj-$(CONFIG_DRIVER_TI_EMAC) += davinci_emac.o obj-$(CONFIG_TSEC_ENET) += tsec.o fsl_mdio.o obj-$(CONFIG_DRIVER_TI_CPSW) += cpsw.o
drivers/net/sunxi_emac.c new file +521 -0
521 lines not on this page · raw message
drivers/net/sunxi_wemac.c deleted +0 -525
525 lines not on this page · raw message
include/netdev.h +1 -1
@@ -78,8 +78,8 @@ int sh_eth_initialize(bd_t *bis);int skge_initialize (bd_t *bis);int smc91111_initialize (u8 dev_num,int base_addr);int smc911x_initialize (u8 dev_num,int base_addr); +int sunxi_emac_initialize (bd_t *bis);int sunxi_gmac_initialize (bd_t *bis); -int sunxi_wemac_initialize (bd_t *bis);int tsi108_eth_initialize (bd_t *bis);int uec_standard_init (bd_t *bis);int uli526x_initialize (bd_t *bis);
Signature · 1 line
1.9.0
PATCH v2 11/12 sunxi: Add emac glue, enable emac on the cubieboard
In reply to Hans de Goede--- arch/arm/cpu/armv7/sunxi/board.c | 8 ++++++++ boards.cfg | 2 +- include/configs/sunxi-common.h | 5 +++++ 3 files changed, 14 insertions(+), 1 deletion(-)
arch/arm/cpu/armv7/sunxi/board.c +8 -0
@@ -123,6 +123,14 @@ int cpu_eth_init(bd_t *bis) {int rc; +#ifdef CONFIG_SUNXI_EMAC + rc =sunxi_emac_initialize (bis); +if (rc <0 ) { +printf ("sunxi: failed to initialize emac\n" ); +return rc; + } +#endif +#ifdef CONFIG_SUNXI_GMAC rc =sunxi_gmac_initialize (bis);if (rc <0 ) {
boards.cfg +1 -1
@@ -382,7 +382,7 @@ Active arm armv7 s5pc1xx samsung goni Active arm armv7 s5pc1xx samsung smdkc100 smdkc100 - Minkyu Kang <[email protected]> Active arm armv7 socfpga altera socfpga socfpga_cyclone5 - - Active arm armv7 sunxi - sunxi A13-OLinuXinoM sun5i:A13_OLINUXINOM,SPL,CONS_INDEX=2 Hans de Goede <[email protected]> -Active arm armv7 sunxi - sunxi Cubieboard sun4i:CUBIEBOARD,SPL,AXP209_POWER Hans de Goede <[email protected]> +Active arm armv7 sunxi - sunxi Cubieboard sun4i:CUBIEBOARD,SPL,AXP209_POWER,SUNXI_EMAC Hans de Goede <[email protected]> Active arm armv7 sunxi - sunxi Cubietruck sun7i:CUBIETRUCK,SPL,AXP209_POWER,SUNXI_GMAC,RGMII Ian Campbell <[email protected]>:Hans de Goede <[email protected]> Active arm armv7 sunxi - sunxi Cubietruck_FEL sun7i:CUBIETRUCK,SPL_FEL,AXP209_POWER,SUNXI_GMAC,RGMII Ian Campbell <[email protected]>:Hans de Goede <[email protected]> Active arm armv7 sunxi - sunxi r7-tv-dongle sun5i:R7DONGLE,SPL,AXP152_POWER Hans de Goede <[email protected]>
include/configs/sunxi-common.h +5 -0
@@ -179,6 +179,11 @@#define CONFIG_CONS_INDEX 1/* UART0 */ #endif +/* Ethernet support */ +#ifdef CONFIG_SUNXI_EMAC +#define CONFIG_MII /* MII PHY management */ +#endif +#ifdef CONFIG_SUNXI_GMAC #define CONFIG_DESIGNWARE_ETH /* GMAC can use designware driver */ #define CONFIG_DW_AUTONEG
Signature · 1 line
1.9.0
PATCH v2 11/12 sunxi: Add emac glue, enable emac on the cubieboard
Quoted 1 line · Hans de Goede
Signed-off-by Hans de Goede <[email protected]>
PATCH v2 12/12 sunxi: Add support for using MII phy-s with the GMAC nic
In reply to Hans de GoedeFrom: Chen-Yu Tsai <[email protected]>
Many A20 boards (ie Cubieboard2, A20-OLinuXino_MICRO) use an 100 Mbit MII phy together with the GMAC nic found in the A20 SoC, add support for this (this will get used when we add these boards in a later patch).
--- board/sunxi/gmac.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
board/sunxi/gmac.c +11 -0
@@ -16,17 +16,28 @@ int sunxi_gmac_initialize(bd_t *bis)setbits_le32 (&ccm->ahb_gate1,0x1 <<AHB_GATE_OFFSET_GMAC );/* Set MII clock */ +#ifdef CONFIG_RGMII setbits_le32 (&ccm->gmac_clk_cfg,CCM_GMAC_CTRL_TX_CLK_SRC_INT_RGMII |CCM_GMAC_CTRL_GPIT_RGMII ); +#else +setbits_le32 (&ccm->gmac_clk_cfg,CCM_GMAC_CTRL_TX_CLK_SRC_MII | +CCM_GMAC_CTRL_GPIT_MII ); +#endif /* Configure pin mux settings for GMAC */ for (pin =SUNXI_GPA (0 ); pin <=SUNXI_GPA (16 ); pin++) { +#ifdef CONFIG_RGMII /* skip unused pins in RGMII mode */ if (pin ==SUNXI_GPA (9 ) || pin ==SUNXI_GPA (14 ))continue ; +#endif sunxi_gpio_set_cfgpin (pin,SUN7I_GPA0_GMAC );sunxi_gpio_set_drv (pin,3 ); } +#ifdef CONFIG_RGMII return designware_initialize (SUNXI_GMAC_BASE ,PHY_INTERFACE_MODE_RGMII ); +#else +return designware_initialize (SUNXI_GMAC_BASE ,PHY_INTERFACE_MODE_MII ); +#endif }
Signature · 1 line
1.9.0
PATCH v2 12/12 sunxi: Add support for using MII phy-s with the GMAC nic
Quoted 8 lines · Hans de Goede
From: Chen-Yu Tsai <[email protected]>
Many A20 boards (ie Cubieboard2, A20-OLinuXino_MICRO) use an 100 Mbit MII phy together with the GMAC nic found in the A20 SoC, add support for this (this will get used when we add these boards in a later patch).
Signed-off-by Chen-Yu Tsai <[email protected]>Signed-off-by Hans de Goede <[email protected]>