* [U-Boot] [PATCH v5 1/8] imx: mxc_i2c: tweak the i2c transfer method
2017-11-08 15:35 [U-Boot] [PATCH v5 0/8] Add support for GE PPD Martyn Welch
@ 2017-11-08 15:35 ` Martyn Welch
2017-11-08 15:35 ` [U-Boot] [PATCH v5 2/8] ext4: recover from filesystem corruption when reading Martyn Welch
` (6 subsequent siblings)
7 siblings, 0 replies; 15+ messages in thread
From: Martyn Welch @ 2017-11-08 15:35 UTC (permalink / raw)
To: u-boot
From: Nandor Han <nandor.han@ge.com>
Tweak the i2c transfer to work for devices that want to read data
without addressing a register.
Signed-off-by: Nandor Han <nandor.han@ge.com>
Signed-off-by: Martyn Welch <martyn.welch@collabora.co.uk>
Acked-by: Heiko Schocher <hs@denx.de>
Cc: Heiko Schocher <hs@denx.de>
Cc: Stefano Babic <sbabic@denx.de>
---
Changes for v2:
- Replacing '!= -1' with '>= 0'.
drivers/i2c/mxc_i2c.c | 25 +++++++++++++++----------
1 file changed, 15 insertions(+), 10 deletions(-)
diff --git a/drivers/i2c/mxc_i2c.c b/drivers/i2c/mxc_i2c.c
index abf1da2..205274e 100644
--- a/drivers/i2c/mxc_i2c.c
+++ b/drivers/i2c/mxc_i2c.c
@@ -317,16 +317,19 @@ static int i2c_init_transfer_(struct mxc_i2c_bus *i2c_bus, u8 chip,
temp |= I2CR_MTX | I2CR_TX_NO_AK;
writeb(temp, base + (I2CR << reg_shift));
- /* write slave address */
- ret = tx_byte(i2c_bus, chip << 1);
- if (ret < 0)
- return ret;
-
- while (alen--) {
- ret = tx_byte(i2c_bus, (addr >> (alen * 8)) & 0xff);
+ if (alen >= 0) {
+ /* write slave address */
+ ret = tx_byte(i2c_bus, chip << 1);
if (ret < 0)
return ret;
+
+ while (alen--) {
+ ret = tx_byte(i2c_bus, (addr >> (alen * 8)) & 0xff);
+ if (ret < 0)
+ return ret;
+ }
}
+
return 0;
}
@@ -537,9 +540,11 @@ static int bus_i2c_read(struct mxc_i2c_bus *i2c_bus, u8 chip, u32 addr,
if (ret < 0)
return ret;
- temp = readb(base + (I2CR << reg_shift));
- temp |= I2CR_RSTA;
- writeb(temp, base + (I2CR << reg_shift));
+ if (alen >= 0) {
+ temp = readb(base + (I2CR << reg_shift));
+ temp |= I2CR_RSTA;
+ writeb(temp, base + (I2CR << reg_shift));
+ }
ret = tx_byte(i2c_bus, (chip << 1) | 1);
if (ret < 0) {
--
2.1.4
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [U-Boot] [PATCH v5 2/8] ext4: recover from filesystem corruption when reading
2017-11-08 15:35 [U-Boot] [PATCH v5 0/8] Add support for GE PPD Martyn Welch
2017-11-08 15:35 ` [U-Boot] [PATCH v5 1/8] imx: mxc_i2c: tweak the i2c transfer method Martyn Welch
@ 2017-11-08 15:35 ` Martyn Welch
2017-11-09 9:25 ` Stefano Babic
2017-11-08 15:35 ` [U-Boot] [PATCH v5 3/8] pwm: imx: Enable PWM support on i.MX53 Martyn Welch
` (5 subsequent siblings)
7 siblings, 1 reply; 15+ messages in thread
From: Martyn Welch @ 2017-11-08 15:35 UTC (permalink / raw)
To: u-boot
From: Ian Ray <ian.ray@ge.com>
Some fixes when reading EXT files and directory entries were identified
after using e2fuzz to corrupt an EXT3 filesystem:
- Stop reading directory entries if the offset becomes badly aligned.
- Avoid overwriting memory by clamping the length used to zero the buffer
in ext4fs_read_file. Also sanity check blocksize.
Signed-off-by: Ian Ray <ian.ray@ge.com>
Signed-off-by: Martyn Welch <martyn.welch@collabora.co.uk>
---
fs/ext4/ext4_common.c | 10 ++++++++++
fs/ext4/ext4fs.c | 10 +++++++++-
2 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/fs/ext4/ext4_common.c b/fs/ext4/ext4_common.c
index 31952f4..dac9545 100644
--- a/fs/ext4/ext4_common.c
+++ b/fs/ext4/ext4_common.c
@@ -660,6 +660,11 @@ static int search_dir(struct ext2_inode *parent_inode, char *dirname)
offset = 0;
do {
+ if (offset & 3) {
+ printf("Badly aligned ext2_dirent\n");
+ break;
+ }
+
dir = (struct ext2_dirent *)(block_buffer + offset);
direntname = (char*)(dir) + sizeof(struct ext2_dirent);
@@ -880,6 +885,11 @@ static int unlink_filename(char *filename, unsigned int blknr)
offset = 0;
do {
+ if (offset & 3) {
+ printf("Badly aligned ext2_dirent\n");
+ break;
+ }
+
previous_dir = dir;
dir = (struct ext2_dirent *)(block_buffer + offset);
direntname = (char *)(dir) + sizeof(struct ext2_dirent);
diff --git a/fs/ext4/ext4fs.c b/fs/ext4/ext4fs.c
index b0c7303..9ee2caf 100644
--- a/fs/ext4/ext4fs.c
+++ b/fs/ext4/ext4fs.c
@@ -64,6 +64,9 @@ int ext4fs_read_file(struct ext2fs_node *node, loff_t pos,
char *delayed_buf = NULL;
short status;
+ if (blocksize <= 0)
+ return -1;
+
/* Adjust len so it we can't read past the end of the file. */
if (len + pos > filesize)
len = (filesize - pos);
@@ -127,6 +130,7 @@ int ext4fs_read_file(struct ext2fs_node *node, loff_t pos,
(blockend >> log2blksz);
}
} else {
+ int n;
if (previous_block_number != -1) {
/* spill */
status = ext4fs_devread(delayed_start,
@@ -137,7 +141,11 @@ int ext4fs_read_file(struct ext2fs_node *node, loff_t pos,
return -1;
previous_block_number = -1;
}
- memset(buf, 0, blocksize - skipfirst);
+ /* Zero no more than `len' bytes. */
+ n = blocksize - skipfirst;
+ if (n > len)
+ n = len;
+ memset(buf, 0, n);
}
buf += blocksize - skipfirst;
}
--
2.1.4
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [U-Boot] [PATCH v5 2/8] ext4: recover from filesystem corruption when reading
2017-11-08 15:35 ` [U-Boot] [PATCH v5 2/8] ext4: recover from filesystem corruption when reading Martyn Welch
@ 2017-11-09 9:25 ` Stefano Babic
0 siblings, 0 replies; 15+ messages in thread
From: Stefano Babic @ 2017-11-09 9:25 UTC (permalink / raw)
To: u-boot
On 08/11/2017 16:35, Martyn Welch wrote:
> From: Ian Ray <ian.ray@ge.com>
>
> Some fixes when reading EXT files and directory entries were identified
> after using e2fuzz to corrupt an EXT3 filesystem:
>
> - Stop reading directory entries if the offset becomes badly aligned.
>
> - Avoid overwriting memory by clamping the length used to zero the buffer
> in ext4fs_read_file. Also sanity check blocksize.
>
> Signed-off-by: Ian Ray <ian.ray@ge.com>
> Signed-off-by: Martyn Welch <martyn.welch@collabora.co.uk>
> ---
> fs/ext4/ext4_common.c | 10 ++++++++++
> fs/ext4/ext4fs.c | 10 +++++++++-
> 2 files changed, 19 insertions(+), 1 deletion(-)
>
> diff --git a/fs/ext4/ext4_common.c b/fs/ext4/ext4_common.c
> index 31952f4..dac9545 100644
> --- a/fs/ext4/ext4_common.c
> +++ b/fs/ext4/ext4_common.c
> @@ -660,6 +660,11 @@ static int search_dir(struct ext2_inode *parent_inode, char *dirname)
>
> offset = 0;
> do {
> + if (offset & 3) {
> + printf("Badly aligned ext2_dirent\n");
> + break;
> + }
> +
> dir = (struct ext2_dirent *)(block_buffer + offset);
> direntname = (char*)(dir) + sizeof(struct ext2_dirent);
>
> @@ -880,6 +885,11 @@ static int unlink_filename(char *filename, unsigned int blknr)
>
> offset = 0;
> do {
> + if (offset & 3) {
> + printf("Badly aligned ext2_dirent\n");
> + break;
> + }
> +
> previous_dir = dir;
> dir = (struct ext2_dirent *)(block_buffer + offset);
> direntname = (char *)(dir) + sizeof(struct ext2_dirent);
> diff --git a/fs/ext4/ext4fs.c b/fs/ext4/ext4fs.c
> index b0c7303..9ee2caf 100644
> --- a/fs/ext4/ext4fs.c
> +++ b/fs/ext4/ext4fs.c
> @@ -64,6 +64,9 @@ int ext4fs_read_file(struct ext2fs_node *node, loff_t pos,
> char *delayed_buf = NULL;
> short status;
>
> + if (blocksize <= 0)
> + return -1;
> +
> /* Adjust len so it we can't read past the end of the file. */
> if (len + pos > filesize)
> len = (filesize - pos);
> @@ -127,6 +130,7 @@ int ext4fs_read_file(struct ext2fs_node *node, loff_t pos,
> (blockend >> log2blksz);
> }
> } else {
> + int n;
> if (previous_block_number != -1) {
> /* spill */
> status = ext4fs_devread(delayed_start,
> @@ -137,7 +141,11 @@ int ext4fs_read_file(struct ext2fs_node *node, loff_t pos,
> return -1;
> previous_block_number = -1;
> }
> - memset(buf, 0, blocksize - skipfirst);
> + /* Zero no more than `len' bytes. */
> + n = blocksize - skipfirst;
> + if (n > len)
> + n = len;
> + memset(buf, 0, n);
> }
> buf += blocksize - skipfirst;
> }
>
Reviewed-by: Stefano Babic <sbabic@denx.de>
Best regards,
Stefano Babic
--
=====================================================================
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================
^ permalink raw reply [flat|nested] 15+ messages in thread
* [U-Boot] [PATCH v5 3/8] pwm: imx: Enable PWM support on i.MX53
2017-11-08 15:35 [U-Boot] [PATCH v5 0/8] Add support for GE PPD Martyn Welch
2017-11-08 15:35 ` [U-Boot] [PATCH v5 1/8] imx: mxc_i2c: tweak the i2c transfer method Martyn Welch
2017-11-08 15:35 ` [U-Boot] [PATCH v5 2/8] ext4: recover from filesystem corruption when reading Martyn Welch
@ 2017-11-08 15:35 ` Martyn Welch
2017-11-09 9:28 ` Stefano Babic
2017-11-08 15:35 ` [U-Boot] [PATCH v5 4/8] arm: mx5: Add more register definitions Martyn Welch
` (4 subsequent siblings)
7 siblings, 1 reply; 15+ messages in thread
From: Martyn Welch @ 2017-11-08 15:35 UTC (permalink / raw)
To: u-boot
Add missing parts for i.MX53 PWM support
Acked-by: Nandor Han <nandor.han@ge.com>
Signed-off-by: Martyn Welch <martyn.welch@collabora.co.uk>
Cc: Stefano Babic <sbabic@denx.de>
---
Changes for v4:
- Removed ifdef.
arch/arm/include/asm/arch-mx5/imx-regs.h | 17 +++++++++++++++++
drivers/pwm/pwm-imx-util.c | 2 ++
2 files changed, 19 insertions(+)
diff --git a/arch/arm/include/asm/arch-mx5/imx-regs.h b/arch/arm/include/asm/arch-mx5/imx-regs.h
index 3e79fa3..2b0dc1e 100644
--- a/arch/arm/include/asm/arch-mx5/imx-regs.h
+++ b/arch/arm/include/asm/arch-mx5/imx-regs.h
@@ -508,6 +508,23 @@ struct fuse_bank4_regs {
};
#endif
+#define PWMCR_PRESCALER(x) (((x - 1) & 0xFFF) << 4)
+#define PWMCR_DOZEEN (1 << 24)
+#define PWMCR_WAITEN (1 << 23)
+#define PWMCR_DBGEN (1 << 22)
+#define PWMCR_CLKSRC_IPG_HIGH (2 << 16)
+#define PWMCR_CLKSRC_IPG (1 << 16)
+#define PWMCR_EN (1 << 0)
+
+struct pwm_regs {
+ u32 cr;
+ u32 sr;
+ u32 ir;
+ u32 sar;
+ u32 pr;
+ u32 cnr;
+};
+
#endif /* __ASSEMBLER__*/
#endif /* __ASM_ARCH_MX5_IMX_REGS_H__ */
diff --git a/drivers/pwm/pwm-imx-util.c b/drivers/pwm/pwm-imx-util.c
index 534dd8e..97ac0c8 100644
--- a/drivers/pwm/pwm-imx-util.c
+++ b/drivers/pwm/pwm-imx-util.c
@@ -23,10 +23,12 @@ struct pwm_regs *pwm_id_to_reg(int pwm_id)
return (struct pwm_regs *)PWM1_BASE_ADDR;
case 1:
return (struct pwm_regs *)PWM2_BASE_ADDR;
+#ifdef CONFIG_MX6
case 2:
return (struct pwm_regs *)PWM3_BASE_ADDR;
case 3:
return (struct pwm_regs *)PWM4_BASE_ADDR;
+#endif
#ifdef CONFIG_MX6SX
case 4:
return (struct pwm_regs *)PWM5_BASE_ADDR;
--
2.1.4
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [U-Boot] [PATCH v5 3/8] pwm: imx: Enable PWM support on i.MX53
2017-11-08 15:35 ` [U-Boot] [PATCH v5 3/8] pwm: imx: Enable PWM support on i.MX53 Martyn Welch
@ 2017-11-09 9:28 ` Stefano Babic
0 siblings, 0 replies; 15+ messages in thread
From: Stefano Babic @ 2017-11-09 9:28 UTC (permalink / raw)
To: u-boot
On 08/11/2017 16:35, Martyn Welch wrote:
> Add missing parts for i.MX53 PWM support
>
> Acked-by: Nandor Han <nandor.han@ge.com>
> Signed-off-by: Martyn Welch <martyn.welch@collabora.co.uk>
> Cc: Stefano Babic <sbabic@denx.de>
> ---
> Changes for v4:
> - Removed ifdef.
>
> arch/arm/include/asm/arch-mx5/imx-regs.h | 17 +++++++++++++++++
> drivers/pwm/pwm-imx-util.c | 2 ++
> 2 files changed, 19 insertions(+)
>
> diff --git a/arch/arm/include/asm/arch-mx5/imx-regs.h b/arch/arm/include/asm/arch-mx5/imx-regs.h
> index 3e79fa3..2b0dc1e 100644
> --- a/arch/arm/include/asm/arch-mx5/imx-regs.h
> +++ b/arch/arm/include/asm/arch-mx5/imx-regs.h
> @@ -508,6 +508,23 @@ struct fuse_bank4_regs {
> };
> #endif
>
> +#define PWMCR_PRESCALER(x) (((x - 1) & 0xFFF) << 4)
> +#define PWMCR_DOZEEN (1 << 24)
> +#define PWMCR_WAITEN (1 << 23)
> +#define PWMCR_DBGEN (1 << 22)
> +#define PWMCR_CLKSRC_IPG_HIGH (2 << 16)
> +#define PWMCR_CLKSRC_IPG (1 << 16)
> +#define PWMCR_EN (1 << 0)
> +
> +struct pwm_regs {
> + u32 cr;
> + u32 sr;
> + u32 ir;
> + u32 sar;
> + u32 pr;
> + u32 cnr;
> +};
> +
> #endif /* __ASSEMBLER__*/
>
> #endif /* __ASM_ARCH_MX5_IMX_REGS_H__ */
> diff --git a/drivers/pwm/pwm-imx-util.c b/drivers/pwm/pwm-imx-util.c
> index 534dd8e..97ac0c8 100644
> --- a/drivers/pwm/pwm-imx-util.c
> +++ b/drivers/pwm/pwm-imx-util.c
> @@ -23,10 +23,12 @@ struct pwm_regs *pwm_id_to_reg(int pwm_id)
> return (struct pwm_regs *)PWM1_BASE_ADDR;
> case 1:
> return (struct pwm_regs *)PWM2_BASE_ADDR;
> +#ifdef CONFIG_MX6
> case 2:
> return (struct pwm_regs *)PWM3_BASE_ADDR;
> case 3:
> return (struct pwm_regs *)PWM4_BASE_ADDR;
> +#endif
> #ifdef CONFIG_MX6SX
> case 4:
> return (struct pwm_regs *)PWM5_BASE_ADDR;
>
Acked-by: Stefano Babic <sbabic@denx.de>
Best regards,
Stefano
--
=====================================================================
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================
^ permalink raw reply [flat|nested] 15+ messages in thread
* [U-Boot] [PATCH v5 4/8] arm: mx5: Add more register definitions
2017-11-08 15:35 [U-Boot] [PATCH v5 0/8] Add support for GE PPD Martyn Welch
` (2 preceding siblings ...)
2017-11-08 15:35 ` [U-Boot] [PATCH v5 3/8] pwm: imx: Enable PWM support on i.MX53 Martyn Welch
@ 2017-11-08 15:35 ` Martyn Welch
2017-11-09 9:29 ` Stefano Babic
2017-11-08 15:35 ` [U-Boot] [PATCH v5 5/8] bootcount: add support for bootcounter on EXT filesystem Martyn Welch
` (3 subsequent siblings)
7 siblings, 1 reply; 15+ messages in thread
From: Martyn Welch @ 2017-11-08 15:35 UTC (permalink / raw)
To: u-boot
Add register definitions require for video configuration.
Signed-off-by: Nandor Han <nandor.han@ge.com>
Signed-off-by: Martyn Welch <martyn.welch@collabora.co.uk>
Reviewed-by: Stefano Babic <sbabic@denx.de>
Cc: Stefano Babic <sbabic@denx.de>
---
Changes in v5:
- Reduced checkpatch warnings.
arch/arm/include/asm/arch-mx5/crm_regs.h | 8 ++++++++
arch/arm/include/asm/arch-mx5/imx-regs.h | 33 ++++++++++++++++++++++++++++++++
2 files changed, 41 insertions(+)
diff --git a/arch/arm/include/asm/arch-mx5/crm_regs.h b/arch/arm/include/asm/arch-mx5/crm_regs.h
index b61c7b9..7fea569 100644
--- a/arch/arm/include/asm/arch-mx5/crm_regs.h
+++ b/arch/arm/include/asm/arch-mx5/crm_regs.h
@@ -210,6 +210,14 @@ struct mxc_ccm_reg {
#define MXC_CCM_CSCMR1_SSI_EXT2_COM_CLK_SEL (0x1 << 1)
#define MXC_CCM_CSCMR1_SSI_EXT1_COM_CLK_SEL 0x1
+/* Define the bits in register CSCMR2 */
+#define MXC_CCM_CSCMR2_DI0_CLK_SEL_OFFSET 26
+#define MXC_CCM_CSCMR2_DI0_CLK_SEL_MASK (0x7 << 26)
+#define MXC_CCM_CSCMR2_DI0_CLK_SEL(v) (((v) & 0x7) << 26)
+#define MXC_CCM_CSCMR2_DI0_CLK_SEL_RD(r) (((r) >> 26) & 0x7)
+
+#define MXC_CCM_CSCMR2_DI0_CLK_SEL_LDB_DI0_CLK 5
+
/* Define the bits in register CSCDR2 */
#define MXC_CCM_CSCDR2_CSPI_CLK_PRED_OFFSET 25
#define MXC_CCM_CSCDR2_CSPI_CLK_PRED_MASK (0x7 << 25)
diff --git a/arch/arm/include/asm/arch-mx5/imx-regs.h b/arch/arm/include/asm/arch-mx5/imx-regs.h
index 2b0dc1e..61c8d44 100644
--- a/arch/arm/include/asm/arch-mx5/imx-regs.h
+++ b/arch/arm/include/asm/arch-mx5/imx-regs.h
@@ -416,6 +416,39 @@ struct iomuxc {
};
#endif
+#define IOMUXC_GPR2_BITMAP_SPWG 0
+#define IOMUXC_GPR2_BITMAP_JEIDA 1
+
+#define IOMUXC_GPR2_BIT_MAPPING_CH0_OFFSET 6
+#define IOMUXC_GPR2_BIT_MAPPING_CH0_MASK (1 << IOMUXC_GPR2_BIT_MAPPING_CH0_OFFSET)
+#define IOMUXC_GPR2_BIT_MAPPING_CH0_JEIDA (IOMUXC_GPR2_BITMAP_JEIDA << \
+ IOMUXC_GPR2_BIT_MAPPING_CH0_OFFSET)
+#define IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG (IOMUXC_GPR2_BITMAP_SPWG << \
+ IOMUXC_GPR2_BIT_MAPPING_CH0_OFFSET)
+
+#define IOMUXC_GPR2_DATA_WIDTH_18 0
+#define IOMUXC_GPR2_DATA_WIDTH_24 1
+
+#define IOMUXC_GPR2_DATA_WIDTH_CH0_OFFSET 5
+#define IOMUXC_GPR2_DATA_WIDTH_CH0_MASK (1 << IOMUXC_GPR2_DATA_WIDTH_CH0_OFFSET)
+#define IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT (IOMUXC_GPR2_DATA_WIDTH_18 << \
+ IOMUXC_GPR2_DATA_WIDTH_CH0_OFFSET)
+#define IOMUXC_GPR2_DATA_WIDTH_CH0_24BIT (IOMUXC_GPR2_DATA_WIDTH_24 << \
+ IOMUXC_GPR2_DATA_WIDTH_CH0_OFFSET)
+
+#define IOMUXC_GPR2_MODE_DISABLED 0
+#define IOMUXC_GPR2_MODE_ENABLED_DI0 1
+#define IOMUXC_GPR2_MODE_ENABLED_DI1 3
+
+#define IOMUXC_GPR2_LVDS_CH0_MODE_OFFSET 0
+#define IOMUXC_GPR2_LVDS_CH0_MODE_MASK (3 << IOMUXC_GPR2_LVDS_CH0_MODE_OFFSET)
+#define IOMUXC_GPR2_LVDS_CH0_MODE_DISABLED (IOMUXC_GPR2_MODE_DISABLED << \
+ IOMUXC_GPR2_LVDS_CH0_MODE_OFFSET)
+#define IOMUXC_GPR2_LVDS_CH0_MODE_ENABLED_DI0 (IOMUXC_GPR2_MODE_ENABLED_DI0 << \
+ IOMUXC_GPR2_LVDS_CH0_MODE_OFFSET)
+#define IOMUXC_GPR2_LVDS_CH0_MODE_ENABLED_DI1 (IOMUXC_GPR2_MODE_ENABLED_DI1 << \
+ IOMUXC_GPR2_LVDS_CH0_MODE_OFFSET)
+
/* System Reset Controller (SRC) */
struct src {
u32 scr;
--
2.1.4
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [U-Boot] [PATCH v5 4/8] arm: mx5: Add more register definitions
2017-11-08 15:35 ` [U-Boot] [PATCH v5 4/8] arm: mx5: Add more register definitions Martyn Welch
@ 2017-11-09 9:29 ` Stefano Babic
0 siblings, 0 replies; 15+ messages in thread
From: Stefano Babic @ 2017-11-09 9:29 UTC (permalink / raw)
To: u-boot
On 08/11/2017 16:35, Martyn Welch wrote:
> Add register definitions require for video configuration.
>
> Signed-off-by: Nandor Han <nandor.han@ge.com>
> Signed-off-by: Martyn Welch <martyn.welch@collabora.co.uk>
> Reviewed-by: Stefano Babic <sbabic@denx.de>
> Cc: Stefano Babic <sbabic@denx.de>
> ---
> Changes in v5:
> - Reduced checkpatch warnings.
>
> arch/arm/include/asm/arch-mx5/crm_regs.h | 8 ++++++++
> arch/arm/include/asm/arch-mx5/imx-regs.h | 33 ++++++++++++++++++++++++++++++++
> 2 files changed, 41 insertions(+)
>
> diff --git a/arch/arm/include/asm/arch-mx5/crm_regs.h b/arch/arm/include/asm/arch-mx5/crm_regs.h
> index b61c7b9..7fea569 100644
> --- a/arch/arm/include/asm/arch-mx5/crm_regs.h
> +++ b/arch/arm/include/asm/arch-mx5/crm_regs.h
> @@ -210,6 +210,14 @@ struct mxc_ccm_reg {
> #define MXC_CCM_CSCMR1_SSI_EXT2_COM_CLK_SEL (0x1 << 1)
> #define MXC_CCM_CSCMR1_SSI_EXT1_COM_CLK_SEL 0x1
>
> +/* Define the bits in register CSCMR2 */
> +#define MXC_CCM_CSCMR2_DI0_CLK_SEL_OFFSET 26
> +#define MXC_CCM_CSCMR2_DI0_CLK_SEL_MASK (0x7 << 26)
> +#define MXC_CCM_CSCMR2_DI0_CLK_SEL(v) (((v) & 0x7) << 26)
> +#define MXC_CCM_CSCMR2_DI0_CLK_SEL_RD(r) (((r) >> 26) & 0x7)
> +
> +#define MXC_CCM_CSCMR2_DI0_CLK_SEL_LDB_DI0_CLK 5
> +
> /* Define the bits in register CSCDR2 */
> #define MXC_CCM_CSCDR2_CSPI_CLK_PRED_OFFSET 25
> #define MXC_CCM_CSCDR2_CSPI_CLK_PRED_MASK (0x7 << 25)
> diff --git a/arch/arm/include/asm/arch-mx5/imx-regs.h b/arch/arm/include/asm/arch-mx5/imx-regs.h
> index 2b0dc1e..61c8d44 100644
> --- a/arch/arm/include/asm/arch-mx5/imx-regs.h
> +++ b/arch/arm/include/asm/arch-mx5/imx-regs.h
> @@ -416,6 +416,39 @@ struct iomuxc {
> };
> #endif
>
> +#define IOMUXC_GPR2_BITMAP_SPWG 0
> +#define IOMUXC_GPR2_BITMAP_JEIDA 1
> +
> +#define IOMUXC_GPR2_BIT_MAPPING_CH0_OFFSET 6
> +#define IOMUXC_GPR2_BIT_MAPPING_CH0_MASK (1 << IOMUXC_GPR2_BIT_MAPPING_CH0_OFFSET)
> +#define IOMUXC_GPR2_BIT_MAPPING_CH0_JEIDA (IOMUXC_GPR2_BITMAP_JEIDA << \
> + IOMUXC_GPR2_BIT_MAPPING_CH0_OFFSET)
> +#define IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG (IOMUXC_GPR2_BITMAP_SPWG << \
> + IOMUXC_GPR2_BIT_MAPPING_CH0_OFFSET)
> +
> +#define IOMUXC_GPR2_DATA_WIDTH_18 0
> +#define IOMUXC_GPR2_DATA_WIDTH_24 1
> +
> +#define IOMUXC_GPR2_DATA_WIDTH_CH0_OFFSET 5
> +#define IOMUXC_GPR2_DATA_WIDTH_CH0_MASK (1 << IOMUXC_GPR2_DATA_WIDTH_CH0_OFFSET)
> +#define IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT (IOMUXC_GPR2_DATA_WIDTH_18 << \
> + IOMUXC_GPR2_DATA_WIDTH_CH0_OFFSET)
> +#define IOMUXC_GPR2_DATA_WIDTH_CH0_24BIT (IOMUXC_GPR2_DATA_WIDTH_24 << \
> + IOMUXC_GPR2_DATA_WIDTH_CH0_OFFSET)
> +
> +#define IOMUXC_GPR2_MODE_DISABLED 0
> +#define IOMUXC_GPR2_MODE_ENABLED_DI0 1
> +#define IOMUXC_GPR2_MODE_ENABLED_DI1 3
> +
> +#define IOMUXC_GPR2_LVDS_CH0_MODE_OFFSET 0
> +#define IOMUXC_GPR2_LVDS_CH0_MODE_MASK (3 << IOMUXC_GPR2_LVDS_CH0_MODE_OFFSET)
> +#define IOMUXC_GPR2_LVDS_CH0_MODE_DISABLED (IOMUXC_GPR2_MODE_DISABLED << \
> + IOMUXC_GPR2_LVDS_CH0_MODE_OFFSET)
> +#define IOMUXC_GPR2_LVDS_CH0_MODE_ENABLED_DI0 (IOMUXC_GPR2_MODE_ENABLED_DI0 << \
> + IOMUXC_GPR2_LVDS_CH0_MODE_OFFSET)
> +#define IOMUXC_GPR2_LVDS_CH0_MODE_ENABLED_DI1 (IOMUXC_GPR2_MODE_ENABLED_DI1 << \
> + IOMUXC_GPR2_LVDS_CH0_MODE_OFFSET)
> +
> /* System Reset Controller (SRC) */
> struct src {
> u32 scr;
>
Reviewed-by: Stefano Babic <sbabic@denx.de>
Best regards,
Stefano Babic
--
=====================================================================
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================
^ permalink raw reply [flat|nested] 15+ messages in thread
* [U-Boot] [PATCH v5 5/8] bootcount: add support for bootcounter on EXT filesystem
2017-11-08 15:35 [U-Boot] [PATCH v5 0/8] Add support for GE PPD Martyn Welch
` (3 preceding siblings ...)
2017-11-08 15:35 ` [U-Boot] [PATCH v5 4/8] arm: mx5: Add more register definitions Martyn Welch
@ 2017-11-08 15:35 ` Martyn Welch
2017-11-08 15:35 ` [U-Boot] [PATCH v5 6/8] rtc: add support for s35392a Martyn Welch
` (2 subsequent siblings)
7 siblings, 0 replies; 15+ messages in thread
From: Martyn Welch @ 2017-11-08 15:35 UTC (permalink / raw)
To: u-boot
From: Ian Ray <ian.ray@ge.com>
Add support for bootcounter on an EXT filesystem.
Sync configuration whitelist.
Signed-off-by: Ian Ray <ian.ray@ge.com>
Signed-off-by: Martyn Welch <martyn.welch@collabora.co.uk>
---
Changes for v2:
- Adding Kconfig for EXT bootcount.
Changes for v3:
- Add over-arching BOOTCOUNT Kconfig entry.
Changes for v5:
- Improved BOOTCOUNT_EXT description.
- Fixed checkpatch issues.
README | 7 +++++
drivers/Kconfig | 2 ++
drivers/bootcount/Kconfig | 58 ++++++++++++++++++++++++++++++++++++
drivers/bootcount/Makefile | 1 +
drivers/bootcount/bootcount_ext.c | 62 +++++++++++++++++++++++++++++++++++++++
5 files changed, 130 insertions(+)
create mode 100644 drivers/bootcount/Kconfig
create mode 100644 drivers/bootcount/bootcount_ext.c
diff --git a/README b/README
index f288176..6336c5c 100644
--- a/README
+++ b/README
@@ -2362,6 +2362,13 @@ The following options need to be configured:
CONFIG_SYS_BOOTCOUNT_ADDR = i2c addr which is used for
the bootcounter.
CONFIG_BOOTCOUNT_ALEN = address len
+ CONFIG_BOOTCOUNT_EXT
+ enable support for the bootcounter in EXT filesystem
+ CONFIG_SYS_BOOTCOUNT_ADDR = RAM address used for read
+ and write.
+ CONFIG_SYS_BOOTCOUNT_EXT_INTERFACE = interface
+ CONFIG_SYS_BOOTCOUNT_EXT_DEVPART = device and part
+ CONFIG_SYS_BOOTCOUNT_EXT_NAME = filename
- Show boot progress:
CONFIG_SHOW_BOOT_PROGRESS
diff --git a/drivers/Kconfig b/drivers/Kconfig
index 613e602..c2e813f 100644
--- a/drivers/Kconfig
+++ b/drivers/Kconfig
@@ -10,6 +10,8 @@ source "drivers/ata/Kconfig"
source "drivers/block/Kconfig"
+source "drivers/bootcount/Kconfig"
+
source "drivers/clk/Kconfig"
source "drivers/cpu/Kconfig"
diff --git a/drivers/bootcount/Kconfig b/drivers/bootcount/Kconfig
new file mode 100644
index 0000000..c9d627c
--- /dev/null
+++ b/drivers/bootcount/Kconfig
@@ -0,0 +1,58 @@
+#
+# Boot count configuration
+#
+
+menu "Boot count support"
+
+config BOOTCOUNT
+ bool "Enable Boot count support"
+ help
+ Enable boot count support, which provides the ability to store the
+ number of times the board has booted on a number of different
+ persistent storage mediums.
+
+if BOOTCOUNT
+
+config BOOTCOUNT_EXT
+ bool "Boot counter on EXT filesystem"
+ help
+ Add support for maintaining boot count in a file on an EXT
+ filesystem.
+
+if BOOTCOUNT_EXT
+
+config SYS_BOOTCOUNT_EXT_INTERFACE
+ string "Interface on which to find boot counter EXT filesystem"
+ default "mmc"
+ depends on BOOTCOUNT_EXT
+ help
+ Set the interface to use when locating the filesystem to use for the
+ boot counter.
+
+config SYS_BOOTCOUNT_EXT_DEVPART
+ string "Partition of the boot counter EXT filesystem"
+ default "0:1"
+ depends on BOOTCOUNT_EXT
+ help
+ Set the partition to use when locating the filesystem to use for the
+ boot counter.
+
+config SYS_BOOTCOUNT_EXT_NAME
+ string "Path and filename of the EXT filesystem based boot counter"
+ default "/boot/failures"
+ depends on BOOTCOUNT_EXT
+ help
+ Set the filename and path of the file used to store the boot counter.
+
+config SYS_BOOTCOUNT_ADDR
+ hex "RAM address used for reading and writing the boot counter"
+ default 0x7000A000
+ depends on BOOTCOUNT_EXT
+ help
+ Set the address used for reading and writing the boot counter.
+
+endif
+
+endif
+
+endmenu
diff --git a/drivers/bootcount/Makefile b/drivers/bootcount/Makefile
index ed9659a..45445d2 100644
--- a/drivers/bootcount/Makefile
+++ b/drivers/bootcount/Makefile
@@ -9,3 +9,4 @@ obj-$(CONFIG_BOOTCOUNT_AM33XX) += bootcount_davinci.o
obj-$(CONFIG_BOOTCOUNT_RAM) += bootcount_ram.o
obj-$(CONFIG_BOOTCOUNT_ENV) += bootcount_env.o
obj-$(CONFIG_BOOTCOUNT_I2C) += bootcount_i2c.o
+obj-$(CONFIG_BOOTCOUNT_EXT) += bootcount_ext.o
diff --git a/drivers/bootcount/bootcount_ext.c b/drivers/bootcount/bootcount_ext.c
new file mode 100644
index 0000000..e0dd21b
--- /dev/null
+++ b/drivers/bootcount/bootcount_ext.c
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2017 General Electric Company. All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <bootcount.h>
+#include <fs.h>
+#include <mapmem.h>
+
+#define BC_MAGIC 0xbc
+
+void bootcount_store(ulong a)
+{
+ u8 *buf;
+ loff_t len;
+ int ret;
+
+ if (fs_set_blk_dev(CONFIG_SYS_BOOTCOUNT_EXT_INTERFACE,
+ CONFIG_SYS_BOOTCOUNT_EXT_DEVPART, FS_TYPE_EXT)) {
+ puts("Error selecting device\n");
+ return;
+ }
+
+ buf = map_sysmem(CONFIG_SYS_BOOTCOUNT_ADDR, 2);
+ buf[0] = BC_MAGIC;
+ buf[1] = (a & 0xff);
+ unmap_sysmem(buf);
+
+ ret = fs_write(CONFIG_SYS_BOOTCOUNT_EXT_NAME,
+ CONFIG_SYS_BOOTCOUNT_ADDR, 0, 2, &len);
+ if (ret != 0)
+ puts("Error storing bootcount\n");
+}
+
+ulong bootcount_load(void)
+{
+ u8 *buf;
+ loff_t len_read;
+ int ret;
+
+ if (fs_set_blk_dev(CONFIG_SYS_BOOTCOUNT_EXT_INTERFACE,
+ CONFIG_SYS_BOOTCOUNT_EXT_DEVPART, FS_TYPE_EXT)) {
+ puts("Error selecting device\n");
+ return 0;
+ }
+
+ ret = fs_read(CONFIG_SYS_BOOTCOUNT_EXT_NAME, CONFIG_SYS_BOOTCOUNT_ADDR,
+ 0, 2, &len_read);
+ if (ret != 0 || len_read != 2) {
+ puts("Error loading bootcount\n");
+ return 0;
+ }
+
+ buf = map_sysmem(CONFIG_SYS_BOOTCOUNT_ADDR, 2);
+ if (buf[0] == BC_MAGIC)
+ ret = buf[1];
+
+ unmap_sysmem(buf);
+
+ return ret;
+}
--
2.1.4
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [U-Boot] [PATCH v5 6/8] rtc: add support for s35392a
2017-11-08 15:35 [U-Boot] [PATCH v5 0/8] Add support for GE PPD Martyn Welch
` (4 preceding siblings ...)
2017-11-08 15:35 ` [U-Boot] [PATCH v5 5/8] bootcount: add support for bootcounter on EXT filesystem Martyn Welch
@ 2017-11-08 15:35 ` Martyn Welch
2017-11-08 15:35 ` [U-Boot] [PATCH v5 7/8] board: ge: make VPD code common Martyn Welch
2017-11-09 10:19 ` [U-Boot] [PATCH v5 0/8] Add support for GE PPD Lukasz Majewski
7 siblings, 0 replies; 15+ messages in thread
From: Martyn Welch @ 2017-11-08 15:35 UTC (permalink / raw)
To: u-boot
From: Nandor Han <nandor.han@ge.com>
Add support for S35392A RTC. The driver supports both U-Boot driver
models.
Signed-off-by: Nandor Han <nandor.han@ge.com>
Signed-off-by: Martyn Welch <martyn.welch@collabora.co.uk>
Cc: Heiko Schocher <hs@denx.de>
---
Changes for v5:
- Fixed checkpatch issues.
drivers/rtc/Kconfig | 6 +
drivers/rtc/Makefile | 1 +
drivers/rtc/s35392a.c | 365 ++++++++++++++++++++++++++++++++++++++++++++++++++
lib/Kconfig | 3 +
4 files changed, 375 insertions(+)
create mode 100644 drivers/rtc/s35392a.c
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
index d06130c7..2964bb2 100644
--- a/drivers/rtc/Kconfig
+++ b/drivers/rtc/Kconfig
@@ -30,4 +30,10 @@ config RTC_DS1307
Support for Dallas Semiconductor (now Maxim) DS1307 and DS1338/9 and
compatible Real Time Clock devices.
+config RTC_S35392A
+ bool "Enable S35392A driver"
+ select BITREVERSE
+ help
+ Enable s35392a driver which provides rtc get and set function.
+
endmenu
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile
index 003e31a..7a8f97a 100644
--- a/drivers/rtc/Makefile
+++ b/drivers/rtc/Makefile
@@ -49,5 +49,6 @@ obj-$(CONFIG_RTC_RS5C372A) += rs5c372.o
obj-$(CONFIG_RTC_RV3029) += rv3029.o
obj-$(CONFIG_RTC_RX8025) += rx8025.o
obj-$(CONFIG_RTC_S3C24X0) += s3c24x0_rtc.o
+obj-$(CONFIG_RTC_S35392A) += s35392a.o
obj-$(CONFIG_SANDBOX) += sandbox_rtc.o
obj-$(CONFIG_RTC_X1205) += x1205.o
diff --git a/drivers/rtc/s35392a.c b/drivers/rtc/s35392a.c
new file mode 100644
index 0000000..9adcefc
--- /dev/null
+++ b/drivers/rtc/s35392a.c
@@ -0,0 +1,365 @@
+/*
+ * SII Semiconductor Corporation S35392A RTC driver.
+ *
+ * Copyright (c) 2017, General Electric Company
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+#include <command.h>
+#include <common.h>
+#include <dm.h>
+#include <i2c.h>
+#include <linux/bitrev.h>
+#include <rtc.h>
+
+#define S35390A_CMD_STATUS1 0x30
+#define S35390A_CMD_STATUS2 0x31
+#define S35390A_CMD_TIME1 0x32
+#define S35390A_CMD_TIME2 0x33
+#define S35390A_CMD_INT2_REG1 0x35
+
+#define S35390A_BYTE_YEAR 0
+#define S35390A_BYTE_MONTH 1
+#define S35390A_BYTE_DAY 2
+#define S35390A_BYTE_WDAY 3
+#define S35390A_BYTE_HOURS 4
+#define S35390A_BYTE_MINS 5
+#define S35390A_BYTE_SECS 6
+
+/* flags for STATUS1 */
+#define S35390A_FLAG_POC 0x01
+#define S35390A_FLAG_BLD 0x02
+#define S35390A_FLAG_INT2 0x04
+#define S35390A_FLAG_24H 0x40
+#define S35390A_FLAG_RESET 0x80
+
+/*
+ * If either BLD or POC is set, then the chip has lost power long enough for
+ * the time value to become invalid.
+ */
+#define S35390A_LOW_VOLTAGE (S35390A_FLAG_POC | S35390A_FLAG_BLD)
+
+/*---------------------------------------------------------------------*/
+#undef DEBUG_RTC
+
+#ifdef DEBUG_RTC
+#define DEBUGR(fmt, args...) printf(fmt, ##args)
+#else
+#define DEBUGR(fmt, args...)
+#endif
+/*---------------------------------------------------------------------*/
+
+#ifdef CONFIG_DM_RTC
+#define DEV_TYPE struct udevice
+#else
+/* Local udevice */
+struct ludevice {
+ u8 chip;
+};
+
+#define DEV_TYPE struct ludevice
+struct ludevice dev;
+
+#endif
+
+#define msleep(a) udelay(a * 1000)
+
+int lowvoltage;
+
+static int s35392a_rtc_reset(DEV_TYPE *dev);
+
+static int s35392a_rtc_read(DEV_TYPE *dev, u8 reg, u8 *buf, int len)
+{
+ int ret;
+
+#ifdef CONFIG_DM_RTC
+ /* TODO: we need to tweak the chip address to reg */
+ ret = dm_i2c_read(dev, 0, buf, len);
+#else
+ (void)dev;
+ ret = i2c_read(reg, 0, -1, buf, len);
+#endif
+
+ return ret;
+}
+
+static int s35392a_rtc_write(DEV_TYPE *dev, u8 reg, u8 *buf, int len)
+{
+ int ret;
+
+#ifdef CONFIG_DM_RTC
+ /* TODO: we need to tweak the chip address to reg */
+ ret = dm_i2c_write(dev, 0, buf, 1);
+#else
+ (void)dev;
+ ret = i2c_write(reg, 0, 0, buf, len);
+#endif
+
+ return ret;
+}
+
+static int s35392a_rtc_read8(DEV_TYPE *dev, unsigned int reg)
+{
+ u8 val;
+ int ret;
+
+ ret = s35392a_rtc_read(dev, reg, &val, sizeof(val));
+ return ret < 0 ? ret : val;
+}
+
+static int s35392a_rtc_write8(DEV_TYPE *dev, unsigned int reg, int val)
+{
+ int ret;
+ u8 lval = val;
+
+ ret = s35392a_rtc_write(dev, reg, &lval, sizeof(lval));
+ return ret < 0 ? ret : 0;
+}
+
+static int validate_time(const struct rtc_time *tm)
+{
+ if ((tm->tm_year < 2000) || (tm->tm_year > 2099))
+ return -EINVAL;
+
+ if ((tm->tm_mon < 1) || (tm->tm_mon > 12))
+ return -EINVAL;
+
+ if ((tm->tm_mday < 1) || (tm->tm_mday > 31))
+ return -EINVAL;
+
+ if ((tm->tm_wday < 0) || (tm->tm_wday > 6))
+ return -EINVAL;
+
+ if ((tm->tm_hour < 0) || (tm->tm_hour > 23))
+ return -EINVAL;
+
+ if ((tm->tm_min < 0) || (tm->tm_min > 59))
+ return -EINVAL;
+
+ if ((tm->tm_sec < 0) || (tm->tm_sec > 59))
+ return -EINVAL;
+
+ return 0;
+}
+
+void s35392a_rtc_init(DEV_TYPE *dev)
+{
+ int status;
+
+ status = s35392a_rtc_read8(dev, S35390A_CMD_STATUS1);
+ if (status < 0)
+ goto error;
+
+ DEBUGR("init: S35390A_CMD_STATUS1: 0x%x\n", status);
+
+ lowvoltage = status & S35390A_LOW_VOLTAGE ? 1 : 0;
+
+ if (status & S35390A_FLAG_POC)
+ /*
+ * Do not communicate for 0.5 seconds since the power-on
+ * detection circuit is in operation.
+ */
+ msleep(500);
+
+ else if (!lowvoltage)
+ /*
+ * If both POC and BLD are unset everything is fine.
+ */
+ return;
+
+ if (lowvoltage)
+ printf("RTC low voltage detected\n");
+
+ if (!s35392a_rtc_reset(dev))
+ return;
+
+error:
+ printf("Error RTC init.\n");
+}
+
+/* Get the current time from the RTC */
+static int s35392a_rtc_get(DEV_TYPE *dev, struct rtc_time *tm)
+{
+ u8 date[7];
+ int ret, i;
+
+ if (lowvoltage) {
+ DEBUGR("RTC low voltage detected\n");
+ return -EINVAL;
+ }
+
+ ret = s35392a_rtc_read(dev, S35390A_CMD_TIME1, date, sizeof(date));
+ if (ret < 0) {
+ DEBUGR("Error reading date from RTC\n");
+ return -EIO;
+ }
+
+ /* This chip returns the bits of each byte in reverse order */
+ for (i = 0; i < 7; ++i)
+ date[i] = bitrev8(date[i]);
+
+ tm->tm_sec = bcd2bin(date[S35390A_BYTE_SECS]);
+ tm->tm_min = bcd2bin(date[S35390A_BYTE_MINS]);
+ tm->tm_hour = bcd2bin(date[S35390A_BYTE_HOURS] & ~S35390A_FLAG_24H);
+ tm->tm_wday = bcd2bin(date[S35390A_BYTE_WDAY]);
+ tm->tm_mday = bcd2bin(date[S35390A_BYTE_DAY]);
+ tm->tm_mon = bcd2bin(date[S35390A_BYTE_MONTH]);
+ tm->tm_year = bcd2bin(date[S35390A_BYTE_YEAR]) + 2000;
+
+ DEBUGR("Get DATE: %4d-%02d-%02d (wday=%d) TIME: %2d:%02d:%02d\n",
+ tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_wday,
+ tm->tm_hour, tm->tm_min, tm->tm_sec);
+
+ return 0;
+}
+
+/* Set the RTC */
+static int s35392a_rtc_set(DEV_TYPE *dev, const struct rtc_time *tm)
+{
+ int i, ret;
+ int status;
+ u8 date[7];
+
+ DEBUGR("Set DATE: %4d-%02d-%02d (wday=%d) TIME: %2d:%02d:%02d\n",
+ tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_wday,
+ tm->tm_hour, tm->tm_min, tm->tm_sec);
+
+ ret = validate_time(tm);
+ if (ret < 0)
+ return -EINVAL;
+
+ /* We support only 24h mode */
+ ret = s35392a_rtc_read8(dev, S35390A_CMD_STATUS1);
+ if (ret < 0)
+ return -EIO;
+ status = ret;
+
+ ret = s35392a_rtc_write8(dev, S35390A_CMD_STATUS1,
+ status | S35390A_FLAG_24H);
+ if (ret < 0)
+ return -EIO;
+
+ date[S35390A_BYTE_YEAR] = bin2bcd(tm->tm_year - 2000);
+ date[S35390A_BYTE_MONTH] = bin2bcd(tm->tm_mon);
+ date[S35390A_BYTE_DAY] = bin2bcd(tm->tm_mday);
+ date[S35390A_BYTE_WDAY] = bin2bcd(tm->tm_wday);
+ date[S35390A_BYTE_HOURS] = bin2bcd(tm->tm_hour);
+ date[S35390A_BYTE_MINS] = bin2bcd(tm->tm_min);
+ date[S35390A_BYTE_SECS] = bin2bcd(tm->tm_sec);
+
+ /* This chip expects the bits of each byte to be in reverse order */
+ for (i = 0; i < 7; ++i)
+ date[i] = bitrev8(date[i]);
+
+ ret = s35392a_rtc_write(dev, S35390A_CMD_TIME1, date, sizeof(date));
+ if (ret < 0) {
+ DEBUGR("Error writing date to RTC\n");
+ return -EIO;
+ }
+
+ /* Now we have time. Reset the low voltage status */
+ lowvoltage = 0;
+
+ return 0;
+}
+
+/* Reset the RTC. */
+static int s35392a_rtc_reset(DEV_TYPE *dev)
+{
+ int buf;
+ int ret;
+ unsigned int initcount = 0;
+
+ buf = S35390A_FLAG_RESET;
+
+initialize:
+ ret = s35392a_rtc_write8(dev, S35390A_CMD_STATUS1, buf);
+ if (ret < 0)
+ return -EIO;
+
+ ret = s35392a_rtc_read8(dev, S35390A_CMD_STATUS1);
+ if (ret < 0)
+ return -EIO;
+ buf = ret;
+
+ if (!lowvoltage)
+ lowvoltage = buf & S35390A_LOW_VOLTAGE ? 1 : 0;
+
+ if (buf & S35390A_LOW_VOLTAGE) {
+ /* Try up to five times to reset the chip */
+ if (initcount < 5) {
+ ++initcount;
+ goto initialize;
+ } else {
+ return -EIO;
+ }
+ }
+
+ return 0;
+}
+
+#ifndef CONFIG_DM_RTC
+
+int rtc_get(struct rtc_time *tm)
+{
+ return s35392a_rtc_get(&dev, tm);
+}
+
+int rtc_set(struct rtc_time *tm)
+{
+ return s35392a_rtc_set(&dev, tm);
+}
+
+void rtc_reset(void)
+{
+ s35392a_rtc_reset(&dev);
+}
+
+void rtc_init(void)
+{
+ s35392a_rtc_init(&dev);
+}
+
+#else
+
+static int s35392a_probe(struct udevice *dev)
+{
+ s35392a_rtc_init(dev);
+ return 0;
+}
+
+static const struct rtc_ops s35392a_rtc_ops = {
+ .get = s35392a_rtc_get,
+ .set = s35392a_rtc_set,
+ .read8 = s35392a_rtc_read8,
+ .write8 = s35392a_rtc_write8,
+ .reset = s35392a_rtc_reset,
+};
+
+static const struct udevice_id s35392a_rtc_ids[] = {
+ { .compatible = "sii,s35392a-rtc" },
+ { }
+};
+
+U_BOOT_DRIVER(s35392a_rtc) = {
+ .name = "s35392a_rtc",
+ .id = UCLASS_RTC,
+ .probe = s35392a_probe,
+ .of_match = s35392a_rtc_ids,
+ .ops = &s35392a_rtc_ops,
+};
+
+#endif
diff --git a/lib/Kconfig b/lib/Kconfig
index 18663ba..f447c53 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -80,6 +80,9 @@ config TPL_TINY_MEMSET
config RBTREE
bool
+config BITREVERSE
+ bool "Bit reverse library from Linux"
+
source lib/dhry/Kconfig
menu "Security support"
--
2.1.4
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [U-Boot] [PATCH v5 7/8] board: ge: make VPD code common
2017-11-08 15:35 [U-Boot] [PATCH v5 0/8] Add support for GE PPD Martyn Welch
` (5 preceding siblings ...)
2017-11-08 15:35 ` [U-Boot] [PATCH v5 6/8] rtc: add support for s35392a Martyn Welch
@ 2017-11-08 15:35 ` Martyn Welch
2017-11-09 9:27 ` Stefano Babic
2017-11-09 10:19 ` [U-Boot] [PATCH v5 0/8] Add support for GE PPD Lukasz Majewski
7 siblings, 1 reply; 15+ messages in thread
From: Martyn Welch @ 2017-11-08 15:35 UTC (permalink / raw)
To: u-boot
The VPD data is used on a number of GE products. Move the parsing code to
a common location so that we can share this code.
Signed-off-by: Martyn Welch <martyn.welch@collabora.co.uk>
---
Changes in v4:
- New patch.
Changes in v5:
- Fixed checkpatch issues.
board/ge/bx50v3/Makefile | 2 +-
board/ge/bx50v3/bx50v3.c | 2 +-
board/ge/bx50v3/vpd_reader.c | 228 -------------------------------------------
board/ge/bx50v3/vpd_reader.h | 25 -----
board/ge/common/Makefile | 7 ++
board/ge/common/vpd_reader.c | 197 +++++++++++++++++++++++++++++++++++++
board/ge/common/vpd_reader.h | 17 ++++
7 files changed, 223 insertions(+), 255 deletions(-)
delete mode 100644 board/ge/bx50v3/vpd_reader.c
delete mode 100644 board/ge/bx50v3/vpd_reader.h
create mode 100644 board/ge/common/Makefile
create mode 100644 board/ge/common/vpd_reader.c
create mode 100644 board/ge/common/vpd_reader.h
diff --git a/board/ge/bx50v3/Makefile b/board/ge/bx50v3/Makefile
index 2fff27b..bcd149f 100644
--- a/board/ge/bx50v3/Makefile
+++ b/board/ge/bx50v3/Makefile
@@ -5,4 +5,4 @@
# SPDX-License-Identifier: GPL-2.0+
#
-obj-y := bx50v3.o vpd_reader.o
+obj-y := bx50v3.o
diff --git a/board/ge/bx50v3/bx50v3.c b/board/ge/bx50v3/bx50v3.c
index 2e8f394..37de990 100644
--- a/board/ge/bx50v3/bx50v3.c
+++ b/board/ge/bx50v3/bx50v3.c
@@ -28,7 +28,7 @@
#include <input.h>
#include <pwm.h>
#include <stdlib.h>
-#include "vpd_reader.h"
+#include "../common/vpd_reader.h"
DECLARE_GLOBAL_DATA_PTR;
#ifndef CONFIG_SYS_I2C_EEPROM_ADDR
diff --git a/board/ge/bx50v3/vpd_reader.c b/board/ge/bx50v3/vpd_reader.c
deleted file mode 100644
index 98da893..0000000
--- a/board/ge/bx50v3/vpd_reader.c
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Copyright 2016 General Electric Company
- *
- * SPDX-License-Identifier: GPL-2.0+
- */
-
-#include "vpd_reader.h"
-
-#include <linux/bch.h>
-#include <stdlib.h>
-
-
-/* BCH configuration */
-
-const struct {
- int header_ecc_capability_bits;
- int data_ecc_capability_bits;
- unsigned int prim_poly;
- struct {
- int min;
- int max;
- } galois_field_order;
-} bch_configuration = {
- .header_ecc_capability_bits = 4,
- .data_ecc_capability_bits = 16,
- .prim_poly = 0,
- .galois_field_order = {
- .min = 5,
- .max = 15,
- },
-};
-
-static int calculate_galois_field_order(size_t source_length)
-{
- int gfo = bch_configuration.galois_field_order.min;
-
- for (; gfo < bch_configuration.galois_field_order.max &&
- ((((1 << gfo) - 1) - ((int)source_length * 8)) < 0);
- gfo++) {
- }
-
- if (gfo == bch_configuration.galois_field_order.max) {
- return -1;
- }
-
- return gfo + 1;
-}
-
-static int verify_bch(int ecc_bits, unsigned int prim_poly,
- uint8_t * data, size_t data_length,
- const uint8_t * ecc, size_t ecc_length)
-{
- int gfo = calculate_galois_field_order(data_length);
- if (gfo < 0) {
- return -1;
- }
-
- struct bch_control * bch = init_bch(gfo, ecc_bits, prim_poly);
- if (!bch) {
- return -1;
- }
-
- if (bch->ecc_bytes != ecc_length) {
- free_bch(bch);
- return -1;
- }
-
- unsigned * errloc = (unsigned *)calloc(data_length, sizeof(unsigned));
- int errors = decode_bch(
- bch, data, data_length, ecc, NULL, NULL, errloc);
- free_bch(bch);
- if (errors < 0) {
- free(errloc);
- return -1;
- }
-
- if (errors > 0) {
- for (int n = 0; n < errors; n++) {
- if (errloc[n] >= 8 * data_length) {
- /* n-th error located in ecc (no need for data correction) */
- } else {
- /* n-th error located in data */
- data[errloc[n] / 8] ^= 1 << (errloc[n] % 8);
- }
- }
- }
-
- free(errloc);
- return 0;
-}
-
-
-static const int ID = 0;
-static const int LEN = 1;
-static const int VER = 2;
-static const int TYP = 3;
-static const int BLOCK_SIZE = 4;
-
-static const uint8_t HEADER_BLOCK_ID = 0x00;
-static const uint8_t HEADER_BLOCK_LEN = 18;
-static const uint32_t HEADER_BLOCK_MAGIC = 0xca53ca53;
-static const size_t HEADER_BLOCK_VERIFY_LEN = 14;
-static const size_t HEADER_BLOCK_ECC_OFF = 14;
-static const size_t HEADER_BLOCK_ECC_LEN = 4;
-
-static const uint8_t ECC_BLOCK_ID = 0xFF;
-
-int vpd_reader(
- size_t size,
- uint8_t * data,
- void * userdata,
- int (*fn)(
- void * userdata,
- uint8_t id,
- uint8_t version,
- uint8_t type,
- size_t size,
- uint8_t const * data))
-{
- if ( size < HEADER_BLOCK_LEN
- || data == NULL
- || fn == NULL) {
- return -EINVAL;
- }
-
- /*
- * +--------------------+--------------------+--//--+--------------------+
- * | header block | data block | ... | ecc block |
- * +--------------------+--------------------+--//--+--------------------+
- * : : :
- * +------+-------+-----+ +------+-------------+
- * | id | magic | ecc | | ... | ecc |
- * | len | off | | +------+-------------+
- * | ver | size | | :
- * | type | | | :
- * +------+-------+-----+ :
- * : : : :
- * <----- [1] ----> <----------- [2] ----------->
- *
- * Repair (if necessary) the contents of header block [1] by using a
- * 4 byte ECC located at the end of the header block. A successful
- * return value means that we can trust the header.
- */
- int ret = verify_bch(
- bch_configuration.header_ecc_capability_bits,
- bch_configuration.prim_poly,
- data,
- HEADER_BLOCK_VERIFY_LEN,
- &data[HEADER_BLOCK_ECC_OFF],
- HEADER_BLOCK_ECC_LEN);
- if (ret < 0) {
- return ret;
- }
-
- /* Validate header block { id, length, version, type }. */
- if ( data[ID] != HEADER_BLOCK_ID
- || data[LEN] != HEADER_BLOCK_LEN
- || data[VER] != 0
- || data[TYP] != 0
- || ntohl(*(uint32_t *)(&data[4])) != HEADER_BLOCK_MAGIC) {
- return -EINVAL;
- }
-
- uint32_t offset = ntohl(*(uint32_t *)(&data[8]));
- uint16_t size_bits = ntohs(*(uint16_t *)(&data[12]));
-
- /* Check that ECC header fits. */
- if (offset + 3 >= size) {
- return -EINVAL;
- }
-
- /* Validate ECC block. */
- uint8_t * ecc = &data[offset];
- if ( ecc[ID] != ECC_BLOCK_ID
- || ecc[LEN] < BLOCK_SIZE
- || ecc[LEN] + offset > size
- || ecc[LEN] - BLOCK_SIZE != size_bits / 8
- || ecc[VER] != 1
- || ecc[TYP] != 1) {
- return -EINVAL;
- }
-
- /*
- * Use the header block to locate the ECC block and verify the data
- * blocks [2] against the ecc block ECC.
- */
- ret = verify_bch(
- bch_configuration.data_ecc_capability_bits,
- bch_configuration.prim_poly,
- &data[data[LEN]],
- offset - data[LEN],
- &data[offset + BLOCK_SIZE],
- ecc[LEN] - BLOCK_SIZE);
- if (ret < 0) {
- return ret;
- }
-
- /* Stop after ECC. Ignore possible zero padding. */
- size = offset;
-
- for (;;) {
- /* Move to next block. */
- size -= data[LEN];
- data += data[LEN];
-
- if (size == 0) {
- /* Finished iterating through blocks. */
- return 0;
- }
-
- if ( size < BLOCK_SIZE
- || data[LEN] < BLOCK_SIZE) {
- /* Not enough data for a header, or short header. */
- return -EINVAL;
- }
-
- ret = fn(
- userdata,
- data[ID],
- data[VER],
- data[TYP],
- data[LEN] - BLOCK_SIZE,
- &data[BLOCK_SIZE]);
- if (ret) {
- return ret;
- }
- }
-}
diff --git a/board/ge/bx50v3/vpd_reader.h b/board/ge/bx50v3/vpd_reader.h
deleted file mode 100644
index efa172a..0000000
--- a/board/ge/bx50v3/vpd_reader.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright 2016 General Electric Company
- *
- * SPDX-License-Identifier: GPL-2.0+
- */
-
-#include "common.h"
-
-/*
- * Read VPD from given data, verify content, and call callback
- * for each vital product data block.
- *
- * Returns Non-zero on error. Negative numbers encode errno.
- */
-int vpd_reader(
- size_t size,
- uint8_t * data,
- void * userdata,
- int (*fn)(
- void * userdata,
- uint8_t id,
- uint8_t version,
- uint8_t type,
- size_t size,
- uint8_t const * data));
diff --git a/board/ge/common/Makefile b/board/ge/common/Makefile
new file mode 100644
index 0000000..93e6c01
--- /dev/null
+++ b/board/ge/common/Makefile
@@ -0,0 +1,7 @@
+#
+# Copyright 2017 General Electric Company
+#
+# SPDX-License-Identifier: GPL-2.0+
+#
+
+obj-y := vpd_reader.o
diff --git a/board/ge/common/vpd_reader.c b/board/ge/common/vpd_reader.c
new file mode 100644
index 0000000..7367427
--- /dev/null
+++ b/board/ge/common/vpd_reader.c
@@ -0,0 +1,197 @@
+/*
+ * Copyright 2016 General Electric Company
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "vpd_reader.h"
+
+#include <linux/bch.h>
+#include <stdlib.h>
+
+/* BCH configuration */
+
+const struct {
+ int header_ecc_capability_bits;
+ int data_ecc_capability_bits;
+ unsigned int prim_poly;
+ struct {
+ int min;
+ int max;
+ } galois_field_order;
+} bch_configuration = {
+ .header_ecc_capability_bits = 4,
+ .data_ecc_capability_bits = 16,
+ .prim_poly = 0,
+ .galois_field_order = {
+ .min = 5,
+ .max = 15,
+ },
+};
+
+static int calculate_galois_field_order(size_t source_length)
+{
+ int gfo = bch_configuration.galois_field_order.min;
+
+ for (; gfo < bch_configuration.galois_field_order.max &&
+ ((((1 << gfo) - 1) - ((int)source_length * 8)) < 0);
+ gfo++) {
+ }
+
+ if (gfo == bch_configuration.galois_field_order.max)
+ return -1;
+
+ return gfo + 1;
+}
+
+static int verify_bch(int ecc_bits, unsigned int prim_poly, u8 *data,
+ size_t data_length, const u8 *ecc, size_t ecc_length)
+{
+ int gfo = calculate_galois_field_order(data_length);
+
+ if (gfo < 0)
+ return -1;
+
+ struct bch_control *bch = init_bch(gfo, ecc_bits, prim_poly);
+
+ if (!bch)
+ return -1;
+
+ if (bch->ecc_bytes != ecc_length) {
+ free_bch(bch);
+ return -1;
+ }
+
+ unsigned int *errloc = (unsigned int *)calloc(data_length,
+ sizeof(unsigned int));
+ int errors = decode_bch(bch, data, data_length, ecc, NULL, NULL,
+ errloc);
+
+ free_bch(bch);
+ if (errors < 0) {
+ free(errloc);
+ return -1;
+ }
+
+ if (errors > 0) {
+ for (int n = 0; n < errors; n++) {
+ if (errloc[n] >= 8 * data_length) {
+ /*
+ * n-th error located in ecc (no need for data
+ * correction)
+ */
+ } else {
+ /* n-th error located in data */
+ data[errloc[n] / 8] ^= 1 << (errloc[n] % 8);
+ }
+ }
+ }
+
+ free(errloc);
+ return 0;
+}
+
+static const int ID;
+static const int LEN = 1;
+static const int VER = 2;
+static const int TYP = 3;
+static const int BLOCK_SIZE = 4;
+
+static const u8 HEADER_BLOCK_ID;
+static const u8 HEADER_BLOCK_LEN = 18;
+static const u32 HEADER_BLOCK_MAGIC = 0xca53ca53;
+static const size_t HEADER_BLOCK_VERIFY_LEN = 14;
+static const size_t HEADER_BLOCK_ECC_OFF = 14;
+static const size_t HEADER_BLOCK_ECC_LEN = 4;
+
+static const u8 ECC_BLOCK_ID = 0xFF;
+
+int vpd_reader(size_t size, u8 *data, void *userdata,
+ int (*fn)(void *userdata, u8 id, u8 version, u8 type,
+ size_t size, u8 const *data))
+{
+ if (size < HEADER_BLOCK_LEN || !data || !fn)
+ return -EINVAL;
+
+ /*
+ * +--------------------+----------------+--//--+--------------------+
+ * | header block | data block | ... | ecc block |
+ * +--------------------+----------------+--//--+--------------------+
+ * : : :
+ * +------+-------+-----+ +------+-------------+
+ * | id | magic | ecc | | ... | ecc |
+ * | len | off | | +------+-------------+
+ * | ver | size | | :
+ * | type | | | :
+ * +------+-------+-----+ :
+ * : : : :
+ * <----- [1] ----> <--------- [2] --------->
+ *
+ * Repair (if necessary) the contents of header block [1] by using a
+ * 4 byte ECC located at the end of the header block. A successful
+ * return value means that we can trust the header.
+ */
+ int ret = verify_bch(bch_configuration.header_ecc_capability_bits,
+ bch_configuration.prim_poly, data,
+ HEADER_BLOCK_VERIFY_LEN,
+ &data[HEADER_BLOCK_ECC_OFF], HEADER_BLOCK_ECC_LEN);
+ if (ret < 0)
+ return ret;
+
+ /* Validate header block { id, length, version, type }. */
+ if (data[ID] != HEADER_BLOCK_ID || data[LEN] != HEADER_BLOCK_LEN ||
+ data[VER] != 0 || data[TYP] != 0 ||
+ ntohl(*(u32 *)(&data[4])) != HEADER_BLOCK_MAGIC)
+ return -EINVAL;
+
+ u32 offset = ntohl(*(u32 *)(&data[8]));
+ u16 size_bits = ntohs(*(u16 *)(&data[12]));
+
+ /* Check that ECC header fits. */
+ if (offset + 3 >= size)
+ return -EINVAL;
+
+ /* Validate ECC block. */
+ u8 *ecc = &data[offset];
+
+ if (ecc[ID] != ECC_BLOCK_ID || ecc[LEN] < BLOCK_SIZE ||
+ ecc[LEN] + offset > size ||
+ ecc[LEN] - BLOCK_SIZE != size_bits / 8 || ecc[VER] != 1 ||
+ ecc[TYP] != 1)
+ return -EINVAL;
+
+ /*
+ * Use the header block to locate the ECC block and verify the data
+ * blocks [2] against the ecc block ECC.
+ */
+ ret = verify_bch(bch_configuration.data_ecc_capability_bits,
+ bch_configuration.prim_poly, &data[data[LEN]],
+ offset - data[LEN], &data[offset + BLOCK_SIZE],
+ ecc[LEN] - BLOCK_SIZE);
+ if (ret < 0)
+ return ret;
+
+ /* Stop after ECC. Ignore possible zero padding. */
+ size = offset;
+
+ for (;;) {
+ /* Move to next block. */
+ size -= data[LEN];
+ data += data[LEN];
+
+ if (size == 0) {
+ /* Finished iterating through blocks. */
+ return 0;
+ }
+
+ if (size < BLOCK_SIZE || data[LEN] < BLOCK_SIZE) {
+ /* Not enough data for a header, or short header. */
+ return -EINVAL;
+ }
+
+ ret = fn(userdata, data[ID], data[VER], data[TYP],
+ data[LEN] - BLOCK_SIZE, &data[BLOCK_SIZE]);
+ if (ret)
+ return ret;
+ }
+}
diff --git a/board/ge/common/vpd_reader.h b/board/ge/common/vpd_reader.h
new file mode 100644
index 0000000..4abba8f
--- /dev/null
+++ b/board/ge/common/vpd_reader.h
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2016 General Electric Company
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "common.h"
+
+/*
+ * Read VPD from given data, verify content, and call callback
+ * for each vital product data block.
+ *
+ * Returns Non-zero on error. Negative numbers encode errno.
+ */
+int vpd_reader(size_t size, u8 *data, void *userdata,
+ int (*fn)(void *userdata, u8 id, u8 version, u8 type,
+ size_t size, u8 const *data));
--
2.1.4
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [U-Boot] [PATCH v5 7/8] board: ge: make VPD code common
2017-11-08 15:35 ` [U-Boot] [PATCH v5 7/8] board: ge: make VPD code common Martyn Welch
@ 2017-11-09 9:27 ` Stefano Babic
0 siblings, 0 replies; 15+ messages in thread
From: Stefano Babic @ 2017-11-09 9:27 UTC (permalink / raw)
To: u-boot
On 08/11/2017 16:35, Martyn Welch wrote:
> The VPD data is used on a number of GE products. Move the parsing code to
> a common location so that we can share this code.
>
> Signed-off-by: Martyn Welch <martyn.welch@collabora.co.uk>
> ---
> Changes in v4:
> - New patch.
>
> Changes in v5:
> - Fixed checkpatch issues.
>
> board/ge/bx50v3/Makefile | 2 +-
> board/ge/bx50v3/bx50v3.c | 2 +-
> board/ge/bx50v3/vpd_reader.c | 228 -------------------------------------------
> board/ge/bx50v3/vpd_reader.h | 25 -----
> board/ge/common/Makefile | 7 ++
> board/ge/common/vpd_reader.c | 197 +++++++++++++++++++++++++++++++++++++
> board/ge/common/vpd_reader.h | 17 ++++
> 7 files changed, 223 insertions(+), 255 deletions(-)
> delete mode 100644 board/ge/bx50v3/vpd_reader.c
> delete mode 100644 board/ge/bx50v3/vpd_reader.h
> create mode 100644 board/ge/common/Makefile
> create mode 100644 board/ge/common/vpd_reader.c
> create mode 100644 board/ge/common/vpd_reader.h
>
> diff --git a/board/ge/bx50v3/Makefile b/board/ge/bx50v3/Makefile
> index 2fff27b..bcd149f 100644
> --- a/board/ge/bx50v3/Makefile
> +++ b/board/ge/bx50v3/Makefile
> @@ -5,4 +5,4 @@
> # SPDX-License-Identifier: GPL-2.0+
> #
>
> -obj-y := bx50v3.o vpd_reader.o
> +obj-y := bx50v3.o
> diff --git a/board/ge/bx50v3/bx50v3.c b/board/ge/bx50v3/bx50v3.c
> index 2e8f394..37de990 100644
> --- a/board/ge/bx50v3/bx50v3.c
> +++ b/board/ge/bx50v3/bx50v3.c
> @@ -28,7 +28,7 @@
> #include <input.h>
> #include <pwm.h>
> #include <stdlib.h>
> -#include "vpd_reader.h"
> +#include "../common/vpd_reader.h"
> DECLARE_GLOBAL_DATA_PTR;
>
> #ifndef CONFIG_SYS_I2C_EEPROM_ADDR
> diff --git a/board/ge/bx50v3/vpd_reader.c b/board/ge/bx50v3/vpd_reader.c
> deleted file mode 100644
> index 98da893..0000000
> --- a/board/ge/bx50v3/vpd_reader.c
> +++ /dev/null
> @@ -1,228 +0,0 @@
> -/*
> - * Copyright 2016 General Electric Company
> - *
> - * SPDX-License-Identifier: GPL-2.0+
> - */
> -
> -#include "vpd_reader.h"
> -
> -#include <linux/bch.h>
> -#include <stdlib.h>
> -
> -
> -/* BCH configuration */
> -
> -const struct {
> - int header_ecc_capability_bits;
> - int data_ecc_capability_bits;
> - unsigned int prim_poly;
> - struct {
> - int min;
> - int max;
> - } galois_field_order;
> -} bch_configuration = {
> - .header_ecc_capability_bits = 4,
> - .data_ecc_capability_bits = 16,
> - .prim_poly = 0,
> - .galois_field_order = {
> - .min = 5,
> - .max = 15,
> - },
> -};
> -
> -static int calculate_galois_field_order(size_t source_length)
> -{
> - int gfo = bch_configuration.galois_field_order.min;
> -
> - for (; gfo < bch_configuration.galois_field_order.max &&
> - ((((1 << gfo) - 1) - ((int)source_length * 8)) < 0);
> - gfo++) {
> - }
> -
> - if (gfo == bch_configuration.galois_field_order.max) {
> - return -1;
> - }
> -
> - return gfo + 1;
> -}
> -
> -static int verify_bch(int ecc_bits, unsigned int prim_poly,
> - uint8_t * data, size_t data_length,
> - const uint8_t * ecc, size_t ecc_length)
> -{
> - int gfo = calculate_galois_field_order(data_length);
> - if (gfo < 0) {
> - return -1;
> - }
> -
> - struct bch_control * bch = init_bch(gfo, ecc_bits, prim_poly);
> - if (!bch) {
> - return -1;
> - }
> -
> - if (bch->ecc_bytes != ecc_length) {
> - free_bch(bch);
> - return -1;
> - }
> -
> - unsigned * errloc = (unsigned *)calloc(data_length, sizeof(unsigned));
> - int errors = decode_bch(
> - bch, data, data_length, ecc, NULL, NULL, errloc);
> - free_bch(bch);
> - if (errors < 0) {
> - free(errloc);
> - return -1;
> - }
> -
> - if (errors > 0) {
> - for (int n = 0; n < errors; n++) {
> - if (errloc[n] >= 8 * data_length) {
> - /* n-th error located in ecc (no need for data correction) */
> - } else {
> - /* n-th error located in data */
> - data[errloc[n] / 8] ^= 1 << (errloc[n] % 8);
> - }
> - }
> - }
> -
> - free(errloc);
> - return 0;
> -}
> -
> -
> -static const int ID = 0;
> -static const int LEN = 1;
> -static const int VER = 2;
> -static const int TYP = 3;
> -static const int BLOCK_SIZE = 4;
> -
> -static const uint8_t HEADER_BLOCK_ID = 0x00;
> -static const uint8_t HEADER_BLOCK_LEN = 18;
> -static const uint32_t HEADER_BLOCK_MAGIC = 0xca53ca53;
> -static const size_t HEADER_BLOCK_VERIFY_LEN = 14;
> -static const size_t HEADER_BLOCK_ECC_OFF = 14;
> -static const size_t HEADER_BLOCK_ECC_LEN = 4;
> -
> -static const uint8_t ECC_BLOCK_ID = 0xFF;
> -
> -int vpd_reader(
> - size_t size,
> - uint8_t * data,
> - void * userdata,
> - int (*fn)(
> - void * userdata,
> - uint8_t id,
> - uint8_t version,
> - uint8_t type,
> - size_t size,
> - uint8_t const * data))
> -{
> - if ( size < HEADER_BLOCK_LEN
> - || data == NULL
> - || fn == NULL) {
> - return -EINVAL;
> - }
> -
> - /*
> - * +--------------------+--------------------+--//--+--------------------+
> - * | header block | data block | ... | ecc block |
> - * +--------------------+--------------------+--//--+--------------------+
> - * : : :
> - * +------+-------+-----+ +------+-------------+
> - * | id | magic | ecc | | ... | ecc |
> - * | len | off | | +------+-------------+
> - * | ver | size | | :
> - * | type | | | :
> - * +------+-------+-----+ :
> - * : : : :
> - * <----- [1] ----> <----------- [2] ----------->
> - *
> - * Repair (if necessary) the contents of header block [1] by using a
> - * 4 byte ECC located at the end of the header block. A successful
> - * return value means that we can trust the header.
> - */
> - int ret = verify_bch(
> - bch_configuration.header_ecc_capability_bits,
> - bch_configuration.prim_poly,
> - data,
> - HEADER_BLOCK_VERIFY_LEN,
> - &data[HEADER_BLOCK_ECC_OFF],
> - HEADER_BLOCK_ECC_LEN);
> - if (ret < 0) {
> - return ret;
> - }
> -
> - /* Validate header block { id, length, version, type }. */
> - if ( data[ID] != HEADER_BLOCK_ID
> - || data[LEN] != HEADER_BLOCK_LEN
> - || data[VER] != 0
> - || data[TYP] != 0
> - || ntohl(*(uint32_t *)(&data[4])) != HEADER_BLOCK_MAGIC) {
> - return -EINVAL;
> - }
> -
> - uint32_t offset = ntohl(*(uint32_t *)(&data[8]));
> - uint16_t size_bits = ntohs(*(uint16_t *)(&data[12]));
> -
> - /* Check that ECC header fits. */
> - if (offset + 3 >= size) {
> - return -EINVAL;
> - }
> -
> - /* Validate ECC block. */
> - uint8_t * ecc = &data[offset];
> - if ( ecc[ID] != ECC_BLOCK_ID
> - || ecc[LEN] < BLOCK_SIZE
> - || ecc[LEN] + offset > size
> - || ecc[LEN] - BLOCK_SIZE != size_bits / 8
> - || ecc[VER] != 1
> - || ecc[TYP] != 1) {
> - return -EINVAL;
> - }
> -
> - /*
> - * Use the header block to locate the ECC block and verify the data
> - * blocks [2] against the ecc block ECC.
> - */
> - ret = verify_bch(
> - bch_configuration.data_ecc_capability_bits,
> - bch_configuration.prim_poly,
> - &data[data[LEN]],
> - offset - data[LEN],
> - &data[offset + BLOCK_SIZE],
> - ecc[LEN] - BLOCK_SIZE);
> - if (ret < 0) {
> - return ret;
> - }
> -
> - /* Stop after ECC. Ignore possible zero padding. */
> - size = offset;
> -
> - for (;;) {
> - /* Move to next block. */
> - size -= data[LEN];
> - data += data[LEN];
> -
> - if (size == 0) {
> - /* Finished iterating through blocks. */
> - return 0;
> - }
> -
> - if ( size < BLOCK_SIZE
> - || data[LEN] < BLOCK_SIZE) {
> - /* Not enough data for a header, or short header. */
> - return -EINVAL;
> - }
> -
> - ret = fn(
> - userdata,
> - data[ID],
> - data[VER],
> - data[TYP],
> - data[LEN] - BLOCK_SIZE,
> - &data[BLOCK_SIZE]);
> - if (ret) {
> - return ret;
> - }
> - }
> -}
> diff --git a/board/ge/bx50v3/vpd_reader.h b/board/ge/bx50v3/vpd_reader.h
> deleted file mode 100644
> index efa172a..0000000
> --- a/board/ge/bx50v3/vpd_reader.h
> +++ /dev/null
> @@ -1,25 +0,0 @@
> -/*
> - * Copyright 2016 General Electric Company
> - *
> - * SPDX-License-Identifier: GPL-2.0+
> - */
> -
> -#include "common.h"
> -
> -/*
> - * Read VPD from given data, verify content, and call callback
> - * for each vital product data block.
> - *
> - * Returns Non-zero on error. Negative numbers encode errno.
> - */
> -int vpd_reader(
> - size_t size,
> - uint8_t * data,
> - void * userdata,
> - int (*fn)(
> - void * userdata,
> - uint8_t id,
> - uint8_t version,
> - uint8_t type,
> - size_t size,
> - uint8_t const * data));
> diff --git a/board/ge/common/Makefile b/board/ge/common/Makefile
> new file mode 100644
> index 0000000..93e6c01
> --- /dev/null
> +++ b/board/ge/common/Makefile
> @@ -0,0 +1,7 @@
> +#
> +# Copyright 2017 General Electric Company
> +#
> +# SPDX-License-Identifier: GPL-2.0+
> +#
> +
> +obj-y := vpd_reader.o
> diff --git a/board/ge/common/vpd_reader.c b/board/ge/common/vpd_reader.c
> new file mode 100644
> index 0000000..7367427
> --- /dev/null
> +++ b/board/ge/common/vpd_reader.c
> @@ -0,0 +1,197 @@
> +/*
> + * Copyright 2016 General Electric Company
> + *
> + * SPDX-License-Identifier: GPL-2.0+
> + */
> +
> +#include "vpd_reader.h"
> +
> +#include <linux/bch.h>
> +#include <stdlib.h>
> +
> +/* BCH configuration */
> +
> +const struct {
> + int header_ecc_capability_bits;
> + int data_ecc_capability_bits;
> + unsigned int prim_poly;
> + struct {
> + int min;
> + int max;
> + } galois_field_order;
> +} bch_configuration = {
> + .header_ecc_capability_bits = 4,
> + .data_ecc_capability_bits = 16,
> + .prim_poly = 0,
> + .galois_field_order = {
> + .min = 5,
> + .max = 15,
> + },
> +};
> +
> +static int calculate_galois_field_order(size_t source_length)
> +{
> + int gfo = bch_configuration.galois_field_order.min;
> +
> + for (; gfo < bch_configuration.galois_field_order.max &&
> + ((((1 << gfo) - 1) - ((int)source_length * 8)) < 0);
> + gfo++) {
> + }
> +
> + if (gfo == bch_configuration.galois_field_order.max)
> + return -1;
> +
> + return gfo + 1;
> +}
> +
> +static int verify_bch(int ecc_bits, unsigned int prim_poly, u8 *data,
> + size_t data_length, const u8 *ecc, size_t ecc_length)
> +{
> + int gfo = calculate_galois_field_order(data_length);
> +
> + if (gfo < 0)
> + return -1;
> +
> + struct bch_control *bch = init_bch(gfo, ecc_bits, prim_poly);
> +
> + if (!bch)
> + return -1;
> +
> + if (bch->ecc_bytes != ecc_length) {
> + free_bch(bch);
> + return -1;
> + }
> +
> + unsigned int *errloc = (unsigned int *)calloc(data_length,
> + sizeof(unsigned int));
> + int errors = decode_bch(bch, data, data_length, ecc, NULL, NULL,
> + errloc);
> +
> + free_bch(bch);
> + if (errors < 0) {
> + free(errloc);
> + return -1;
> + }
> +
> + if (errors > 0) {
> + for (int n = 0; n < errors; n++) {
> + if (errloc[n] >= 8 * data_length) {
> + /*
> + * n-th error located in ecc (no need for data
> + * correction)
> + */
> + } else {
> + /* n-th error located in data */
> + data[errloc[n] / 8] ^= 1 << (errloc[n] % 8);
> + }
> + }
> + }
> +
> + free(errloc);
> + return 0;
> +}
> +
> +static const int ID;
> +static const int LEN = 1;
> +static const int VER = 2;
> +static const int TYP = 3;
> +static const int BLOCK_SIZE = 4;
> +
> +static const u8 HEADER_BLOCK_ID;
> +static const u8 HEADER_BLOCK_LEN = 18;
> +static const u32 HEADER_BLOCK_MAGIC = 0xca53ca53;
> +static const size_t HEADER_BLOCK_VERIFY_LEN = 14;
> +static const size_t HEADER_BLOCK_ECC_OFF = 14;
> +static const size_t HEADER_BLOCK_ECC_LEN = 4;
> +
> +static const u8 ECC_BLOCK_ID = 0xFF;
> +
> +int vpd_reader(size_t size, u8 *data, void *userdata,
> + int (*fn)(void *userdata, u8 id, u8 version, u8 type,
> + size_t size, u8 const *data))
> +{
> + if (size < HEADER_BLOCK_LEN || !data || !fn)
> + return -EINVAL;
> +
> + /*
> + * +--------------------+----------------+--//--+--------------------+
> + * | header block | data block | ... | ecc block |
> + * +--------------------+----------------+--//--+--------------------+
> + * : : :
> + * +------+-------+-----+ +------+-------------+
> + * | id | magic | ecc | | ... | ecc |
> + * | len | off | | +------+-------------+
> + * | ver | size | | :
> + * | type | | | :
> + * +------+-------+-----+ :
> + * : : : :
> + * <----- [1] ----> <--------- [2] --------->
> + *
> + * Repair (if necessary) the contents of header block [1] by using a
> + * 4 byte ECC located at the end of the header block. A successful
> + * return value means that we can trust the header.
> + */
> + int ret = verify_bch(bch_configuration.header_ecc_capability_bits,
> + bch_configuration.prim_poly, data,
> + HEADER_BLOCK_VERIFY_LEN,
> + &data[HEADER_BLOCK_ECC_OFF], HEADER_BLOCK_ECC_LEN);
> + if (ret < 0)
> + return ret;
> +
> + /* Validate header block { id, length, version, type }. */
> + if (data[ID] != HEADER_BLOCK_ID || data[LEN] != HEADER_BLOCK_LEN ||
> + data[VER] != 0 || data[TYP] != 0 ||
> + ntohl(*(u32 *)(&data[4])) != HEADER_BLOCK_MAGIC)
> + return -EINVAL;
> +
> + u32 offset = ntohl(*(u32 *)(&data[8]));
> + u16 size_bits = ntohs(*(u16 *)(&data[12]));
> +
> + /* Check that ECC header fits. */
> + if (offset + 3 >= size)
> + return -EINVAL;
> +
> + /* Validate ECC block. */
> + u8 *ecc = &data[offset];
> +
> + if (ecc[ID] != ECC_BLOCK_ID || ecc[LEN] < BLOCK_SIZE ||
> + ecc[LEN] + offset > size ||
> + ecc[LEN] - BLOCK_SIZE != size_bits / 8 || ecc[VER] != 1 ||
> + ecc[TYP] != 1)
> + return -EINVAL;
> +
> + /*
> + * Use the header block to locate the ECC block and verify the data
> + * blocks [2] against the ecc block ECC.
> + */
> + ret = verify_bch(bch_configuration.data_ecc_capability_bits,
> + bch_configuration.prim_poly, &data[data[LEN]],
> + offset - data[LEN], &data[offset + BLOCK_SIZE],
> + ecc[LEN] - BLOCK_SIZE);
> + if (ret < 0)
> + return ret;
> +
> + /* Stop after ECC. Ignore possible zero padding. */
> + size = offset;
> +
> + for (;;) {
> + /* Move to next block. */
> + size -= data[LEN];
> + data += data[LEN];
> +
> + if (size == 0) {
> + /* Finished iterating through blocks. */
> + return 0;
> + }
> +
> + if (size < BLOCK_SIZE || data[LEN] < BLOCK_SIZE) {
> + /* Not enough data for a header, or short header. */
> + return -EINVAL;
> + }
> +
> + ret = fn(userdata, data[ID], data[VER], data[TYP],
> + data[LEN] - BLOCK_SIZE, &data[BLOCK_SIZE]);
> + if (ret)
> + return ret;
> + }
> +}
> diff --git a/board/ge/common/vpd_reader.h b/board/ge/common/vpd_reader.h
> new file mode 100644
> index 0000000..4abba8f
> --- /dev/null
> +++ b/board/ge/common/vpd_reader.h
> @@ -0,0 +1,17 @@
> +/*
> + * Copyright 2016 General Electric Company
> + *
> + * SPDX-License-Identifier: GPL-2.0+
> + */
> +
> +#include "common.h"
> +
> +/*
> + * Read VPD from given data, verify content, and call callback
> + * for each vital product data block.
> + *
> + * Returns Non-zero on error. Negative numbers encode errno.
> + */
> +int vpd_reader(size_t size, u8 *data, void *userdata,
> + int (*fn)(void *userdata, u8 id, u8 version, u8 type,
> + size_t size, u8 const *data));
>
Acked-by: Stefano Babic <sbabic@denx.de>
Best regards,
Stefano Babic
--
=====================================================================
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================
^ permalink raw reply [flat|nested] 15+ messages in thread
* [U-Boot] [PATCH v5 0/8] Add support for GE PPD
2017-11-08 15:35 [U-Boot] [PATCH v5 0/8] Add support for GE PPD Martyn Welch
` (6 preceding siblings ...)
2017-11-08 15:35 ` [U-Boot] [PATCH v5 7/8] board: ge: make VPD code common Martyn Welch
@ 2017-11-09 10:19 ` Lukasz Majewski
2017-11-09 11:50 ` Martyn Welch
7 siblings, 1 reply; 15+ messages in thread
From: Lukasz Majewski @ 2017-11-09 10:19 UTC (permalink / raw)
To: u-boot
Hi Martyn,
> *** Resend due to previous use of unsubscribed email address ***
Just a small remark.
You may consider using patman to get the list of u-boot community peers
to be CC'ed for your patch. Or at least look for a custodian (in
MAINTAINERS) responsible to IMX (NXP) SoC part of u-boot (in this case
Stefano Babic or Fabio Estevam).
The problem with sending code only to u-boot ML is that it may be
overlooked by people, who are the best candidates to review it.
>
> This series adds support for the GE PPD. The initial patches in this
> series resolve issues found during development and testing, extend
> existing support and add new support for devices in the PPD. The final
> patch in the series adds the board support for the PPD.
>
> Ian Ray (2):
> ext4: recover from filesystem corruption when reading
> bootcount: add support for bootcounter on EXT filesystem
>
> Martyn Welch (3):
> pwm: imx: Enable PWM support on i.MX53
> arm: mx5: Add more register definitions
> board: ge: make VPD code common
>
> Nandor Han (2):
> imx: mxc_i2c: tweak the i2c transfer method
> rtc: add support for s35392a
>
> Peter Senna Tschudin (1):
> mx53: Add Board support for GE PPD
>
> README | 7 +
> arch/arm/include/asm/arch-mx5/crm_regs.h | 8 +
> arch/arm/include/asm/arch-mx5/imx-regs.h | 50 ++++
> arch/arm/mach-imx/mx5/Kconfig | 7 +
> board/ge/bx50v3/Makefile | 2 +-
> board/ge/bx50v3/bx50v3.c | 2 +-
> board/ge/bx50v3/vpd_reader.c | 228 ---------------
> board/ge/bx50v3/vpd_reader.h | 25 --
> board/ge/common/Makefile | 7 +
> board/ge/common/vpd_reader.c | 197 +++++++++++++
> board/ge/common/vpd_reader.h | 17 ++
> board/ge/mx53ppd/Kconfig | 17 ++
> board/ge/mx53ppd/MAINTAINERS | 7 +
> board/ge/mx53ppd/Makefile | 12 +
> board/ge/mx53ppd/imximage.cfg | 87 ++++++
> board/ge/mx53ppd/mx53ppd.c | 457
> +++++++++++++++++++++++++++++++
> board/ge/mx53ppd/mx53ppd_video.c | 135 +++++++++
> board/ge/mx53ppd/ppd_gpio.h | 96 +++++++
> configs/mx53ppd_defconfig | 39 +++
> drivers/Kconfig | 2 +
> drivers/bootcount/Kconfig | 58 ++++
> drivers/bootcount/Makefile | 1 +
> drivers/bootcount/bootcount_ext.c | 62 +++++
> drivers/i2c/mxc_i2c.c | 25 +-
> drivers/pwm/pwm-imx-util.c | 2 +
> drivers/rtc/Kconfig | 6 +
> drivers/rtc/Makefile | 1 +
> drivers/rtc/s35392a.c | 365
> ++++++++++++++++++++++++ fs/ext4/ext4_common.c |
> 10 + fs/ext4/ext4fs.c | 10 +-
> include/configs/mx53ppd.h | 248 +++++++++++++++++
> lib/Kconfig | 3 + 32 files changed,
> 1927 insertions(+), 266 deletions(-) delete mode 100644
> board/ge/bx50v3/vpd_reader.c delete mode 100644
> board/ge/bx50v3/vpd_reader.h create mode 100644
> board/ge/common/Makefile create mode 100644
> board/ge/common/vpd_reader.c create mode 100644
> board/ge/common/vpd_reader.h create mode 100644
> board/ge/mx53ppd/Kconfig create mode 100644
> board/ge/mx53ppd/MAINTAINERS create mode 100644
> board/ge/mx53ppd/Makefile create mode 100644
> board/ge/mx53ppd/imximage.cfg create mode 100644
> board/ge/mx53ppd/mx53ppd.c create mode 100644
> board/ge/mx53ppd/mx53ppd_video.c create mode 100644
> board/ge/mx53ppd/ppd_gpio.h create mode 100644
> configs/mx53ppd_defconfig create mode 100644 drivers/bootcount/Kconfig
> create mode 100644 drivers/bootcount/bootcount_ext.c
> create mode 100644 drivers/rtc/s35392a.c
> create mode 100644 include/configs/mx53ppd.h
>
Best regards,
Lukasz Majewski
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20171109/e2321c45/attachment.sig>
^ permalink raw reply [flat|nested] 15+ messages in thread
* [U-Boot] [PATCH v5 0/8] Add support for GE PPD
2017-11-09 10:19 ` [U-Boot] [PATCH v5 0/8] Add support for GE PPD Lukasz Majewski
@ 2017-11-09 11:50 ` Martyn Welch
0 siblings, 0 replies; 15+ messages in thread
From: Martyn Welch @ 2017-11-09 11:50 UTC (permalink / raw)
To: u-boot
On Thu, 2017-11-09 at 11:19 +0100, Lukasz Majewski wrote:
> Hi Martyn,
>
> > *** Resend due to previous use of unsubscribed email address ***
>
> Just a small remark.
>
> You may consider using patman to get the list of u-boot community peers
> to be CC'ed for your patch. Or at least look for a custodian (in
> MAINTAINERS) responsible to IMX (NXP) SoC part of u-boot (in this case
> Stefano Babic or Fabio Estevam).
>
Ah, OK, I ran get_maintainers and CCed anyone specifically flagged as a
maintainer (which is what I understood to be good practice from the
U-Boot wiki).
I'll bear this in mind and CC those that have made significant
contributions next time.
> The problem with sending code only to u-boot ML is that it may be
> overlooked by people, who are the best candidates to review it.
>
> >
> > This series adds support for the GE PPD. The initial patches in this
> > series resolve issues found during development and testing, extend
> > existing support and add new support for devices in the PPD. The final
> > patch in the series adds the board support for the PPD.
> >
> > Ian Ray (2):
> > ext4: recover from filesystem corruption when reading
> > bootcount: add support for bootcounter on EXT filesystem
> >
> > Martyn Welch (3):
> > pwm: imx: Enable PWM support on i.MX53
> > arm: mx5: Add more register definitions
> > board: ge: make VPD code common
> >
> > Nandor Han (2):
> > imx: mxc_i2c: tweak the i2c transfer method
> > rtc: add support for s35392a
> >
> > Peter Senna Tschudin (1):
> > mx53: Add Board support for GE PPD
> >
> > README | 7 +
> > arch/arm/include/asm/arch-mx5/crm_regs.h | 8 +
> > arch/arm/include/asm/arch-mx5/imx-regs.h | 50 ++++
> > arch/arm/mach-imx/mx5/Kconfig | 7 +
> > board/ge/bx50v3/Makefile | 2 +-
> > board/ge/bx50v3/bx50v3.c | 2 +-
> > board/ge/bx50v3/vpd_reader.c | 228 ---------------
> > board/ge/bx50v3/vpd_reader.h | 25 --
> > board/ge/common/Makefile | 7 +
> > board/ge/common/vpd_reader.c | 197 +++++++++++++
> > board/ge/common/vpd_reader.h | 17 ++
> > board/ge/mx53ppd/Kconfig | 17 ++
> > board/ge/mx53ppd/MAINTAINERS | 7 +
> > board/ge/mx53ppd/Makefile | 12 +
> > board/ge/mx53ppd/imximage.cfg | 87 ++++++
> > board/ge/mx53ppd/mx53ppd.c | 457
> > +++++++++++++++++++++++++++++++
> > board/ge/mx53ppd/mx53ppd_video.c | 135 +++++++++
> > board/ge/mx53ppd/ppd_gpio.h | 96 +++++++
> > configs/mx53ppd_defconfig | 39 +++
> > drivers/Kconfig | 2 +
> > drivers/bootcount/Kconfig | 58 ++++
> > drivers/bootcount/Makefile | 1 +
> > drivers/bootcount/bootcount_ext.c | 62 +++++
> > drivers/i2c/mxc_i2c.c | 25 +-
> > drivers/pwm/pwm-imx-util.c | 2 +
> > drivers/rtc/Kconfig | 6 +
> > drivers/rtc/Makefile | 1 +
> > drivers/rtc/s35392a.c | 365
> > ++++++++++++++++++++++++ fs/ext4/ext4_common.c |
> > 10 + fs/ext4/ext4fs.c | 10 +-
> > include/configs/mx53ppd.h | 248 +++++++++++++++++
> > lib/Kconfig | 3 + 32 files changed,
> > 1927 insertions(+), 266 deletions(-) delete mode 100644
> > board/ge/bx50v3/vpd_reader.c delete mode 100644
> > board/ge/bx50v3/vpd_reader.h create mode 100644
> > board/ge/common/Makefile create mode 100644
> > board/ge/common/vpd_reader.c create mode 100644
> > board/ge/common/vpd_reader.h create mode 100644
> > board/ge/mx53ppd/Kconfig create mode 100644
> > board/ge/mx53ppd/MAINTAINERS create mode 100644
> > board/ge/mx53ppd/Makefile create mode 100644
> > board/ge/mx53ppd/imximage.cfg create mode 100644
> > board/ge/mx53ppd/mx53ppd.c create mode 100644
> > board/ge/mx53ppd/mx53ppd_video.c create mode 100644
> > board/ge/mx53ppd/ppd_gpio.h create mode 100644
> > configs/mx53ppd_defconfig create mode 100644 drivers/bootcount/Kconfig
> > create mode 100644 drivers/bootcount/bootcount_ext.c
> > create mode 100644 drivers/rtc/s35392a.c
> > create mode 100644 include/configs/mx53ppd.h
> >
>
>
>
> Best regards,
>
> Lukasz Majewski
>
> --
>
> DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
^ permalink raw reply [flat|nested] 15+ messages in thread