diff options
author | Tim Harvey <tharvey@gateworks.com> | 2016-05-24 11:03:55 -0700 |
---|---|---|
committer | Stefano Babic <sbabic@denx.de> | 2016-05-31 17:25:31 +0200 |
commit | f17a9af84645f5b820da2e7d017b014923ce1b88 (patch) | |
tree | c3ba568cd60d1b3525c8774140a43021ed5b3d60 | |
parent | 83e00f193e766337254c490c2b28118b75cc575a (diff) | |
download | u-boot-imx-f17a9af84645f5b820da2e7d017b014923ce1b88.zip u-boot-imx-f17a9af84645f5b820da2e7d017b014923ce1b88.tar.gz u-boot-imx-f17a9af84645f5b820da2e7d017b014923ce1b88.tar.bz2 |
imx: ventana: enable pwm device-tree property based on hwconfig
Most Ventana boards have a connector with off-board digital-I/O signals
including some that can be pinmuxed as either a PWM or a GPIO. The hwconfig
env variable is used to configure these and they will be pinmuxed according
to this configuration in the bootloader.
This patch adds a device-tree fixup that will enable the pwm controller
nodes appropriately for digital-I/O's that are configured as pwm via hwconfig
so that the pin can be used with the Linux kernel /sys/class/pwm API.
Signed-off-by: Tim Harvey <tharvey@gateworks.com>
-rw-r--r-- | board/gateworks/gw_ventana/common.c | 5 | ||||
-rw-r--r-- | board/gateworks/gw_ventana/gw_ventana.c | 30 |
2 files changed, 35 insertions, 0 deletions
diff --git a/board/gateworks/gw_ventana/common.c b/board/gateworks/gw_ventana/common.c index 7610381..44ee73f 100644 --- a/board/gateworks/gw_ventana/common.c +++ b/board/gateworks/gw_ventana/common.c @@ -762,6 +762,11 @@ void setup_board_gpio(int board, struct ventana_board_info *info) gpio_direction_input(cfg->gpio_param); } else if (hwconfig_subarg_cmp(arg, "mode", "pwm") && cfg->pwm_padmux) { + if (!cfg->pwm_param) { + printf("DIO%d: Error: pwm config invalid\n", + i); + continue; + } if (!quiet) printf("DIO%d: pwm%d\n", i, cfg->pwm_param); imx_iomux_v3_setup_pad(cfg->pwm_padmux[cputype] | diff --git a/board/gateworks/gw_ventana/gw_ventana.c b/board/gateworks/gw_ventana/gw_ventana.c index 7a3d96a..feb2df8 100644 --- a/board/gateworks/gw_ventana/gw_ventana.c +++ b/board/gateworks/gw_ventana/gw_ventana.c @@ -21,6 +21,7 @@ #include <asm/io.h> #include <dm.h> #include <dm/platform_data/serial_mxc.h> +#include <hwconfig.h> #include <i2c.h> #include <fdt_support.h> #include <fsl_esdhc.h> @@ -777,6 +778,16 @@ static int ft_sethdmiinfmt(void *blob, char *mode) return 0; } +/* enable a property of a node if the node is found */ +static inline void ft_enable_path(void *blob, const char *path) +{ + int i = fdt_path_offset(blob, path); + if (i >= 0) { + debug("enabling %s\n", path); + fdt_status_okay(blob, i); + } +} + /* * called prior to booting kernel or by 'fdt boardsetup' command * @@ -920,6 +931,25 @@ int ft_board_setup(void *blob, bd_t *bd) ft_sethdmiinfmt(blob, "yuv422bt656"); } + /* Configure DIO */ + for (i = 0; i < gpio_cfg[board_type].num_gpios; i++) { + struct dio_cfg *cfg = &gpio_cfg[board_type].dio_cfg[i]; + char arg[10]; + + sprintf(arg, "dio%d", i); + if (!hwconfig(arg)) + continue; + if (hwconfig_subarg_cmp(arg, "mode", "pwm") && cfg->pwm_param) + { + char path[48]; + sprintf(path, "/soc/aips-bus@02000000/pwm@%08x", + 0x02080000 + (0x4000 * (cfg->pwm_param - 1))); + printf(" Enabling pwm%d for DIO%d\n", + cfg->pwm_param, i); + ft_enable_path(blob, path); + } + } + /* * Peripheral Config: * remove nodes by alias path if EEPROM config tells us the |