diff options
51 files changed, 561 insertions, 286 deletions
@@ -983,7 +983,7 @@ ifneq ($(CONFIG_DM_MMC)$(CONFIG_OF_CONTROL)$(CONFIG_BLK),yyy) @echo >&2 "This board does not use CONFIG_DM_MMC. Please update" @echo >&2 "the board to use CONFIG_DM_MMC before the v2019.04 release." @echo >&2 "Failure to update by the deadline may result in board removal." - @echo >&2 "See doc/driver-model/MIGRATION.txt for more info." + @echo >&2 "See doc/driver-model/migration.rst for more info." @echo >&2 "====================================================" endif endif @@ -993,7 +993,7 @@ ifneq ($(CONFIG_DM_USB)$(CONFIG_OF_CONTROL)$(CONFIG_BLK),yyy) @echo >&2 "This board does not use CONFIG_DM_USB. Please update" @echo >&2 "the board to use CONFIG_DM_USB before the v2019.07 release." @echo >&2 "Failure to update by the deadline may result in board removal." - @echo >&2 "See doc/driver-model/MIGRATION.txt for more info." + @echo >&2 "See doc/driver-model/migration.rst for more info." @echo >&2 "====================================================" endif endif @@ -1004,7 +1004,7 @@ ifeq ($(CONFIG_MVSATA_IDE),y) @echo >&2 "controller driver to use CONFIG_AHCI before the v2019.07" @echo >&2 "release." @echo >&2 "Failure to update by the deadline may result in board removal." - @echo >&2 "See doc/driver-model/MIGRATION.txt for more info." + @echo >&2 "See doc/driver-model/migration.rst for more info." @echo >&2 "====================================================" endif ifeq ($(CONFIG_LIBATA),y) @@ -1014,7 +1014,7 @@ ifneq ($(CONFIG_AHCI),y) @echo >&2 "enabled. Please update the storage controller driver to use" @echo >&2 "CONFIG_AHCI before the v2019.07 release." @echo >&2 "Failure to update by the deadline may result in board removal." - @echo >&2 "See doc/driver-model/MIGRATION.txt for more info." + @echo >&2 "See doc/driver-model/migration.rst for more info." @echo >&2 "====================================================" endif endif @@ -1024,7 +1024,7 @@ ifneq ($(CONFIG_DM_PCI),y) @echo >&2 "This board does not use CONFIG_DM_PCI Please update" @echo >&2 "the board to use CONFIG_DM_PCI before the v2019.07 release." @echo >&2 "Failure to update by the deadline may result in board removal." - @echo >&2 "See doc/driver-model/MIGRATION.txt for more info." + @echo >&2 "See doc/driver-model/migration.rst for more info." @echo >&2 "====================================================" endif endif @@ -1034,7 +1034,7 @@ ifneq ($(CONFIG_DM_VIDEO),y) @echo >&2 "This board does not use CONFIG_DM_VIDEO Please update" @echo >&2 "the board to use CONFIG_DM_VIDEO before the v2019.07 release." @echo >&2 "Failure to update by the deadline may result in board removal." - @echo >&2 "See doc/driver-model/MIGRATION.txt for more info." + @echo >&2 "See doc/driver-model/migration.rst for more info." @echo >&2 "====================================================" endif endif @@ -1052,7 +1052,7 @@ ifneq ($(CONFIG_DM_SPI_FLASH)$(CONFIG_OF_CONTROL),yy) @echo >&2 "This board does not use CONFIG_DM_SPI_FLASH. Please update" @echo >&2 "the board to use CONFIG_SPI_FLASH before the v2019.07 release." @echo >&2 "Failure to update by the deadline may result in board removal." - @echo >&2 "See doc/driver-model/MIGRATION.txt for more info." + @echo >&2 "See doc/driver-model/migration.rst for more info." @echo >&2 "====================================================" endif endif @@ -1063,7 +1063,7 @@ ifneq ($(CONFIG_WDT),y) @echo >&2 "Please update the board to use CONFIG_WDT before the" @echo >&2 "v2019.10 release." @echo >&2 "Failure to update by the deadline may result in board removal." - @echo >&2 "See doc/driver-model/MIGRATION.txt for more info." + @echo >&2 "See doc/driver-model/migration.rst for more info." @echo >&2 "====================================================" endif endif diff --git a/arch/arm/dts/exynos4412-odroid.dts b/arch/arm/dts/exynos4412-odroid.dts index cc8e0dd041..ce08e8dc1e 100644 --- a/arch/arm/dts/exynos4412-odroid.dts +++ b/arch/arm/dts/exynos4412-odroid.dts @@ -17,7 +17,7 @@ serial0 = "/serial@13800000"; console = "/serial@13810000"; mmc0 = &mshc_0; - mmc1 = &sdhci2; + mmc2 = &sdhci2; }; serial@13810000 { @@ -236,6 +236,7 @@ &sdhci2 { samsung,bus-width = <4>; samsung,timing = <1 2 3>; + cd-inverted; cd-gpios = <&gpk2 2 0>; status = "okay"; }; diff --git a/arch/arm/dts/exynos5422-odroidxu3.dts b/arch/arm/dts/exynos5422-odroidxu3.dts index 6df6be9181..256df6d6c2 100644 --- a/arch/arm/dts/exynos5422-odroidxu3.dts +++ b/arch/arm/dts/exynos5422-odroidxu3.dts @@ -10,7 +10,7 @@ #include "exynos54xx.dtsi" / { - model = "Odroid XU3 based on EXYNOS5422"; + model = "Odroid XU3/XU4/HC1/HC2 based on Exynos5422"; compatible = "samsung,odroidxu3", "samsung,exynos5"; aliases { diff --git a/arch/arm/mach-exynos/include/mach/cpu.h b/arch/arm/mach-exynos/include/mach/cpu.h index 766edeeb29..fb5fdaf3ba 100644 --- a/arch/arm/mach-exynos/include/mach/cpu.h +++ b/arch/arm/mach-exynos/include/mach/cpu.h @@ -17,6 +17,7 @@ #define EXYNOS4_GPIO_PART3_BASE 0x03860000 #define EXYNOS4_PRO_ID 0x10000000 +#define EXYNOS4_OP_MODE 0x10000008 #define EXYNOS4_SYSREG_BASE 0x10010000 #define EXYNOS4_POWER_BASE 0x10020000 #define EXYNOS4_SWRESET 0x10020400 diff --git a/board/hisilicon/hikey/build-tf.mak b/board/hisilicon/hikey/build-tf.mak index cebb34b61b..cde04827e8 100644 --- a/board/hisilicon/hikey/build-tf.mak +++ b/board/hisilicon/hikey/build-tf.mak @@ -1,6 +1,6 @@ CROSS_COMPILE := aarch64-linux-gnu- output_dir := $(PWD)/../bin -makejobs := $(shell grep '^processor' /proc/cpuinfo | sort -u | wc -l) +makejobs := $(nproc) makethreads := $(shell dc -e "$(makejobs) 1 + p") make_options := GCC49_AARCH64_PREFIX=$CROSS_COMPILE \ -j$(makethreads) -l$(makejobs) diff --git a/board/hisilicon/poplar/MAINTAINERS b/board/hisilicon/poplar/MAINTAINERS index 622e5cb18e..9c045eaeb1 100644 --- a/board/hisilicon/poplar/MAINTAINERS +++ b/board/hisilicon/poplar/MAINTAINERS @@ -1,5 +1,5 @@ Poplar BOARD -M: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz@linaro.org> +M: Jorge Ramirez-Ortiz <jorge.ramirez.ortiz@gmail.com> M: Shawn Guo <shawn.guo@linaro.org> S: Maintained F: board/hisilicon/poplar diff --git a/board/qualcomm/dragonboard820c/MAINTAINERS b/board/qualcomm/dragonboard820c/MAINTAINERS index a157033bf0..7ef905bdf6 100644 --- a/board/qualcomm/dragonboard820c/MAINTAINERS +++ b/board/qualcomm/dragonboard820c/MAINTAINERS @@ -1,5 +1,5 @@ DRAGONBOARD820C BOARD -M: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz@linaro.org> +M: Jorge Ramirez-Ortiz <jorge.ramirez.ortiz@gmail.com> S: Maintained F: board/qualcomm/dragonboard820c/ F: include/configs/dragonboard820c.h diff --git a/board/samsung/common/board.c b/board/samsung/common/board.c index 5d4646d14c..390060e51f 100644 --- a/board/samsung/common/board.c +++ b/board/samsung/common/board.c @@ -25,6 +25,8 @@ #include <asm/arch/sromc.h> #include <lcd.h> #include <i2c.h> +#include <mmc.h> +#include <stdio_dev.h> #include <usb.h> #include <dwc3-uboot.h> #include <samsung/misc.h> @@ -43,6 +45,20 @@ __weak int exynos_power_init(void) return 0; } +/** + * get_boot_mmc_dev() - read boot MMC device id from XOM[7:5] pins. + */ +static int get_boot_mmc_dev(void) +{ + u32 mode = readl(EXYNOS4_OP_MODE) & 0x1C; + + if (mode == 0x04) + return 2; /* MMC2: SD */ + + /* MMC0: eMMC or unknown */ + return 0; +} + #if defined CONFIG_EXYNOS_TMU /* Boot Time Thermal Analysis for SoC temperature threshold breach */ static void boot_temp_check(void) @@ -281,6 +297,8 @@ int board_late_init(void) { struct udevice *dev; int ret; + int mmcbootdev = get_boot_mmc_dev(); + char mmcbootdev_str[16]; stdio_print_current_devices(); ret = uclass_first_device_err(UCLASS_CROS_EC, &dev); @@ -293,6 +311,11 @@ int board_late_init(void) panic("Cannot init cros-ec device"); return -1; } + + printf("Boot device: MMC(%u)\n", mmcbootdev); + sprintf(mmcbootdev_str, "%u", mmcbootdev); + env_set("mmcbootdev", mmcbootdev_str); + return 0; } #endif @@ -360,3 +383,8 @@ int board_usb_cleanup(int index, enum usb_init_type init) #endif return 0; } + +int mmc_get_env_dev(void) +{ + return get_boot_mmc_dev(); +} diff --git a/board/samsung/common/exynos5-dt-types.c b/board/samsung/common/exynos5-dt-types.c index 516c32923e..1413dc8978 100644 --- a/board/samsung/common/exynos5-dt-types.c +++ b/board/samsung/common/exynos5-dt-types.c @@ -67,7 +67,7 @@ static int odroid_get_adc_val(unsigned int *adcval) unsigned int adcval_prev = 0; int ret, retries = 20; - ret = adc_channel_single_shot("adc", CONFIG_ODROID_REV_AIN, + ret = adc_channel_single_shot("adc@12D10000", CONFIG_ODROID_REV_AIN, &adcval_prev); if (ret) return ret; @@ -75,8 +75,8 @@ static int odroid_get_adc_val(unsigned int *adcval) while (retries--) { mdelay(5); - ret = adc_channel_single_shot("adc", CONFIG_ODROID_REV_AIN, - adcval); + ret = adc_channel_single_shot("adc@12D10000", + CONFIG_ODROID_REV_AIN, adcval); if (ret) return ret; @@ -129,7 +129,7 @@ static const char *odroid_get_type_str(void) if (gd->board_type != EXYNOS5_BOARD_ODROID_XU3_REV02) goto exit; - ret = pmic_get("s2mps11", &dev); + ret = pmic_get("s2mps11_pmic@66", &dev); if (ret) goto exit; diff --git a/board/samsung/common/exynos5-dt.c b/board/samsung/common/exynos5-dt.c index 387d1b9180..eef46b0dc4 100644 --- a/board/samsung/common/exynos5-dt.c +++ b/board/samsung/common/exynos5-dt.c @@ -65,9 +65,9 @@ int exynos_power_init(void) int ret; #ifdef CONFIG_PMIC_S2MPS11 - ret = pmic_get("s2mps11_pmic", &dev); + ret = pmic_get("s2mps11_pmic@66", &dev); #else - ret = pmic_get("max77686", &dev); + ret = pmic_get("max77686_pmic@09", &dev); if (!ret) { /* TODO(sjg@chromium.org): Move into the clock/pmic API */ ret = pmic_clrsetbits(dev, MAX77686_REG_PMIC_32KHZ, 0, @@ -79,7 +79,7 @@ int exynos_power_init(void) if (ret) return ret; } else { - ret = pmic_get("s5m8767-pmic", &dev); + ret = pmic_get("s5m8767_pmic@66", &dev); /* TODO(sjg@chromium.org): Use driver model to access clock */ #ifdef CONFIG_PMIC_S5M8767 if (!ret) @@ -633,21 +633,6 @@ static int do_disk_guid(struct blk_desc *dev_desc, char * const namestr) } #ifdef CONFIG_CMD_GPT_RENAME -/* - * There are 3 malloc() calls in set_gpt_info() and there is no info about which - * failed. - */ -static void set_gpt_cleanup(char **str_disk_guid, - disk_partition_t **partitions) -{ -#ifdef CONFIG_RANDOM_UUID - if (str_disk_guid) - free(str_disk_guid); -#endif - if (partitions) - free(partitions); -} - static int do_rename_gpt_parts(struct blk_desc *dev_desc, char *subcomm, char *name1, char *name2) { @@ -655,7 +640,7 @@ static int do_rename_gpt_parts(struct blk_desc *dev_desc, char *subcomm, struct disk_part *curr; disk_partition_t *new_partitions = NULL; char disk_guid[UUID_STR_LEN + 1]; - char *partitions_list, *str_disk_guid; + char *partitions_list, *str_disk_guid = NULL; u8 part_count = 0; int partlistlen, ret, numparts = 0, partnum, i = 1, ctr1 = 0, ctr2 = 0; @@ -697,14 +682,8 @@ static int do_rename_gpt_parts(struct blk_desc *dev_desc, char *subcomm, /* set_gpt_info allocates new_partitions and str_disk_guid */ ret = set_gpt_info(dev_desc, partitions_list, &str_disk_guid, &new_partitions, &part_count); - if (ret < 0) { - del_gpt_info(); - free(partitions_list); - if (ret == -ENOMEM) - set_gpt_cleanup(&str_disk_guid, &new_partitions); - else - goto out; - } + if (ret < 0) + goto out; if (!strcmp(subcomm, "swap")) { if ((strlen(name1) > PART_NAME_LEN) || (strlen(name2) > PART_NAME_LEN)) { @@ -766,14 +745,8 @@ static int do_rename_gpt_parts(struct blk_desc *dev_desc, char *subcomm, * Even though valid pointers are here passed into set_gpt_info(), * it mallocs again, and there's no way to tell which failed. */ - if (ret < 0) { - del_gpt_info(); - free(partitions_list); - if (ret == -ENOMEM) - set_gpt_cleanup(&str_disk_guid, &new_partitions); - else - goto out; - } + if (ret < 0) + goto out; debug("Writing new partition table\n"); ret = gpt_restore(dev_desc, disk_guid, new_partitions, numparts); @@ -795,10 +768,14 @@ static int do_rename_gpt_parts(struct blk_desc *dev_desc, char *subcomm, } printf("new partition table with %d partitions is:\n", numparts); print_gpt_info(); - del_gpt_info(); out: - free(new_partitions); - free(str_disk_guid); + del_gpt_info(); +#ifdef CONFIG_RANDOM_UUID + if (str_disk_guid) + free(str_disk_guid); +#endif + if (new_partitions) + free(new_partitions); free(partitions_list); return ret; } diff --git a/common/board_f.c b/common/board_f.c index 3f0132a6e3..8fa26e3ca5 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -862,6 +862,11 @@ __weak int arch_cpu_init_dm(void) return 0; } +__weak int checkcpu(void) +{ + return 0; +} + static const init_fnc_t init_sequence_f[] = { setup_mon_len, #ifdef CONFIG_OF_CONTROL @@ -904,9 +909,7 @@ static const init_fnc_t init_sequence_f[] = { console_init_f, /* stage 1 init of console */ display_options, /* say that we are here */ display_text_info, /* show debugging info if required */ -#if defined(CONFIG_PPC) || defined(CONFIG_SH) || defined(CONFIG_X86) checkcpu, -#endif #if defined(CONFIG_SYSRESET) print_resetinfo, #endif diff --git a/configs/odroid-xu3_defconfig b/configs/odroid-xu3_defconfig index 20038d4197..2e982e1b53 100644 --- a/configs/odroid-xu3_defconfig +++ b/configs/odroid-xu3_defconfig @@ -14,6 +14,7 @@ CONFIG_FIT_BEST_MATCH=y CONFIG_SILENT_CONSOLE=y CONFIG_CONSOLE_MUX=y CONFIG_MISC_INIT_R=y +CONFIG_BOARD_LATE_INIT=y # CONFIG_DISPLAY_BOARDINFO is not set CONFIG_DISPLAY_BOARDINFO_LATE=y CONFIG_BOARD_TYPES=y diff --git a/configs/odroid_defconfig b/configs/odroid_defconfig index be914e4caf..e4392e477e 100644 --- a/configs/odroid_defconfig +++ b/configs/odroid_defconfig @@ -17,6 +17,7 @@ CONFIG_BOOTARGS="Please use defined boot" CONFIG_SYS_CONSOLE_IS_IN_ENV=y CONFIG_SYS_CONSOLE_INFO_QUIET=y CONFIG_MISC_INIT_R=y +CONFIG_BOARD_LATE_INIT=y CONFIG_BOARD_TYPES=y CONFIG_SYS_PROMPT="Odroid # " # CONFIG_CMD_XIMG is not set diff --git a/doc/device-tree-bindings/i2c/i2c-designware.txt b/doc/device-tree-bindings/i2c/i2c-designware.txt new file mode 100644 index 0000000000..be766be812 --- /dev/null +++ b/doc/device-tree-bindings/i2c/i2c-designware.txt @@ -0,0 +1,73 @@ +* Synopsys DesignWare I2C + +Required properties : + + - compatible : should be "snps,designware-i2c" + or "mscc,ocelot-i2c" with "snps,designware-i2c" for fallback + - reg : Offset and length of the register set for the device + - interrupts : <IRQ> where IRQ is the interrupt number. + - clocks : phandles for the clocks, see the description of clock-names below. + The phandle for the "ic_clk" clock is required. The phandle for the "pclk" + clock is optional. If a single clock is specified but no clock-name, it is + the "ic_clk" clock. If both clocks are listed, the "ic_clk" must be first. + +Recommended properties : + + - clock-frequency : desired I2C bus clock frequency in Hz. + +Optional properties : + + - clock-names : Contains the names of the clocks: + "ic_clk", for the core clock used to generate the external I2C clock. + "pclk", the interface clock, required for register access. + + - reg : for "mscc,ocelot-i2c", a second register set to configure the SDA hold + time, named ICPU_CFG:TWI_DELAY in the datasheet. + + - i2c-sda-hold-time-ns : should contain the SDA hold time in nanoseconds. + This option is only supported in hardware blocks version 1.11a or newer and + on Microsemi SoCs ("mscc,ocelot-i2c" compatible). + + - i2c-scl-falling-time-ns : should contain the SCL falling time in nanoseconds. + This value which is by default 300ns is used to compute the tLOW period. + + - i2c-sda-falling-time-ns : should contain the SDA falling time in nanoseconds. + This value which is by default 300ns is used to compute the tHIGH period. + +Examples : + + i2c@f0000 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "snps,designware-i2c"; + reg = <0xf0000 0x1000>; + interrupts = <11>; + clock-frequency = <400000>; + }; + + i2c@1120000 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "snps,designware-i2c"; + reg = <0x1120000 0x1000>; + interrupt-parent = <&ictl>; + interrupts = <12 1>; + clock-frequency = <400000>; + i2c-sda-hold-time-ns = <300>; + i2c-sda-falling-time-ns = <300>; + i2c-scl-falling-time-ns = <300>; + };x + + i2c@1120000 { + #address-cells = <1>; + #size-cells = <0>; + reg = <0x2000 0x100>; + clock-frequency = <400000>; + clocks = <&i2cclk>; + interrupts = <0>; + + eeprom@64 { + compatible = "linux,slave-24c02"; + reg = <0x40000064>; + }; + }; diff --git a/drivers/i2c/ast_i2c.c b/drivers/i2c/ast_i2c.c index 763183d649..35dc234160 100644 --- a/drivers/i2c/ast_i2c.c +++ b/drivers/i2c/ast_i2c.c @@ -314,7 +314,7 @@ static int ast_i2c_set_speed(struct udevice *dev, unsigned int speed) divider = i2c_rate / speed; priv->speed = speed; - if (speed > I2C_HIGHSPEED_RATE) { + if (speed > I2C_SPEED_FAST_RATE) { debug("Enable High Speed\n"); setbits_le32(®s->fcr, I2CD_M_HIGH_SPEED_EN | I2CD_M_SDA_DRIVE_1T_EN diff --git a/drivers/i2c/ast_i2c.h b/drivers/i2c/ast_i2c.h index 401e0970f7..928785989e 100644 --- a/drivers/i2c/ast_i2c.h +++ b/drivers/i2c/ast_i2c.h @@ -126,6 +126,4 @@ struct ast_i2c_regs { #define I2CD_RX_DATA_SHIFT 8 #define I2CD_RX_DATA_MASK (0xff << I2CD_RX_DATA_SHIFT) -#define I2C_HIGHSPEED_RATE 400000 - #endif /* __AST_I2C_H_ */ diff --git a/drivers/i2c/designware_i2c.c b/drivers/i2c/designware_i2c.c index b8cdd1c661..c8c5d2c331 100644 --- a/drivers/i2c/designware_i2c.c +++ b/drivers/i2c/designware_i2c.c @@ -4,8 +4,8 @@ * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com. */ -#include <clk.h> #include <common.h> +#include <clk.h> #include <dm.h> #include <i2c.h> #include <pci.h> @@ -46,30 +46,220 @@ static int dw_i2c_enable(struct i2c_regs *i2c_base, bool enable) } #endif +/* High and low times in different speed modes (in ns) */ +enum { + /* SDA Hold Time */ + DEFAULT_SDA_HOLD_TIME = 300, +}; + +/** + * calc_counts() - Convert a period to a number of IC clk cycles + * + * @ic_clk: Input clock in Hz + * @period_ns: Period to represent, in ns + * @return calculated count + */ +static uint calc_counts(uint ic_clk, uint period_ns) +{ + return DIV_ROUND_UP(ic_clk / 1000 * period_ns, NANO_TO_KILO); +} + +/** + * struct i2c_mode_info - Information about an I2C speed mode + * + * Each speed mode has its own characteristics. This struct holds these to aid + * calculations in dw_i2c_calc_timing(). + * + * @speed: Speed in Hz + * @min_scl_lowtime_ns: Minimum value for SCL low period in ns + * @min_scl_hightime_ns: Minimum value for SCL high period in ns + * @def_rise_time_ns: Default rise time in ns + * @def_fall_time_ns: Default fall time in ns + */ +struct i2c_mode_info { + int speed; + int min_scl_hightime_ns; + int min_scl_lowtime_ns; + int def_rise_time_ns; + int def_fall_time_ns; +}; + +static const struct i2c_mode_info info_for_mode[] = { + [IC_SPEED_MODE_STANDARD] = { + I2C_SPEED_STANDARD_RATE, + MIN_SS_SCL_HIGHTIME, + MIN_SS_SCL_LOWTIME, + 1000, + 300, + }, + [IC_SPEED_MODE_FAST] = { + I2C_SPEED_FAST_RATE, + MIN_FS_SCL_HIGHTIME, + MIN_FS_SCL_LOWTIME, + 300, + 300, + }, + [IC_SPEED_MODE_FAST_PLUS] = { + I2C_SPEED_FAST_PLUS_RATE, + MIN_FP_SCL_HIGHTIME, + MIN_FP_SCL_LOWTIME, + 260, + 500, + }, + [IC_SPEED_MODE_HIGH] = { + I2C_SPEED_HIGH_RATE, + MIN_HS_SCL_HIGHTIME, + MIN_HS_SCL_LOWTIME, + 120, + 120, + }, +}; + +/** + * dw_i2c_calc_timing() - Calculate the timings to use for a bus + * + * @priv: Bus private information (NULL if not using driver model) + * @mode: Speed mode to use + * @ic_clk: IC clock speed in Hz + * @spk_cnt: Spike-suppression count + * @config: Returns value to use + * @return 0 if OK, -EINVAL if the calculation failed due to invalid data + */ +static int dw_i2c_calc_timing(struct dw_i2c *priv, enum i2c_speed_mode mode, + int ic_clk, int spk_cnt, + struct dw_i2c_speed_config *config) +{ + int fall_cnt, rise_cnt, min_tlow_cnt, min_thigh_cnt; + int hcnt, lcnt, period_cnt, diff, tot; + int sda_hold_time_ns, scl_rise_time_ns, scl_fall_time_ns; + const struct i2c_mode_info *info; + + /* + * Find the period, rise, fall, min tlow, and min thigh in terms of + * counts of the IC clock + */ + info = &info_for_mode[mode]; + period_cnt = ic_clk / info->speed; + scl_rise_time_ns = priv && priv->scl_rise_time_ns ? + priv->scl_rise_time_ns : info->def_rise_time_ns; + scl_fall_time_ns = priv && priv->scl_fall_time_ns ? + priv->scl_fall_time_ns : info->def_fall_time_ns; + rise_cnt = calc_counts(ic_clk, scl_rise_time_ns); + fall_cnt = calc_counts(ic_clk, scl_fall_time_ns); + min_tlow_cnt = calc_counts(ic_clk, info->min_scl_lowtime_ns); + min_thigh_cnt = calc_counts(ic_clk, info->min_scl_hightime_ns); + + debug("dw_i2c: period %d rise %d fall %d tlow %d thigh %d spk %d\n", + period_cnt, rise_cnt, fall_cnt, min_tlow_cnt, min_thigh_cnt, + spk_cnt); + + /* + * Back-solve for hcnt and lcnt according to the following equations: + * SCL_High_time = [(HCNT + IC_*_SPKLEN + 7) * ic_clk] + SCL_Fall_time + * SCL_Low_time = [(LCNT + 1) * ic_clk] - SCL_Fall_time + SCL_Rise_time + */ + hcnt = min_thigh_cnt - fall_cnt - 7 - spk_cnt; + lcnt = min_tlow_cnt - rise_cnt + fall_cnt - 1; + + if (hcnt < 0 || lcnt < 0) { + debug("dw_i2c: bad counts. hcnt = %d lcnt = %d\n", hcnt, lcnt); + return -EINVAL; + } + + /* + * Now add things back up to ensure the period is hit. If it is off, + * split the difference and bias to lcnt for remainder + */ + tot = hcnt + lcnt + 7 + spk_cnt + rise_cnt + 1; + + if (tot < period_cnt) { + diff = (period_cnt - tot) / 2; + hcnt += diff; + lcnt += diff; + tot = hcnt + lcnt + 7 + spk_cnt + rise_cnt + 1; + lcnt += period_cnt - tot; + } + + config->scl_lcnt = lcnt; + config->scl_hcnt = hcnt; + + /* Use internal default unless other value is specified */ + sda_hold_time_ns = priv && priv->sda_hold_time_ns ? + priv->sda_hold_time_ns : DEFAULT_SDA_HOLD_TIME; + config->sda_hold = calc_counts(ic_clk, sda_hold_time_ns); + + debug("dw_i2c: hcnt = %d lcnt = %d sda hold = %d\n", hcnt, lcnt, + config->sda_hold); + + return 0; +} + +static int calc_bus_speed(struct dw_i2c *priv, int speed, ulong bus_clk, + struct dw_i2c_speed_config *config) +{ + const struct dw_scl_sda_cfg *scl_sda_cfg = NULL; + struct i2c_regs *regs = priv->regs; + enum i2c_speed_mode i2c_spd; + int spk_cnt; + int ret; + + if (priv) + scl_sda_cfg = priv->scl_sda_cfg; + /* Allow high speed if there is no config, or the config allows it */ + if (speed >= I2C_SPEED_HIGH_RATE && + (!scl_sda_cfg || scl_sda_cfg->has_high_speed)) + i2c_spd = IC_SPEED_MODE_HIGH; + else if (speed >= I2C_SPEED_FAST_RATE) + i2c_spd = IC_SPEED_MODE_FAST_PLUS; + else if (speed >= I2C_SPEED_FAST_PLUS_RATE) + i2c_spd = IC_SPEED_MODE_FAST; + else + i2c_spd = IC_SPEED_MODE_STANDARD; + + /* Get the proper spike-suppression count based on target speed */ + if (!priv || !priv->has_spk_cnt) + spk_cnt = 0; + else if (i2c_spd >= IC_SPEED_MODE_HIGH) + spk_cnt = readl(®s->hs_spklen); + else + spk_cnt = readl(®s->fs_spklen); + if (scl_sda_cfg) { + config->sda_hold = scl_sda_cfg->sda_hold; + if (i2c_spd == IC_SPEED_MODE_STANDARD) { + config->scl_hcnt = scl_sda_cfg->ss_hcnt; + config->scl_lcnt = scl_sda_cfg->ss_lcnt; + } else { + config->scl_hcnt = scl_sda_cfg->fs_hcnt; + config->scl_lcnt = scl_sda_cfg->fs_lcnt; + } + } else { + ret = dw_i2c_calc_timing(priv, i2c_spd, bus_clk, spk_cnt, + config); + if (ret) + return log_msg_ret("gen_confg", ret); + } + config->speed_mode = i2c_spd; + + return 0; +} + /* - * i2c_set_bus_speed - Set the i2c speed + * _dw_i2c_set_bus_speed - Set the i2c speed * @speed: required i2c speed * * Set the i2c speed. */ -static unsigned int __dw_i2c_set_bus_speed(struct i2c_regs *i2c_base, - struct dw_scl_sda_cfg *scl_sda_cfg, - unsigned int speed, - unsigned int bus_mhz) +static int _dw_i2c_set_bus_speed(struct dw_i2c *priv, struct i2c_regs *i2c_base, + unsigned int speed, unsigned int bus_clk) { + struct dw_i2c_speed_config config; unsigned int cntl; - unsigned int hcnt, lcnt; unsigned int ena; - int i2c_spd; + int ret; - /* Allow max speed if there is no config, or the config allows it */ - if (speed >= I2C_MAX_SPEED && - (!scl_sda_cfg || scl_sda_cfg->has_max_speed)) - i2c_spd = IC_SPEED_MODE_MAX; - else if (speed >= I2C_FAST_SPEED) - i2c_spd = IC_SPEED_MODE_FAST; - else - i2c_spd = IC_SPEED_MODE_STANDARD; + ret = calc_bus_speed(priv, speed, bus_clk, &config); + if (ret) + return ret; /* Get enable setting for restore later */ ena = readl(&i2c_base->ic_enable) & IC_ENABLE_0B; @@ -79,53 +269,31 @@ static unsigned int __dw_i2c_set_bus_speed(struct i2c_regs *i2c_base, cntl = (readl(&i2c_base->ic_con) & (~IC_CON_SPD_MSK)); - switch (i2c_spd) { - case IC_SPEED_MODE_MAX: + switch (config.speed_mode) { + case IC_SPEED_MODE_HIGH: cntl |= IC_CON_SPD_SS; - if (scl_sda_cfg) { - hcnt = scl_sda_cfg->fs_hcnt; - lcnt = scl_sda_cfg->fs_lcnt; - } else { - hcnt = (bus_mhz * MIN_HS_SCL_HIGHTIME) / NANO_TO_MICRO; - lcnt = (bus_mhz * MIN_HS_SCL_LOWTIME) / NANO_TO_MICRO; - } - writel(hcnt, &i2c_base->ic_hs_scl_hcnt); - writel(lcnt, &i2c_base->ic_hs_scl_lcnt); + writel(config.scl_hcnt, &i2c_base->ic_hs_scl_hcnt); + writel(config.scl_lcnt, &i2c_base->ic_hs_scl_lcnt); break; - case IC_SPEED_MODE_STANDARD: cntl |= IC_CON_SPD_SS; - if (scl_sda_cfg) { - hcnt = scl_sda_cfg->ss_hcnt; - lcnt = scl_sda_cfg->ss_lcnt; - } else { - hcnt = (bus_mhz * MIN_SS_SCL_HIGHTIME) / NANO_TO_MICRO; - lcnt = (bus_mhz * MIN_SS_SCL_LOWTIME) / NANO_TO_MICRO; - } - writel(hcnt, &i2c_base->ic_ss_scl_hcnt); - writel(lcnt, &i2c_base->ic_ss_scl_lcnt); + writel(config.scl_hcnt, &i2c_base->ic_ss_scl_hcnt); + writel(config.scl_lcnt, &i2c_base->ic_ss_scl_lcnt); break; - + case IC_SPEED_MODE_FAST_PLUS: case IC_SPEED_MODE_FAST: default: cntl |= IC_CON_SPD_FS; - if (scl_sda_cfg) { - hcnt = scl_sda_cfg->fs_hcnt; - lcnt = scl_sda_cfg->fs_lcnt; - } else { - hcnt = (bus_mhz * MIN_FS_SCL_HIGHTIME) / NANO_TO_MICRO; - lcnt = (bus_mhz * MIN_FS_SCL_LOWTIME) / NANO_TO_MICRO; - } - writel(hcnt, &i2c_base->ic_fs_scl_hcnt); - writel(lcnt, &i2c_base->ic_fs_scl_lcnt); + writel(config.scl_hcnt, &i2c_base->ic_fs_scl_hcnt); + writel(config.scl_lcnt, &i2c_base->ic_fs_scl_lcnt); break; } writel(cntl, &i2c_base->ic_con); /* Configure SDA Hold Time if required */ - if (scl_sda_cfg) - writel(scl_sda_cfg->sda_hold, &i2c_base->ic_sda_hold); + if (config.sda_hold) + writel(config.sda_hold, &i2c_base->ic_sda_hold); /* Restore back i2c now speed set */ if (ena == IC_ENABLE_0B) @@ -370,7 +538,7 @@ static int __dw_i2c_init(struct i2c_regs *i2c_base, int speed, int slaveaddr) writel(IC_TX_TL, &i2c_base->ic_tx_tl); writel(IC_STOP_DET, &i2c_base->ic_intr_mask); #ifndef CONFIG_DM_I2C - __dw_i2c_set_bus_speed(i2c_base, NULL, speed, IC_CLK); + _dw_i2c_set_bus_speed(NULL, i2c_base, speed, IC_CLK); writel(slaveaddr, &i2c_base->ic_sar); #endif @@ -415,7 +583,7 @@ static unsigned int dw_i2c_set_bus_speed(struct i2c_adapter *adap, unsigned int speed) { adap->speed = speed; - return __dw_i2c_set_bus_speed(i2c_get_base(adap), NULL, speed, IC_CLK); + return _dw_i2c_set_bus_speed(NULL, i2c_get_base(adap), speed, IC_CLK); } static void dw_i2c_init(struct i2c_adapter *adap, int speed, int slaveaddr) @@ -511,14 +679,10 @@ static int designware_i2c_set_bus_speed(struct udevice *bus, unsigned int speed) rate = clk_get_rate(&i2c->clk); if (IS_ERR_VALUE(rate)) return -EINVAL; - - /* Convert to MHz */ - rate /= 1000000; #else rate = IC_CLK; #endif - return __dw_i2c_set_bus_speed(i2c->regs, i2c->scl_sda_cfg, speed, - rate); + return _dw_i2c_set_bus_speed(i2c, i2c->regs, speed, rate); } static int designware_i2c_probe_chip(struct udevice *bus, uint chip_addr, @@ -537,20 +701,17 @@ static int designware_i2c_probe_chip(struct udevice *bus, uint chip_addr, return ret; } -static int designware_i2c_ofdata_to_platdata(struct udevice *bus) -{ - struct dw_i2c *priv = dev_get_priv(bus); - - priv->regs = (struct i2c_regs *)devfdt_get_addr_ptr(bus); - - return 0; -} - -int designware_i2c_probe(struct udevice *bus) +int designware_i2c_ofdata_to_platdata(struct udevice *bus) { struct dw_i2c *priv = dev_get_priv(bus); int ret; + if (!priv->regs) + priv->regs = (struct i2c_regs *)devfdt_get_addr_ptr(bus); + dev_read_u32(bus, "i2c-scl-rising-time-ns", &priv->scl_rise_time_ns); + dev_read_u32(bus, "i2c-scl-falling-time-ns", &priv->scl_fall_time_ns); + dev_read_u32(bus, "i2c-sda-hold-time-ns", &priv->sda_hold_time_ns); + ret = reset_get_bulk(bus, &priv->resets); if (ret) dev_warn(bus, "Can't get reset: %d\n", ret); @@ -570,6 +731,13 @@ int designware_i2c_probe(struct udevice *bus) } #endif + return 0; +} + +int designware_i2c_probe(struct udevice *bus) +{ + struct dw_i2c *priv = dev_get_priv(bus); + return __dw_i2c_init(priv->regs, 0, 0); } diff --git a/drivers/i2c/designware_i2c.h b/drivers/i2c/designware_i2c.h index 48766d0806..61a882cb65 100644 --- a/drivers/i2c/designware_i2c.h +++ b/drivers/i2c/designware_i2c.h @@ -7,6 +7,8 @@ #ifndef __DW_I2C_H_ #define __DW_I2C_H_ +#include <clk.h> +#include <i2c.h> #include <reset.h> struct i2c_regs { @@ -43,20 +45,32 @@ struct i2c_regs { u32 ic_rxflr; /* 0x78 */ u32 ic_sda_hold; /* 0x7c */ u32 ic_tx_abrt_source; /* 0x80 */ - u8 res1[0x18]; /* 0x84 */ + u32 slv_data_nak_only; + u32 dma_cr; + u32 dma_tdlr; + u32 dma_rdlr; + u32 sda_setup; + u32 ack_general_call; u32 ic_enable_status; /* 0x9c */ + u32 fs_spklen; + u32 hs_spklen; + u32 clr_restart_det; + u8 reserved[0xf4 - 0xac]; + u32 comp_param1; /* 0xf4 */ + u32 comp_version; + u32 comp_type; }; -#if !defined(IC_CLK) -#define IC_CLK 166 -#endif -#define NANO_TO_MICRO 1000 +#define IC_CLK 166666666 +#define NANO_TO_KILO 1000000 /* High and low times in different speed modes (in ns) */ #define MIN_SS_SCL_HIGHTIME 4000 #define MIN_SS_SCL_LOWTIME 4700 #define MIN_FS_SCL_HIGHTIME 600 #define MIN_FS_SCL_LOWTIME 1300 +#define MIN_FP_SCL_HIGHTIME 260 +#define MIN_FP_SCL_LOWTIME 500 #define MIN_HS_SCL_HIGHTIME 60 #define MIN_HS_SCL_LOWTIME 160 @@ -124,19 +138,10 @@ struct i2c_regs { #define IC_STATUS_TFNF 0x0002 #define IC_STATUS_ACT 0x0001 -/* Speed Selection */ -#define IC_SPEED_MODE_STANDARD 1 -#define IC_SPEED_MODE_FAST 2 -#define IC_SPEED_MODE_MAX 3 - -#define I2C_MAX_SPEED 3400000 -#define I2C_FAST_SPEED 400000 -#define I2C_STANDARD_SPEED 100000 - /** * struct dw_scl_sda_cfg - I2C timing configuration * - * @has_max_speed: Support maximum speed (1Mbps) + * @has_high_speed: Support high speed (3.4Mbps) * @ss_hcnt: Standard speed high time in ns * @fs_hcnt: Fast speed high time in ns * @ss_lcnt: Standard speed low time in ns @@ -144,7 +149,7 @@ struct i2c_regs { * @sda_hold: SDA hold time */ struct dw_scl_sda_cfg { - bool has_max_speed; + bool has_high_speed; u32 ss_hcnt; u32 fs_hcnt; u32 ss_lcnt; @@ -152,10 +157,45 @@ struct dw_scl_sda_cfg { u32 sda_hold; }; +/** + * struct dw_i2c_speed_config - timings to use for a particular speed + * + * This holds calculated values to be written to the I2C controller. Each value + * is represented as a number of IC clock cycles. + * + * @scl_lcnt: Low count value for SCL + * @scl_hcnt: High count value for SCL + * @sda_hold: Data hold count + * @speed_mode: Speed mode being used + */ +struct dw_i2c_speed_config { + /* SCL high and low period count */ + u16 scl_lcnt; + u16 scl_hcnt; + u32 sda_hold; + enum i2c_speed_mode speed_mode; +}; + +/** + * struct dw_i2c - private information for the bus + * + * @regs: Registers pointer + * @scl_sda_cfg: Deprecated information for x86 (should move to device tree) + * @resets: Resets for the I2C controller + * @scl_rise_time_ns: Configured SCL rise time in nanoseconds + * @scl_fall_time_ns: Configured SCL fall time in nanoseconds + * @sda_hold_time_ns: Configured SDA hold time in nanoseconds + * @has_spk_cnt: true if the spike-count register is present + * @clk: Clock input to the I2C controller + */ struct dw_i2c { struct i2c_regs *regs; struct dw_scl_sda_cfg *scl_sda_cfg; struct reset_ctl_bulk resets; + u32 scl_rise_time_ns; + u32 scl_fall_time_ns; + u32 sda_hold_time_ns; + bool has_spk_cnt; #if CONFIG_IS_ENABLED(CLK) struct clk clk; #endif @@ -165,5 +205,6 @@ extern const struct dm_i2c_ops designware_i2c_ops; int designware_i2c_probe(struct udevice *bus); int designware_i2c_remove(struct udevice *dev); +int designware_i2c_ofdata_to_platdata(struct udevice *bus); #endif /* __DW_I2C_H_ */ diff --git a/drivers/i2c/designware_i2c_pci.c b/drivers/i2c/designware_i2c_pci.c index 7f0625df66..50f03e3d90 100644 --- a/drivers/i2c/designware_i2c_pci.c +++ b/drivers/i2c/designware_i2c_pci.c @@ -62,8 +62,10 @@ static int designware_i2c_pci_ofdata_to_platdata(struct udevice *dev) if (IS_ENABLED(CONFIG_INTEL_BAYTRAIL)) /* Use BayTrail specific timing values */ priv->scl_sda_cfg = &byt_config; + if (dev_get_driver_data(dev) == INTEL_APL) + priv->has_spk_cnt = true; - return 0; + return designware_i2c_ofdata_to_platdata(dev); } static int designware_i2c_pci_probe(struct udevice *dev) diff --git a/drivers/i2c/exynos_hs_i2c.c b/drivers/i2c/exynos_hs_i2c.c index a0821c9257..9f201c66d0 100644 --- a/drivers/i2c/exynos_hs_i2c.c +++ b/drivers/i2c/exynos_hs_i2c.c @@ -527,8 +527,9 @@ static int s3c_i2c_ofdata_to_platdata(struct udevice *dev) i2c_bus->id = pinmux_decode_periph_id(blob, node); - i2c_bus->clock_frequency = fdtdec_get_int(blob, node, - "clock-frequency", 100000); + i2c_bus->clock_frequency = + dev_read_u32_default(dev, "clock-frequency", + I2C_SPEED_STANDARD_RATE); i2c_bus->node = node; i2c_bus->bus_num = dev->seq; diff --git a/drivers/i2c/fsl_i2c.c b/drivers/i2c/fsl_i2c.c index bbbd6ef5bf..097c54388f 100644 --- a/drivers/i2c/fsl_i2c.c +++ b/drivers/i2c/fsl_i2c.c @@ -584,7 +584,8 @@ static int fsl_i2c_ofdata_to_platdata(struct udevice *bus) dev->index = dev_read_u32_default(bus, "cell-index", -1); dev->slaveadd = dev_read_u32_default(bus, "u-boot,i2c-slave-addr", 0x7f); - dev->speed = dev_read_u32_default(bus, "clock-frequency", 400000); + dev->speed = dev_read_u32_default(bus, "clock-frequency", + I2C_SPEED_FAST_RATE); if (!clk_get_by_index(bus, 0, &clock)) dev->i2c_clk = clk_get_rate(&clock); diff --git a/drivers/i2c/i2c-cdns.c b/drivers/i2c/i2c-cdns.c index ff3956d8c2..ac15da2c67 100644 --- a/drivers/i2c/i2c-cdns.c +++ b/drivers/i2c/i2c-cdns.c @@ -213,7 +213,7 @@ static int cdns_i2c_set_bus_speed(struct udevice *dev, unsigned int speed) unsigned long speed_p = speed; int ret = 0; - if (speed > 400000) { + if (speed > I2C_SPEED_FAST_RATE) { debug("%s, failed to set clock speed to %u\n", __func__, speed); return -EINVAL; diff --git a/drivers/i2c/i2c-uclass.c b/drivers/i2c/i2c-uclass.c index fe77e64619..2aa3efe8aa 100644 --- a/drivers/i2c/i2c-uclass.c +++ b/drivers/i2c/i2c-uclass.c @@ -641,7 +641,8 @@ static int i2c_post_probe(struct udevice *dev) #if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA) struct dm_i2c_bus *i2c = dev_get_uclass_priv(dev); - i2c->speed_hz = dev_read_u32_default(dev, "clock-frequency", 100000); + i2c->speed_hz = dev_read_u32_default(dev, "clock-frequency", + I2C_SPEED_STANDARD_RATE); return dm_i2c_set_bus_speed(dev, i2c->speed_hz); #else @@ -699,11 +700,10 @@ int i2c_uclass_init(struct uclass *class) return -ENOMEM; /* Get the last allocated alias. */ -#if CONFIG_IS_ENABLED(OF_CONTROL) - priv->max_id = dev_read_alias_highest_id("i2c"); -#else - priv->max_id = -1; -#endif + if (CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)) + priv->max_id = dev_read_alias_highest_id("i2c"); + else + priv->max_id = -1; debug("%s: highest alias id is %d\n", __func__, priv->max_id); diff --git a/drivers/i2c/i2c-uniphier-f.c b/drivers/i2c/i2c-uniphier-f.c index ced606bf36..62acd28e1b 100644 --- a/drivers/i2c/i2c-uniphier-f.c +++ b/drivers/i2c/i2c-uniphier-f.c @@ -281,7 +281,7 @@ static int uniphier_fi2c_set_bus_speed(struct udevice *bus, unsigned int speed) struct uniphier_fi2c_regs __iomem *regs = priv->regs; /* max supported frequency is 400 kHz */ - if (speed > 400000) + if (speed > I2C_SPEED_FAST_RATE) return -EINVAL; ret = uniphier_fi2c_check_bus_busy(priv); diff --git a/drivers/i2c/i2c-uniphier.c b/drivers/i2c/i2c-uniphier.c index e427415e7e..07a7e03033 100644 --- a/drivers/i2c/i2c-uniphier.c +++ b/drivers/i2c/i2c-uniphier.c @@ -177,7 +177,7 @@ static int uniphier_i2c_set_bus_speed(struct udevice *bus, unsigned int speed) struct uniphier_i2c_priv *priv = dev_get_priv(bus); /* max supported frequency is 400 kHz */ - if (speed > 400000) + if (speed > I2C_SPEED_FAST_RATE) return -EINVAL; /* bus reset: make sure the bus is idle when change the frequency */ diff --git a/drivers/i2c/imx_lpi2c.c b/drivers/i2c/imx_lpi2c.c index 2de99d019e..c9d3faa911 100644 --- a/drivers/i2c/imx_lpi2c.c +++ b/drivers/i2c/imx_lpi2c.c @@ -169,7 +169,7 @@ static int bus_i2c_start(struct udevice *bus, u8 addr, u8 dir) debug("i2c: start check busy bus: 0x%x\n", result); /* Try to init the lpi2c then check the bus busy again */ - bus_i2c_init(bus, 100000); + bus_i2c_init(bus, I2C_SPEED_STANDARD_RATE); result = imx_lpci2c_check_busy_bus(regs); if (result) { printf("i2c: Error check busy bus: 0x%x\n", result); @@ -388,13 +388,13 @@ static int imx_lpi2c_probe_chip(struct udevice *bus, u32 chip, result = bus_i2c_start(bus, chip, 0); if (result) { bus_i2c_stop(bus); - bus_i2c_init(bus, 100000); + bus_i2c_init(bus, I2C_SPEED_STANDARD_RATE); return result; } result = bus_i2c_stop(bus); if (result) - bus_i2c_init(bus, 100000); + bus_i2c_init(bus, I2C_SPEED_STANDARD_RATE); return result; } @@ -489,7 +489,7 @@ static int imx_lpi2c_probe(struct udevice *bus) return ret; } - ret = bus_i2c_init(bus, 100000); + ret = bus_i2c_init(bus, I2C_SPEED_STANDARD_RATE); if (ret < 0) return ret; diff --git a/drivers/i2c/kona_i2c.c b/drivers/i2c/kona_i2c.c index d13e4deee5..0726b4c956 100644 --- a/drivers/i2c/kona_i2c.c +++ b/drivers/i2c/kona_i2c.c @@ -98,12 +98,6 @@ enum bcm_kona_cmd_t { BCM_CMD_STOP, }; -enum bus_speed_index { - BCM_SPD_100K = 0, - BCM_SPD_400K, - BCM_SPD_1MHZ, -}; - /* Internal divider settings for standard mode, fast mode and fast mode plus */ struct bus_speed_cfg { uint8_t time_m; /* Number of cycles for setup time */ @@ -115,9 +109,9 @@ struct bus_speed_cfg { }; static const struct bus_speed_cfg std_cfg_table[] = { - [BCM_SPD_100K] = {0x01, 0x01, 0x03, 0x06, 0x00, 0x02}, - [BCM_SPD_400K] = {0x05, 0x01, 0x03, 0x05, 0x01, 0x02}, - [BCM_SPD_1MHZ] = {0x01, 0x01, 0x03, 0x01, 0x01, 0x03}, + [IC_SPEED_MODE_STANDARD] = {0x01, 0x01, 0x03, 0x06, 0x00, 0x02}, + [IC_SPEED_MODE_FAST] = {0x05, 0x01, 0x03, 0x05, 0x01, 0x02}, + [IC_SPEED_MODE_FAST_PLUS] = {0x01, 0x01, 0x03, 0x01, 0x01, 0x03}, }; struct bcm_kona_i2c_dev { @@ -127,8 +121,8 @@ struct bcm_kona_i2c_dev { }; /* Keep these two defines in sync */ -#define DEF_SPD 100000 -#define DEF_SPD_ENUM BCM_SPD_100K +#define DEF_SPD I2C_SPEED_STANDARD_RATE +#define DEF_SPD_ENUM IC_SPEED_MODE_STANDARD #define DEF_DEVICE(num) \ {(void *)CONFIG_SYS_I2C_BASE##num, DEF_SPD, &std_cfg_table[DEF_SPD_ENUM]} @@ -560,14 +554,14 @@ static uint bcm_kona_i2c_assign_bus_speed(struct bcm_kona_i2c_dev *dev, uint speed) { switch (speed) { - case 100000: - dev->std_cfg = &std_cfg_table[BCM_SPD_100K]; + case I2C_SPEED_STANDARD_RATE: + dev->std_cfg = &std_cfg_table[IC_SPEED_MODE_STANDARD]; break; - case 400000: - dev->std_cfg = &std_cfg_table[BCM_SPD_400K]; + case I2C_SPEED_FAST_RATE: + dev->std_cfg = &std_cfg_table[IC_SPEED_MODE_FAST]; break; - case 1000000: - dev->std_cfg = &std_cfg_table[BCM_SPD_1MHZ]; + case I2C_SPEED_FAST_PLUS_RATE: + dev->std_cfg = &std_cfg_table[IC_SPEED_MODE_FAST_PLUS]; break; default: printf("%d hz bus speed not supported\n", speed); diff --git a/drivers/i2c/mv_i2c.c b/drivers/i2c/mv_i2c.c index 8a56ef9a24..63665f0952 100644 --- a/drivers/i2c/mv_i2c.c +++ b/drivers/i2c/mv_i2c.c @@ -434,7 +434,7 @@ void i2c_init(int speed, int slaveaddr) base_glob = (struct mv_i2c *)CONFIG_MV_I2C_REG; #endif - if (speed > 100000) + if (speed > I2C_SPEED_STANDARD_RATE) val = ICR_FM; else val = ICR_SM; @@ -565,7 +565,7 @@ static int mv_i2c_set_bus_speed(struct udevice *bus, unsigned int speed) struct mv_i2c_priv *priv = dev_get_priv(bus); u32 val; - if (speed > 100000) + if (speed > I2C_SPEED_STANDARD_RATE) val = ICR_FM; else val = ICR_SM; diff --git a/drivers/i2c/mvtwsi.c b/drivers/i2c/mvtwsi.c index 0a2dafcec6..382cf4b304 100644 --- a/drivers/i2c/mvtwsi.c +++ b/drivers/i2c/mvtwsi.c @@ -805,8 +805,9 @@ static int mvtwsi_i2c_ofdata_to_platdata(struct udevice *bus) "cell-index", -1); dev->slaveadd = fdtdec_get_int(gd->fdt_blob, dev_of_offset(bus), "u-boot,i2c-slave-addr", 0x0); - dev->speed = fdtdec_get_int(gd->fdt_blob, dev_of_offset(bus), - "clock-frequency", 100000); + dev->speed = dev_read_u32_default(bus, "clock-frequency", + I2C_SPEED_STANDARD_RATE); + return 0; } diff --git a/drivers/i2c/omap24xx_i2c.c b/drivers/i2c/omap24xx_i2c.c index 4b93e02bbe..6e7d24d727 100644 --- a/drivers/i2c/omap24xx_i2c.c +++ b/drivers/i2c/omap24xx_i2c.c @@ -306,7 +306,7 @@ static int __omap24_i2c_setspeed(void __iomem *i2c_base, int ip_rev, uint speed, int hsscll = 0, hssclh = 0; u32 scll = 0, sclh = 0; - if (speed >= OMAP_I2C_HIGH_SPEED) { + if (speed >= I2C_SPEED_HIGH_RATE) { /* High speed */ psc = I2C_IP_CLK / I2C_INTERNAL_SAMPLING_CLK; psc -= 1; @@ -1066,7 +1066,8 @@ static int omap_i2c_ofdata_to_platdata(struct udevice *bus) struct omap_i2c_platdata *plat = dev_get_platdata(bus); plat->base = devfdt_get_addr(bus); - plat->speed = dev_read_u32_default(bus, "clock-frequency", 100000); + plat->speed = dev_read_u32_default(bus, "clock-frequency", + I2C_SPEED_STANDARD_RATE); plat->ip_rev = dev_get_driver_data(bus); return 0; diff --git a/drivers/i2c/omap24xx_i2c.h b/drivers/i2c/omap24xx_i2c.h index 3458cf3a7d..6904f2d9ad 100644 --- a/drivers/i2c/omap24xx_i2c.h +++ b/drivers/i2c/omap24xx_i2c.h @@ -81,10 +81,6 @@ #define I2C_SCLH_HSSCLH 8 #define I2C_SCLH_HSSCLH_M 0xFF -#define OMAP_I2C_STANDARD 100000 -#define OMAP_I2C_FAST_MODE 400000 -#define OMAP_I2C_HIGH_SPEED 3400000 - #define SYSTEM_CLOCK_12 12000000 #define SYSTEM_CLOCK_13 13000000 #define SYSTEM_CLOCK_192 19200000 diff --git a/drivers/i2c/rcar_i2c.c b/drivers/i2c/rcar_i2c.c index 2ebae349ed..05d0dc6012 100644 --- a/drivers/i2c/rcar_i2c.c +++ b/drivers/i2c/rcar_i2c.c @@ -344,7 +344,7 @@ static int rcar_i2c_probe(struct udevice *dev) writel(0, priv->base + RCAR_I2C_ICMSR); writel(0, priv->base + RCAR_I2C_ICMAR); - ret = rcar_i2c_set_speed(dev, 100000); + ret = rcar_i2c_set_speed(dev, I2C_SPEED_STANDARD_RATE); if (ret) clk_disable(&priv->clk); diff --git a/drivers/i2c/rcar_iic.c b/drivers/i2c/rcar_iic.c index 9d45f547d1..2a82eb0b76 100644 --- a/drivers/i2c/rcar_iic.c +++ b/drivers/i2c/rcar_iic.c @@ -248,7 +248,7 @@ static int rcar_iic_probe(struct udevice *dev) rcar_iic_finish(dev); - return rcar_iic_set_speed(dev, 100000); + return rcar_iic_set_speed(dev, I2C_SPEED_STANDARD_RATE); } static const struct dm_i2c_ops rcar_iic_ops = { diff --git a/drivers/i2c/s3c24x0_i2c.c b/drivers/i2c/s3c24x0_i2c.c index ad0bc69fa3..68bf93b324 100644 --- a/drivers/i2c/s3c24x0_i2c.c +++ b/drivers/i2c/s3c24x0_i2c.c @@ -313,8 +313,9 @@ static int s3c_i2c_ofdata_to_platdata(struct udevice *dev) i2c_bus->id = pinmux_decode_periph_id(blob, node); - i2c_bus->clock_frequency = fdtdec_get_int(blob, node, - "clock-frequency", 100000); + i2c_bus->clock_frequency = + dev_read_u32_default(dev, "clock-frequency", + I2C_SPEED_STANDARD_RATE); i2c_bus->node = node; i2c_bus->bus_num = dev->seq; diff --git a/drivers/i2c/sandbox_i2c.c b/drivers/i2c/sandbox_i2c.c index 0dbbaa0c44..1a4521d5b8 100644 --- a/drivers/i2c/sandbox_i2c.c +++ b/drivers/i2c/sandbox_i2c.c @@ -72,7 +72,8 @@ static int sandbox_i2c_xfer(struct udevice *bus, struct i2c_msg *msg, * 400KHz for reads. */ is_read = nmsgs > 1; - if (i2c->speed_hz > (is_read ? 400000 : 100000)) { + if (i2c->speed_hz > (is_read ? I2C_SPEED_FAST_RATE : + I2C_SPEED_STANDARD_RATE)) { debug("%s: Max speed exceeded\n", __func__); return -EINVAL; } diff --git a/drivers/i2c/stm32f7_i2c.c b/drivers/i2c/stm32f7_i2c.c index 2b18735fea..21dfa5023b 100644 --- a/drivers/i2c/stm32f7_i2c.c +++ b/drivers/i2c/stm32f7_i2c.c @@ -115,17 +115,6 @@ struct stm32_i2c_regs { #define STM32_NSEC_PER_SEC 1000000000L -#define STANDARD_RATE 100000 -#define FAST_RATE 400000 -#define FAST_PLUS_RATE 1000000 - -enum stm32_i2c_speed { - STM32_I2C_SPEED_STANDARD, /* 100 kHz */ - STM32_I2C_SPEED_FAST, /* 400 kHz */ - STM32_I2C_SPEED_FAST_PLUS, /* 1 MHz */ - STM32_I2C_SPEED_END, -}; - /** * struct stm32_i2c_spec - private i2c specification timing * @rate: I2C bus speed (Hz) @@ -164,7 +153,7 @@ struct stm32_i2c_spec { * @analog_filter: Analog filter delay (On/Off) */ struct stm32_i2c_setup { - enum stm32_i2c_speed speed; + enum i2c_speed_mode speed; u32 speed_freq; u32 clock_src; u32 rise_time; @@ -198,8 +187,8 @@ struct stm32_i2c_priv { }; static const struct stm32_i2c_spec i2c_specs[] = { - [STM32_I2C_SPEED_STANDARD] = { - .rate = STANDARD_RATE, + [IC_SPEED_MODE_STANDARD] = { + .rate = I2C_SPEED_STANDARD_RATE, .rate_min = 8000, .rate_max = 120000, .fall_max = 300, @@ -210,8 +199,8 @@ static const struct stm32_i2c_spec i2c_specs[] = { .l_min = 4700, .h_min = 4000, }, - [STM32_I2C_SPEED_FAST] = { - .rate = FAST_RATE, + [IC_SPEED_MODE_FAST] = { + .rate = I2C_SPEED_FAST_RATE, .rate_min = 320000, .rate_max = 480000, .fall_max = 300, @@ -222,8 +211,8 @@ static const struct stm32_i2c_spec i2c_specs[] = { .l_min = 1300, .h_min = 600, }, - [STM32_I2C_SPEED_FAST_PLUS] = { - .rate = FAST_PLUS_RATE, + [IC_SPEED_MODE_FAST_PLUS] = { + .rate = I2C_SPEED_FAST_PLUS_RATE, .rate_min = 800000, .rate_max = 1200000, .fall_max = 100, @@ -648,9 +637,9 @@ static int stm32_i2c_compute_timing(struct stm32_i2c_priv *i2c_priv, struct list_head solutions; int ret; - if (setup->speed >= STM32_I2C_SPEED_END) { + if (setup->speed >= ARRAY_SIZE(i2c_specs)) { pr_err("%s: speed out of bound {%d/%d}\n", __func__, - setup->speed, STM32_I2C_SPEED_END - 1); + setup->speed, ARRAY_SIZE(i2c_specs) - 1); return -EINVAL; } @@ -719,7 +708,7 @@ static int stm32_i2c_setup_timing(struct stm32_i2c_priv *i2c_priv, if (ret) { debug("%s: failed to compute I2C timings.\n", __func__); - if (i2c_priv->speed > STM32_I2C_SPEED_STANDARD) { + if (i2c_priv->speed > IC_SPEED_MODE_STANDARD) { i2c_priv->speed--; setup->speed = i2c_priv->speed; setup->speed_freq = @@ -784,14 +773,14 @@ static int stm32_i2c_set_bus_speed(struct udevice *bus, unsigned int speed) struct stm32_i2c_priv *i2c_priv = dev_get_priv(bus); switch (speed) { - case STANDARD_RATE: - i2c_priv->speed = STM32_I2C_SPEED_STANDARD; + case I2C_SPEED_STANDARD_RATE: + i2c_priv->speed = IC_SPEED_MODE_STANDARD; break; - case FAST_RATE: - i2c_priv->speed = STM32_I2C_SPEED_FAST; + case I2C_SPEED_FAST_RATE: + i2c_priv->speed = IC_SPEED_MODE_FAST; break; - case FAST_PLUS_RATE: - i2c_priv->speed = STM32_I2C_SPEED_FAST_PLUS; + case I2C_SPEED_FAST_PLUS_RATE: + i2c_priv->speed = IC_SPEED_MODE_FAST_PLUS; break; default: debug("%s: Speed %d not supported\n", __func__, speed); diff --git a/drivers/mmc/s5p_sdhci.c b/drivers/mmc/s5p_sdhci.c index 53efa968cf..b5fe828dd6 100644 --- a/drivers/mmc/s5p_sdhci.c +++ b/drivers/mmc/s5p_sdhci.c @@ -204,8 +204,13 @@ static int s5p_sdhci_probe(struct udevice *dev) if (ret) return ret; + ret = mmc_of_parse(dev, &plat->cfg); + if (ret) + return ret; + host->mmc = &plat->mmc; host->mmc->dev = dev; + ret = sdhci_setup_cfg(&plat->cfg, host, 0, 400000); if (ret) return ret; diff --git a/drivers/net/mvpp2.c b/drivers/net/mvpp2.c index 917d06b6e0..b234b41956 100644 --- a/drivers/net/mvpp2.c +++ b/drivers/net/mvpp2.c @@ -580,7 +580,7 @@ enum mv_netc_lanes { /* Default number of TXQs in use */ #define MVPP2_DEFAULT_TXQ 1 -/* Dfault number of RXQs in use */ +/* Default number of RXQs in use */ #define MVPP2_DEFAULT_RXQ 1 #define CONFIG_MV_ETH_RXQ 8 /* increment by 8 */ diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h index 7587ba2ee5..5d027329fe 100644 --- a/include/asm-generic/global_data.h +++ b/include/asm-generic/global_data.h @@ -90,9 +90,6 @@ typedef struct global_data { #if defined(CONFIG_SYS_I2C) int cur_i2c_bus; /* current used i2c bus */ #endif -#ifdef CONFIG_SYS_I2C_MXC - void *srdata[10]; -#endif unsigned int timebase_h; unsigned int timebase_l; #if CONFIG_VAL(SYS_MALLOC_F_LEN) diff --git a/include/configs/odroid.h b/include/configs/odroid.h index 77fca32fca..a7e2a3d9a2 100644 --- a/include/configs/odroid.h +++ b/include/configs/odroid.h @@ -80,7 +80,7 @@ "tzsw raw 0x83f 0x138\0" #define BOOT_TARGET_DEVICES(func) \ - func(MMC, mmc, 1) \ + func(MMC, mmc, 2) \ func(MMC, mmc, 0) #include <config_distro_bootcmd.h> @@ -146,13 +146,13 @@ "run kernel_args;" \ "bootz ${kernel_addr_r} ${initrd_addr} ${fdt_addr};\0" \ "autoboot=" \ - "if test -e mmc 0 boot.scr; then; " \ + "if test -e mmc ${mmcbootdev} boot.scr; then; " \ "run boot_script; " \ - "elif test -e mmc 0 Image.itb; then; " \ + "elif test -e mmc ${mmcbootdev} Image.itb; then; " \ "run boot_fit;" \ - "elif test -e mmc 0 zImage; then; " \ + "elif test -e mmc ${mmcbootdev} zImage; then; " \ "run boot_zimg;" \ - "elif test -e mmc 0 uImage; then; " \ + "elif test -e mmc ${mmcbootdev} uImage; then; " \ "run boot_uimg;" \ "fi;\0" \ "console=" CONFIG_DEFAULT_CONSOLE \ diff --git a/include/i2c.h b/include/i2c.h index 72e2e8e426..0faf8542e2 100644 --- a/include/i2c.h +++ b/include/i2c.h @@ -30,6 +30,32 @@ enum dm_i2c_chip_flags { DM_I2C_CHIP_WR_ADDRESS = 1 << 2, /* Send address for each write byte */ }; +/** enum i2c_speed_mode - standard I2C speed modes */ +enum i2c_speed_mode { + IC_SPEED_MODE_STANDARD, + IC_SPEED_MODE_FAST, + IC_SPEED_MODE_FAST_PLUS, + IC_SPEED_MODE_HIGH, + IC_SPEED_MODE_FAST_ULTRA, + + IC_SPEED_MODE_COUNT, +}; + +/** enum i2c_speed_rate - standard I2C speeds in Hz */ +enum i2c_speed_rate { + I2C_SPEED_STANDARD_RATE = 100000, + I2C_SPEED_FAST_RATE = 400000, + I2C_SPEED_FAST_PLUS_RATE = 1000000, + I2C_SPEED_HIGH_RATE = 3400000, + I2C_SPEED_FAST_ULTRA_RATE = 5000000, +}; + +/** enum i2c_address_mode - available address modes */ +enum i2c_address_mode { + I2C_MODE_7_BIT, + I2C_MODE_10_BIT +}; + struct udevice; /** * struct dm_i2c_chip - information about an i2c chip diff --git a/lib/libfdt/fdt_ro.c b/lib/libfdt/fdt_ro.c index 560041b603..be03aea9eb 100644 --- a/lib/libfdt/fdt_ro.c +++ b/lib/libfdt/fdt_ro.c @@ -183,8 +183,8 @@ int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size) if (fdt_chk_extra() && !re) return -FDT_ERR_BADOFFSET; - *address = fdt64_ld(&re->address); - *size = fdt64_ld(&re->size); + *address = fdt64_to_cpu(re->address); + *size = fdt64_to_cpu(re->size); return 0; } @@ -194,7 +194,7 @@ int fdt_num_mem_rsv(const void *fdt) const struct fdt_reserve_entry *re; for (i = 0; (re = fdt_mem_rsv(fdt, i)) != NULL; i++) { - if (fdt64_ld(&re->size) == 0) + if (fdt64_to_cpu(re->size) == 0) return i; } return -FDT_ERR_TRUNCATED; @@ -372,7 +372,7 @@ static const struct fdt_property *fdt_get_property_by_offset_(const void *fdt, prop = fdt_offset_ptr_(fdt, offset); if (lenp) - *lenp = fdt32_ld(&prop->len); + *lenp = fdt32_to_cpu(prop->len); return prop; } @@ -410,7 +410,7 @@ static const struct fdt_property *fdt_get_property_namelen_(const void *fdt, offset = -FDT_ERR_INTERNAL; break; } - if (fdt_string_eq_(fdt, fdt32_ld(&prop->nameoff), + if (fdt_string_eq_(fdt, fdt32_to_cpu(prop->nameoff), name, namelen)) { if (poffset) *poffset = offset; @@ -463,7 +463,7 @@ const void *fdt_getprop_namelen(const void *fdt, int nodeoffset, /* Handle realignment */ if (fdt_chk_version() && fdt_version(fdt) < 0x10 && - (poffset + sizeof(*prop)) % 8 && fdt32_ld(&prop->len) >= 8) + (poffset + sizeof(*prop)) % 8 && fdt32_to_cpu(prop->len) >= 8) return prop->data + 4; return prop->data; } @@ -481,7 +481,7 @@ const void *fdt_getprop_by_offset(const void *fdt, int offset, int namelen; if (fdt_chk_extra()) { - name = fdt_get_string(fdt, fdt32_ld(&prop->nameoff), + name = fdt_get_string(fdt, fdt32_to_cpu(prop->nameoff), &namelen); if (!name) { if (lenp) @@ -490,13 +490,13 @@ const void *fdt_getprop_by_offset(const void *fdt, int offset, } *namep = name; } else { - *namep = fdt_string(fdt, fdt32_ld(&prop->nameoff)); + *namep = fdt_string(fdt, fdt32_to_cpu(prop->nameoff)); } } /* Handle realignment */ if (fdt_chk_version() && fdt_version(fdt) < 0x10 && - (offset + sizeof(*prop)) % 8 && fdt32_ld(&prop->len) >= 8) + (offset + sizeof(*prop)) % 8 && fdt32_to_cpu(prop->len) >= 8) return prop->data + 4; return prop->data; } @@ -521,7 +521,7 @@ uint32_t fdt_get_phandle(const void *fdt, int nodeoffset) return 0; } - return fdt32_ld(php); + return fdt32_to_cpu(*php); } const char *fdt_get_alias_namelen(const void *fdt, diff --git a/lib/optee/optee.c b/lib/optee/optee.c index 9b49eb8ee7..d4355c6d03 100644 --- a/lib/optee/optee.c +++ b/lib/optee/optee.c @@ -92,7 +92,7 @@ static int optee_copy_firmware_node(const void *old_blob, void *fdt_blob) offs = fdt_add_subnode(fdt_blob, offs, "optee"); if (offs < 0) - return ret; + return offs; /* copy the compatible property */ prop = fdt_getprop(old_blob, old_offs, "compatible", &len); diff --git a/scripts/dtc/dtc-lexer.l b/scripts/dtc/dtc-lexer.l index fd825ebba6..24af549977 100644 --- a/scripts/dtc/dtc-lexer.l +++ b/scripts/dtc/dtc-lexer.l @@ -38,7 +38,6 @@ LINECOMMENT "//".*\n #include "srcpos.h" #include "dtc-parser.tab.h" -YYLTYPE yylloc; extern bool treesource_error; /* CAUTION: this will stop working if we ever use yyless() or yyunput() */ diff --git a/scripts/dtc/libfdt/fdt_ro.c b/scripts/dtc/libfdt/fdt_ro.c index e398815485..d9d52e0d56 100644 --- a/scripts/dtc/libfdt/fdt_ro.c +++ b/scripts/dtc/libfdt/fdt_ro.c @@ -179,8 +179,8 @@ int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size) if (fdt_chk_extra() && !re) return -FDT_ERR_BADOFFSET; - *address = fdt64_ld(&re->address); - *size = fdt64_ld(&re->size); + *address = fdt64_to_cpu(re->address); + *size = fdt64_to_cpu(re->size); return 0; } @@ -190,7 +190,7 @@ int fdt_num_mem_rsv(const void *fdt) const struct fdt_reserve_entry *re; for (i = 0; (re = fdt_mem_rsv(fdt, i)) != NULL; i++) { - if (fdt64_ld(&re->size) == 0) + if (fdt64_to_cpu(re->size) == 0) return i; } return -FDT_ERR_TRUNCATED; @@ -368,7 +368,7 @@ static const struct fdt_property *fdt_get_property_by_offset_(const void *fdt, prop = fdt_offset_ptr_(fdt, offset); if (lenp) - *lenp = fdt32_ld(&prop->len); + *lenp = fdt32_to_cpu(prop->len); return prop; } @@ -406,7 +406,7 @@ static const struct fdt_property *fdt_get_property_namelen_(const void *fdt, offset = -FDT_ERR_INTERNAL; break; } - if (fdt_string_eq_(fdt, fdt32_ld(&prop->nameoff), + if (fdt_string_eq_(fdt, fdt32_to_cpu(prop->nameoff), name, namelen)) { if (poffset) *poffset = offset; @@ -459,7 +459,7 @@ const void *fdt_getprop_namelen(const void *fdt, int nodeoffset, /* Handle realignment */ if (fdt_chk_version() && fdt_version(fdt) < 0x10 && - (poffset + sizeof(*prop)) % 8 && fdt32_ld(&prop->len) >= 8) + (poffset + sizeof(*prop)) % 8 && fdt32_to_cpu(prop->len) >= 8) return prop->data + 4; return prop->data; } @@ -477,7 +477,7 @@ const void *fdt_getprop_by_offset(const void *fdt, int offset, int namelen; if (fdt_chk_extra()) { - name = fdt_get_string(fdt, fdt32_ld(&prop->nameoff), + name = fdt_get_string(fdt, fdt32_to_cpu(prop->nameoff), &namelen); if (!name) { if (lenp) @@ -486,13 +486,13 @@ const void *fdt_getprop_by_offset(const void *fdt, int offset, } *namep = name; } else { - *namep = fdt_string(fdt, fdt32_ld(&prop->nameoff)); + *namep = fdt_string(fdt, fdt32_to_cpu(prop->nameoff)); } } /* Handle realignment */ if (fdt_chk_version() && fdt_version(fdt) < 0x10 && - (offset + sizeof(*prop)) % 8 && fdt32_ld(&prop->len) >= 8) + (offset + sizeof(*prop)) % 8 && fdt32_to_cpu(prop->len) >= 8) return prop->data + 4; return prop->data; } @@ -517,7 +517,7 @@ uint32_t fdt_get_phandle(const void *fdt, int nodeoffset) return 0; } - return fdt32_ld(php); + return fdt32_to_cpu(*php); } const char *fdt_get_alias_namelen(const void *fdt, diff --git a/scripts/dtc/libfdt/libfdt.h b/scripts/dtc/libfdt/libfdt.h index 36fadcdea5..fa63fffe28 100644 --- a/scripts/dtc/libfdt/libfdt.h +++ b/scripts/dtc/libfdt/libfdt.h @@ -117,23 +117,6 @@ static inline void *fdt_offset_ptr_w(void *fdt, int offset, int checklen) uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset); -/* - * Alignment helpers: - * These helpers access words from a device tree blob. They're - * built to work even with unaligned pointers on platforms (ike - * ARM) that don't like unaligned loads and stores - */ - -static inline uint32_t fdt32_ld(const fdt32_t *p) -{ - const uint8_t *bp = (const uint8_t *)p; - - return ((uint32_t)bp[0] << 24) - | ((uint32_t)bp[1] << 16) - | ((uint32_t)bp[2] << 8) - | bp[3]; -} - static inline void fdt32_st(void *property, uint32_t value) { uint8_t *bp = (uint8_t *)property; @@ -144,20 +127,6 @@ static inline void fdt32_st(void *property, uint32_t value) bp[3] = value & 0xff; } -static inline uint64_t fdt64_ld(const fdt64_t *p) -{ - const uint8_t *bp = (const uint8_t *)p; - - return ((uint64_t)bp[0] << 56) - | ((uint64_t)bp[1] << 48) - | ((uint64_t)bp[2] << 40) - | ((uint64_t)bp[3] << 32) - | ((uint64_t)bp[4] << 24) - | ((uint64_t)bp[5] << 16) - | ((uint64_t)bp[6] << 8) - | bp[7]; -} - static inline void fdt64_st(void *property, uint64_t value) { uint8_t *bp = (uint8_t *)property; @@ -232,7 +201,7 @@ int fdt_next_subnode(const void *fdt, int offset); /* General functions */ /**********************************************************************/ #define fdt_get_header(fdt, field) \ - (fdt32_ld(&((const struct fdt_header *)(fdt))->field)) + (fdt32_to_cpu(((const struct fdt_header *)(fdt))->field)) #define fdt_magic(fdt) (fdt_get_header(fdt, magic)) #define fdt_totalsize(fdt) (fdt_get_header(fdt, totalsize)) #define fdt_off_dt_struct(fdt) (fdt_get_header(fdt, off_dt_struct)) diff --git a/test/common.sh b/test/common.sh index 702d1ed051..904d579b7b 100644 --- a/test/common.sh +++ b/test/common.sh @@ -13,7 +13,7 @@ fail() { build_uboot() { echo "Build sandbox" OPTS="O=${OUTPUT_DIR} $1" - NUM_CPUS=$(grep -c processor /proc/cpuinfo) + NUM_CPUS=$(nproc) echo ${OPTS} make ${OPTS} sandbox_config make ${OPTS} -s -j${NUM_CPUS} diff --git a/test/fs/fs-test.sh b/test/fs/fs-test.sh index 721af71d44..b87748106c 100755 --- a/test/fs/fs-test.sh +++ b/test/fs/fs-test.sh @@ -87,7 +87,7 @@ function check_clean() { # Generate sandbox U-Boot - gleaned from /test/dm/test-dm.sh function compile_sandbox() { unset CROSS_COMPILE - NUM_CPUS=$(cat /proc/cpuinfo |grep -c processor) + NUM_CPUS=$(nproc) make O=sandbox sandbox_config make O=sandbox -s -j${NUM_CPUS} diff --git a/tools/buildman/builder.py b/tools/buildman/builder.py index 784c64122b..3fd4fac695 100644 --- a/tools/buildman/builder.py +++ b/tools/buildman/builder.py @@ -979,7 +979,7 @@ class Builder: The summary takes the form of one line per architecture. The line contains deltas for each of the sections (+ means the section - got bigger, - means smaller). The nunmbers are the average number + got bigger, - means smaller). The numbers are the average number of bytes that a board in this section increased by. For example: diff --git a/tools/concurrencytest/README.md b/tools/concurrencytest/README.md index 8e65776f17..2d7fe75df5 100644 --- a/tools/concurrencytest/README.md +++ b/tools/concurrencytest/README.md @@ -16,8 +16,8 @@ pip install concurrencytest Requires: - * [testtools](https://pypi.python.org/pypi/testtools) : `pip install testtools` - * [python-subunit](https://pypi.python.org/pypi/python-subunit) : `pip install python-subunit` +* [testtools](https://pypi.python.org/pypi/testtools) : `pip install testtools` +* [python-subunit](https://pypi.python.org/pypi/python-subunit) : `pip install python-subunit` ---- |