[U-Boot] [PATCH v2 09/19] exynos: Add common board code for exynos5 boards that use device tree

Simon Glass sjg at chromium.org
Sun Aug 9 15:40:14 CEST 2015


Hi Prazemyslaw,

On 5 August 2015 at 08:16, Przemyslaw Marczak <p.marczak at samsung.com> wrote:
> Hello Simon,
>
>
> On 08/03/2015 04:19 PM, Simon Glass wrote:
>>
>> Some boards use device tree for almost all board-specific configuration.
>> They therefore do not need their own separate board code, but can all use
>> the same version. Add a common version of the board code. It uses the
>> PMIC, regulator and video bridge uclasses. This will support smdk5250,
>> smdk5420, snow, spring, pit and pi.
>>
>> Signed-off-by: Simon Glass <sjg at chromium.org>
>> ---
>>
>> Changes in v2: None
>>
>>   board/samsung/common/Makefile     |   1 +
>>   board/samsung/common/exynos5-dt.c | 362
>> ++++++++++++++++++++++++++++++++++++++
>>   2 files changed, 363 insertions(+)
>>   create mode 100644 board/samsung/common/exynos5-dt.c
>>
>> diff --git a/board/samsung/common/Makefile b/board/samsung/common/Makefile
>> index 5fb01ce..6cbd906 100644
>> --- a/board/samsung/common/Makefile
>> +++ b/board/samsung/common/Makefile
>> @@ -11,4 +11,5 @@ obj-$(CONFIG_MISC_COMMON) += misc.o
>>
>>   ifndef CONFIG_SPL_BUILD
>>   obj-$(CONFIG_BOARD_COMMON)    += board.o
>> +obj-$(CONFIG_EXYNOS5_DT)       += exynos5-dt.o
>>   endif
>> diff --git a/board/samsung/common/exynos5-dt.c
>> b/board/samsung/common/exynos5-dt.c
>> new file mode 100644
>> index 0000000..7d1b88a
>> --- /dev/null
>> +++ b/board/samsung/common/exynos5-dt.c
>> @@ -0,0 +1,362 @@
>> +/*
>> + * Copyright (C) 2012 Samsung Electronics
>> + *
>> + * SPDX-License-Identifier:    GPL-2.0+
>> + */
>> +
>> +#include <common.h>
>> +#include <dm.h>
>> +#include <dwc3-uboot.h>
>> +#include <fdtdec.h>
>> +#include <asm/io.h>
>> +#include <errno.h>
>> +#include <i2c.h>
>> +#include <mmc.h>
>> +#include <netdev.h>
>> +#include <samsung-usb-phy-uboot.h>
>> +#include <spi.h>
>> +#include <usb.h>
>> +#include <video_bridge.h>
>> +#include <asm/gpio.h>
>> +#include <asm/arch/cpu.h>
>> +#include <asm/arch/dwmmc.h>
>> +#include <asm/arch/mmc.h>
>> +#include <asm/arch/pinmux.h>
>> +#include <asm/arch/power.h>
>> +#include <asm/arch/sromc.h>
>> +#include <power/pmic.h>
>> +#include <power/max77686_pmic.h>
>> +#include <power/regulator.h>
>> +#include <power/s5m8767.h>
>> +#include <tmu.h>
>> +
>> +DECLARE_GLOBAL_DATA_PTR;
>> +
>> +static void board_enable_audio_codec(void)
>> +{
>> +       int node, ret;
>> +       struct gpio_desc en_gpio;
>> +
>> +       node = fdtdec_next_compatible(gd->fdt_blob, 0,
>> +               COMPAT_SAMSUNG_EXYNOS5_SOUND);
>> +       if (node <= 0)
>> +               return;
>> +
>> +       ret = gpio_request_by_name_nodev(gd->fdt_blob, node,
>> +                                        "codec-enable-gpio", 0, &en_gpio,
>> +                                        GPIOD_IS_OUT |
>> GPIOD_IS_OUT_ACTIVE);
>> +       if (ret == -FDT_ERR_NOTFOUND)
>> +               return;
>> +
>> +       /* Turn on the GPIO which connects to the codec's "enable" line.
>> */
>> +       gpio_set_pull(gpio_get_number(&en_gpio), S5P_GPIO_PULL_NONE);
>> +
>> +#ifdef CONFIG_SOUND_MAX98095
>> +       /* Enable MAX98095 Codec */
>> +       gpio_request(EXYNOS5_GPIO_X17, "max98095_enable");
>> +       gpio_direction_output(EXYNOS5_GPIO_X17, 1);
>> +       gpio_set_pull(EXYNOS5_GPIO_X17, S5P_GPIO_PULL_NONE);
>> +#endif
>> +}
>> +
>> +int exynos_init(void)
>> +{
>> +       board_enable_audio_codec();
>> +
>> +       return 0;
>> +}
>> +
>> +static int exynos_set_regulator(const char *name, uint uv)
>> +{
>> +       struct udevice *dev;
>> +       int ret;
>> +
>> +       ret = regulator_get_by_platname(name, &dev);
>> +       if (ret) {
>> +               debug("%s: Cannot find regulator %s\n", __func__, name);
>> +               return ret;
>> +       }
>> +       ret = regulator_set_value(dev, uv);
>> +       if (ret) {
>> +               debug("%s: Cannot set regulator %s\n", __func__, name);
>> +               return ret;
>> +       }
>> +
>> +       return 0;
>> +}
>> +
>> +int exynos_power_init(void)
>> +{
>> +       struct udevice *dev;
>> +       int ret;
>> +
>> +       ret = pmic_get("max77686", &dev);
>> +       if (!ret) {
>> +               /* TODO(sjg at chromium.org): Move into the clock/pmic API */
>> +               ret = pmic_clrsetbits(dev, MAX77686_REG_PMIC_32KHZ, 0,
>> +                               MAX77686_32KHCP_EN);
>> +               if (ret)
>> +                       return ret;
>> +               ret = pmic_clrsetbits(dev, MAX77686_REG_PMIC_BBAT, 0,
>> +                               MAX77686_BBCHOSTEN | MAX77686_BBCVS_3_5V);
>> +               if (ret)
>> +                       return ret;
>> +       } else {
>> +               ret = pmic_get("s5m8767-pmic", &dev);
>> +               /* TODO(sjg at chromium.org): Use driver model to access
>> clock */
>> +#ifdef CONFIG_PMIC_S5M8767
>
>
> What about: "if (dev)" or "if (!ret && dev)", instead of #ifdef?
>
>> +               if (!ret)
>> +                       s5m8767_enable_32khz_cp(dev);
>> +#endif
>

Unfortunately s5m8767_enable_32khz_cp() doesn't go through driver
model so we can't call it if it is not compiled in. The correct fix
would be to add a clock device as a child of the PMIC and set that up
with the clock uclass. Later.

Applied to u-boot-dm.

Regards,
Simon


More information about the U-Boot mailing list