Re: [PATCH 6/6] checkpatch.pl: Request if() instead #ifdef

2020-06-14 Thread AKASHI Takahiro
On Thu, Jun 04, 2020 at 07:39:35PM -0400, Tom Rini wrote:
> On Fri, May 22, 2020 at 04:32:40PM -0600, Simon Glass wrote:
> 
> > There is a lot of use of #ifdefs in U-Boot. In an effort reduce this,
> > suggest using the compile-time construct.
> > 
> > Signed-off-by: Simon Glass 
> 
> Applied to u-boot/master, thanks!

This check is simple, but IMHO, too simple.
It will generate false-positive, or pointless, warnings
for some common use cases. Say,

In an include header,
#ifdef CONFIG_xxx
extern int foo_data;
int foo(void);
#endif

Or in a C file (foo_common.c),
#ifdef CONFIG_xxx_a
int foo_a(void)
...
#endif
#ifdef CONFIG_xxx_b
int foo_b(void)
...
#endif

Or,

struct baa baa_list[] = {
#ifdef CONFIG_xxx
data_xxx,
#endif
...

They are harmless and can be ignored, but also annoying.
Can you sophisticate this check?

In addition, if I want to stick to this rule, there can co-exist
an "old" style and "new" style of code in a single file.
(particularly tons of examples in UEFI subsystem)

How should we deal with this?

Thanks,
-Takahiro Akashi

> -- 
> Tom




Re: [RESEND v2 1/1] log: don't show function by default

2020-06-14 Thread Heinrich Schuchardt

On 6/7/20 8:50 PM, Heinrich Schuchardt wrote:

The name of the function emitting a log message may be of interest for a
developer but is distracting for normal users. See the example below:

 try_load_entry() Booting: Debian

Make the default format for log messages customizable. By default show
only the message text.

Signed-off-by: Heinrich Schuchardt 


Hello Simon,

thanks for accepting my other log related patches. I did not yet get any
feedback for this one. I would need it before upstreaming patches for
using log functions in the UEFI sub-system instead of printf().

My target is to collect log messages about the boot process on my syslog
server.

Best regards

Heinrich


---
v2:
adjust logging tests
adjust description of log command
---
  cmd/log.c |  2 +-
  common/Kconfig| 18 ++
  include/log.h | 12 +++-
  test/log/syslog_test.c| 20 ++--
  test/py/tests/test_log.py |  2 ++
  5 files changed, 46 insertions(+), 8 deletions(-)

diff --git a/cmd/log.c b/cmd/log.c
index 78352b2cb9..2c91545c0d 100644
--- a/cmd/log.c
+++ b/cmd/log.c
@@ -139,7 +139,7 @@ static char log_help_text[] =
"log format  - set log output format.  is a string where\n"
"\teach letter indicates something that should be displayed:\n"
"\tc=category, l=level, F=file, L=line number, f=function, m=msg\n"
-   "\tor 'default', equivalent to 'fm', or 'all' for all\n"
+   "\tor 'default', or 'all' for all\n"
"log rec   - "
"output a log record"
;
diff --git a/common/Kconfig b/common/Kconfig
index 7872bc46cd..60cae77f20 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -792,6 +792,24 @@ config TPL_LOG_CONSOLE

  endif

+config LOGF_FILE
+   bool "Show source file name in log messages by default"
+   help
+ Show the source file name in log messages by default. This value
+ can be overridden using the 'log format' command.
+
+config LOGF_LINE
+   bool "Show source line number in log messages by default"
+   help
+ Show the source line number in log messages by default. This value
+ can be overridden using the 'log format' command.
+
+config LOGF_FUNC
+   bool "Show function name in log messages by default"
+   help
+ Show the function name in log messages by default. This value can
+ be overridden using the 'log format' command.
+
  config LOG_ERROR_RETURN
bool "Log all functions which return an error"
help
diff --git a/include/log.h b/include/log.h
index df65398c04..ec471c3a01 100644
--- a/include/log.h
+++ b/include/log.h
@@ -411,7 +411,17 @@ enum log_fmt {
LOGF_MSG,

LOGF_COUNT,
-   LOGF_DEFAULT = (1 << LOGF_FUNC) | (1 << LOGF_MSG),
+   LOGF_DEFAULT =
+#ifdef CONFIG_LOGF_FILE
+   (1 << LOGF_FILE) |
+#endif
+#ifdef CONFIG_LOGF_LINE
+   (1 << LOGF_LINE) |
+#endif
+#ifdef CONFIG_LOGF_FUNC
+   (1 << LOGF_FUNC) |
+#endif
+   (1 << LOGF_MSG),
LOGF_ALL = 0x3f,
  };

diff --git a/test/log/syslog_test.c b/test/log/syslog_test.c
index 26536ebca7..d1dfd08581 100644
--- a/test/log/syslog_test.c
+++ b/test/log/syslog_test.c
@@ -21,6 +21,8 @@

  DECLARE_GLOBAL_DATA_PTR;

+#define LOGF_TEST ((1 << LOGF_FUNC) | (1 << LOGF_MSG))
+
  /**
   * struct sb_log_env - private data for sandbox ethernet driver
   *
@@ -102,7 +104,7 @@ static int log_test_syslog_err(struct unit_test_state *uts)
int old_log_level = gd->default_log_level;
struct sb_log_env env;

-   gd->log_fmt = LOGF_DEFAULT;
+   gd->log_fmt = LOGF_TEST;
gd->default_log_level = LOGL_INFO;
env_set("ethact", "eth@10002000");
env_set("log_hostname", "sandbox");
@@ -116,6 +118,7 @@ static int log_test_syslog_err(struct unit_test_state *uts)
/* Check that the callback function was called */
sandbox_eth_set_tx_handler(0, NULL);
gd->default_log_level = old_log_level;
+   gd->log_fmt = LOGF_DEFAULT;

return 0;
  }
@@ -132,7 +135,7 @@ static int log_test_syslog_warning(struct unit_test_state 
*uts)
int old_log_level = gd->default_log_level;
struct sb_log_env env;

-   gd->log_fmt = LOGF_DEFAULT;
+   gd->log_fmt = LOGF_TEST;
gd->default_log_level = LOGL_INFO;
env_set("ethact", "eth@10002000");
env_set("log_hostname", "sandbox");
@@ -147,6 +150,7 @@ static int log_test_syslog_warning(struct unit_test_state 
*uts)
/* Check that the callback function was called */
ut_assertnull(env.expected);
gd->default_log_level = old_log_level;
+   gd->log_fmt = LOGF_DEFAULT;

return 0;
  }
@@ -163,7 +167,7 @@ static int log_test_syslog_notice(struct unit_test_state 
*uts)
int old_log_level = gd->default_log_level;
struct sb_log_env env;

-   gd->log_fmt = LOGF_DEFAULT;
+   gd->log_fmt = LOGF_TEST;
  

[PATCH v3 06/10] gpio: dw: Add a trailing underscore to generated name

2020-06-14 Thread Sean Anderson
Previously, if there was no bank-name property, it was easy to have
confusing gpio names like "gpio1@08", instead of "gpio1@0_8". This patch
follows the example of the sifive gpio driver.

Signed-off-by: Sean Anderson 
---
This patch was previously submitted as part of
https://patchwork.ozlabs.org/project/uboot/list/?series=161576

(no changes since v1)

 drivers/gpio/dwapb_gpio.c | 10 +-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/gpio/dwapb_gpio.c b/drivers/gpio/dwapb_gpio.c
index bf324f5239..a52c9e18e3 100644
--- a/drivers/gpio/dwapb_gpio.c
+++ b/drivers/gpio/dwapb_gpio.c
@@ -186,7 +186,15 @@ static int gpio_dwapb_bind(struct udevice *dev)
 * Fall back to node name. This means accessing pins
 * via bank name won't work.
 */
-   plat->name = ofnode_get_name(node);
+   char name[32];
+
+   snprintf(name, sizeof(name), "%s_",
+ofnode_get_name(node));
+   plat->name = strdup(name);
+   if (!plat->name) {
+   kfree(plat);
+   return -ENOMEM;
+   }
}
 
ret = device_bind_ofnode(dev, dev->driver, plat->name,
-- 
2.26.2



[PATCH v3 08/10] led: gpio: Default to using node name if label is absent

2020-06-14 Thread Sean Anderson
This more closely mirrors Linux's behaviour, and will make it easier to
transition to using function+color in the future.

Signed-off-by: Sean Anderson 
---
This patch was previously submitted as part of
https://patchwork.ozlabs.org/project/uboot/list/?series=161576

(no changes since v1)

 drivers/led/led_gpio.c | 7 ++-
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/drivers/led/led_gpio.c b/drivers/led/led_gpio.c
index ef9b61ee62..2cdb0269f4 100644
--- a/drivers/led/led_gpio.c
+++ b/drivers/led/led_gpio.c
@@ -99,11 +99,8 @@ static int led_gpio_bind(struct udevice *parent)
const char *label;
 
label = ofnode_read_string(node, "label");
-   if (!label) {
-   debug("%s: node %s has no label\n", __func__,
- ofnode_get_name(node));
-   return -EINVAL;
-   }
+   if (!label)
+   label = ofnode_get_name(node);
ret = device_bind_driver_to_node(parent, "gpio_led",
 ofnode_get_name(node),
 node, );
-- 
2.26.2



[PATCH v3 07/10] gpio: dw: Return output value when direction is out

2020-06-14 Thread Sean Anderson
dm_gpio_ops.get_value can be called when the gpio is either input or
output. The current dw code always returns the input value, which is
invalid if the direction is set to out.

Signed-off-by: Sean Anderson 
Reviewed-by: Ley Foon Tan 
---
This patch was previously submitted as part of
https://patchwork.ozlabs.org/project/uboot/list/?series=161576

Changes in v3:
- Undo reorder to prevent use-before-declared error

Changes in v2:
- Reorder changes to minimize diff

 drivers/gpio/dwapb_gpio.c | 19 ---
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/drivers/gpio/dwapb_gpio.c b/drivers/gpio/dwapb_gpio.c
index a52c9e18e3..37916e7771 100644
--- a/drivers/gpio/dwapb_gpio.c
+++ b/drivers/gpio/dwapb_gpio.c
@@ -66,13 +66,6 @@ static int dwapb_gpio_direction_output(struct udevice *dev, 
unsigned pin,
return 0;
 }
 
-static int dwapb_gpio_get_value(struct udevice *dev, unsigned pin)
-{
-   struct gpio_dwapb_platdata *plat = dev_get_platdata(dev);
-   return !!(readl(plat->base + GPIO_EXT_PORT(plat->bank)) & (1 << pin));
-}
-
-
 static int dwapb_gpio_set_value(struct udevice *dev, unsigned pin, int val)
 {
struct gpio_dwapb_platdata *plat = dev_get_platdata(dev);
@@ -98,6 +91,18 @@ static int dwapb_gpio_get_function(struct udevice *dev, 
unsigned offset)
return GPIOF_INPUT;
 }
 
+static int dwapb_gpio_get_value(struct udevice *dev, unsigned pin)
+{
+   struct gpio_dwapb_platdata *plat = dev_get_platdata(dev);
+   u32 value;
+
+   if (dwapb_gpio_get_function(dev, pin) == GPIOF_OUTPUT)
+   value = readl(plat->base + GPIO_SWPORT_DR(plat->bank));
+   else
+   value = readl(plat->base + GPIO_EXT_PORT(plat->bank));
+   return !!(value & BIT(pin));
+}
+
 static const struct dm_gpio_ops gpio_dwapb_ops = {
.direction_input= dwapb_gpio_direction_input,
.direction_output   = dwapb_gpio_direction_output,
-- 
2.26.2



[PATCH v3 03/10] pinctrl: Add support for Kendryte K210 FPIOA

2020-06-14 Thread Sean Anderson
The Fully-Programmable Input/Output Array (FPIOA) device controls pin
multiplexing on the K210. The FPIOA can remap any supported function to any
multifunctional IO pin. It can also perform basic GPIO functions, such as
reading the current value of a pin. However, GPIO functionality remains
largely unimplemented (in favor of the dedicated GPIO peripherals).

Signed-off-by: Sean Anderson 
---
This patch was previously submitted as part of
https://patchwork.ozlabs.org/project/uboot/list/?series=161576

Changes from that version include:
- Reformat to reduce errors from checkpatch

(no changes since v2)

Changes in v2:
- Don't clear existing pinctrl settings on probe
- Rewrite to use pinmux property
- Support muxing the output enable signal for each function
- Support output and input inversion
- Update binding documentation

 MAINTAINERS   |   2 +
 .../pinctrl/kendryte,k210-fpioa.txt   | 102 +++
 drivers/pinctrl/Kconfig   |   1 +
 drivers/pinctrl/Makefile  |   1 +
 drivers/pinctrl/kendryte/Kconfig  |   7 +
 drivers/pinctrl/kendryte/Makefile |   1 +
 drivers/pinctrl/kendryte/pinctrl.c| 678 ++
 drivers/pinctrl/kendryte/pinctrl.h|  70 ++
 include/dt-bindings/pinctrl/k210-pinctrl.h| 277 +++
 9 files changed, 1139 insertions(+)
 create mode 100644 doc/device-tree-bindings/pinctrl/kendryte,k210-fpioa.txt
 create mode 100644 drivers/pinctrl/kendryte/Kconfig
 create mode 100644 drivers/pinctrl/kendryte/Makefile
 create mode 100644 drivers/pinctrl/kendryte/pinctrl.c
 create mode 100644 drivers/pinctrl/kendryte/pinctrl.h
 create mode 100644 include/dt-bindings/pinctrl/k210-pinctrl.h

diff --git a/MAINTAINERS b/MAINTAINERS
index 2b58cf7d94..e0bae4f199 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -876,7 +876,9 @@ RISC-V KENDRYTE
 M: Sean Anderson 
 S: Maintained
 F: doc/device-tree-bindings/mfd/kendryte,k210-sysctl.txt
+F: doc/device-tree-bindings/pinctrl/kendryte,k210-fpioa.txt
 F: drivers/clk/kendryte/
+F: drivers/pinctrl/kendryte/
 F: include/kendryte/
 
 RNG
diff --git a/doc/device-tree-bindings/pinctrl/kendryte,k210-fpioa.txt 
b/doc/device-tree-bindings/pinctrl/kendryte,k210-fpioa.txt
new file mode 100644
index 00..06a9cc060f
--- /dev/null
+++ b/doc/device-tree-bindings/pinctrl/kendryte,k210-fpioa.txt
@@ -0,0 +1,102 @@
+Kendryte K210 FPIOA
+
+This binding describes the Fully-Programmable Input/Output Array (FPIOA) found
+in Kendryte K210 SoCs. Any of the 256 functions can be mapped to any of the 48
+pins.
+
+Required properties:
+- compatible: should be "kendryte,k210-fpioa"
+- reg: address and length of the FPIOA registers
+- kendryte,sysctl: phandle to the "sysctl" register map node
+- kendryte,power-offset: offset in the register map of the power bank control
+  register (in bytes)
+
+Configuration nodes
+
+Pin configuration nodes are documented in pinctrl-bindings.txt
+
+Required properties for pin-configuration nodes or sub-nodes are:
+- groups: list of power groups to which the configuration applies. Valid groups
+  are:
+   A0, A1, A2, B0, B1, B2, C0, C1
+  (either this or "pinmux" must be specified)
+- pinmux: integer array representing pin multiplexing configuration. In 
addition
+  to the 256 standard functions, each pin can also output the direction
+  indicator (DO) of any function. This signal is high whenever the function
+  would normally drive the output. Helper macros to ease assembling the 
"pinmux"
+  arguments from the pin and function are provided by the FPIOA header file at:
+  
+  Integer values in the "pinmux" argument list are assembled as:
+  ((PIN << 16) | (DO << 8) | (FUNC))
+  Valid values for PIN are numbers 0 through 47.
+  Valid values for DO are 0 or 1.
+  Valid values for FUNC are numbers 0 through 255. For a complete list of
+  acceptable functions, consult the FPIOA header file.
+  (either this or "groups" must be specified)
+
+Optional properties for "pinmux" nodes are:
+   bias-disable, bias-pull-down, bias-pull-up, drive-strength,
+   drive-strength-ua, input-enable, input-disable, input-schmitt-enable,
+   input-schmitt-disable, output-low, output-high, output-enable,
+   output-disable, slew-rate, output-polarity-invert, input-polarity-invert
+
+Optional properties for "groups" nodes are:
+   power-source
+
+Notes on specific properties include:
+- bias-pull-up, -down, and -pin-default: The pull strength cannot be 
configured.
+- drive-strength: There are 8 drive strength settings between 11 and 50 mA.
+- input- and output-polarity-invert: Invert the polarity of either the input or
+  the output, respectively.
+- power-source: Controls the output voltage of a bank of pins. Either
+  K210_PC_POWER_1V8 or K210_PC_POWER_3V3 may be specified.
+- slew-rate: Specifying this property reduces the slew rate.
+
+Example:
+fpioa: pinmux@502B {
+   compatible = 

[PATCH v3 05/10] gpio: dw: Fix warnings about casting int to pointer

2020-06-14 Thread Sean Anderson
Change the type of gpio_dwabp_platdata.base from fdt_addr_t to a void
pointer, since we pass it to readl.

Signed-off-by: Sean Anderson 
Reviewed-by: Ley Foon Tan 
Reviewed-by: Bin Meng 
---
This patch was previously submitted as part of
https://patchwork.ozlabs.org/project/uboot/list/?series=161576

(no changes since v1)

 drivers/gpio/dwapb_gpio.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpio/dwapb_gpio.c b/drivers/gpio/dwapb_gpio.c
index e5e3518194..bf324f5239 100644
--- a/drivers/gpio/dwapb_gpio.c
+++ b/drivers/gpio/dwapb_gpio.c
@@ -40,7 +40,7 @@ struct gpio_dwapb_platdata {
const char  *name;
int bank;
int pins;
-   fdt_addr_t  base;
+   void __iomem*base;
 };
 
 static int dwapb_gpio_direction_input(struct udevice *dev, unsigned pin)
@@ -176,7 +176,7 @@ static int gpio_dwapb_bind(struct udevice *dev)
if (!plat)
return -ENOMEM;
 
-   plat->base = base;
+   plat->base = (void *)base;
plat->bank = bank;
plat->pins = ofnode_read_u32_default(node, "snps,nr-gpios", 0);
 
-- 
2.26.2



[PATCH v3 01/10] pinctrl: Add pinmux property support to pinctrl-generic

2020-06-14 Thread Sean Anderson
The pinmux property allows for smaller and more compact device trees,
especially when there are many pins which need to be assigned individually.
Instead of specifying an array of strings to be parsed as pins and a
function property, the pinmux property contains an array of integers
representing pinmux groups. A pinmux group consists of the pin identifier
and mux settings represented as a single integer or an array of integers.
Each individual pin controller driver specifies the exact format of a
pinmux group. As specified in the Linux documentation, a pinmux group may
be multiple integers long. However, no existing drivers use multi-integer
pinmux groups, so I have chosen to omit this feature. This makes the
implementation easier, since there is no need to allocate a buffer to do
endian conversions.

Support for the pinmux property is done differently than in Linux.  As far
as I can tell, inversion of control is used when implementing support for
the pins and groups properties to avoid allocating. This results in some
duplication of effort; every property in a config node is parsed once for
each pin in that node. This is not such an overhead with pins and groups
properties, since having multiple pins in one config node does not occur
especially often. However, the semantics of the pinmux property make such a
configuration much more appealing. A future patch could parse all config
properties at once and store them in an array. This would make it easier to
create drivers which do not function solely as callbacks from
pinctrl-generic.

This commit increases the size of the sandbox build by approximately 48
bytes.  However, it also decreases the size of the K210 device tree by 2
KiB from the previous version of this series.

The documentation has been updated from the last Linux commit before it was
split off into yaml files.

Signed-off-by: Sean Anderson 
---

(no changes since v2)

Changes in v2:
- New

 .../pinctrl/pinctrl-bindings.txt  |  65 -
 drivers/pinctrl/pinctrl-generic.c | 125 ++
 include/dm/pinctrl.h  |  21 +--
 3 files changed, 168 insertions(+), 43 deletions(-)

diff --git a/doc/device-tree-bindings/pinctrl/pinctrl-bindings.txt 
b/doc/device-tree-bindings/pinctrl/pinctrl-bindings.txt
index b73c96d24f..603796f169 100644
--- a/doc/device-tree-bindings/pinctrl/pinctrl-bindings.txt
+++ b/doc/device-tree-bindings/pinctrl/pinctrl-bindings.txt
@@ -119,7 +119,8 @@ For example:
 
 The contents of each of those pin configuration child nodes is defined
 entirely by the binding for the individual pin controller device. There
-exists no common standard for this content.
+exists no common standard for this content. The pinctrl framework only
+provides generic helper bindings that the pin controller driver can use.
 
 The pin configuration nodes need not be direct children of the pin controller
 device; they may be grandchildren, for example. Whether this is legal, and
@@ -156,6 +157,29 @@ state_2_node_a {
pins = "mfio29", "mfio30";
 };
 
+For hardware where pin multiplexing configurations have to be specified for
+each single pin the number of required sub-nodes containing "pin" and
+"function" properties can quickly escalate and become hard to write and
+maintain.
+
+For cases like this, the pin controller driver may use the pinmux helper
+property, where the pin identifier is provided with mux configuration settings
+in a pinmux group. A pinmux group consists of the pin identifier and mux
+settings represented as a single integer or an array of integers.
+
+The pinmux property accepts an array of pinmux groups, each of them describing
+a single pin multiplexing configuration.
+
+pincontroller {
+   state_0_node_a {
+   pinmux = , , ...;
+   };
+};
+
+Each individual pin controller driver bindings documentation shall specify
+how pin IDs and pin multiplexing configuration are defined and assembled
+together in a pinmux group.
+
 == Generic pin configuration node content ==
 
 Many data items that are represented in a pin configuration node are common
@@ -168,12 +192,15 @@ structure of the DT nodes that contain these properties.
 Supported generic properties are:
 
 pins   - the list of pins that properties in the node
- apply to (either this or "group" has to be
+ apply to (either this, "group" or "pinmux" has to be
  specified)
 group  - the group to apply the properties to, if the driver
  supports configuration of whole groups rather than
- individual pins (either this or "pins" has to be
- specified)
+ individual pins (either this, "pins" or "pinmux" has
+ to be specified)
+pinmux - the list of numeric pin ids and their mux settings
+ that 

[PATCH v3 04/10] gpio: sifive: Use generic reg read function

2020-06-14 Thread Sean Anderson
Using an fdt-specific function causes problems with a live tree.

Signed-off-by: Sean Anderson 
Reviewed-by: Bin Meng 
---
This patch was previously submitted as part of
https://patchwork.ozlabs.org/project/uboot/list/?series=161576

(no changes since v1)

 drivers/gpio/sifive-gpio.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpio/sifive-gpio.c b/drivers/gpio/sifive-gpio.c
index 24da3b3c23..bf3537b76b 100644
--- a/drivers/gpio/sifive-gpio.c
+++ b/drivers/gpio/sifive-gpio.c
@@ -159,7 +159,7 @@ static int sifive_gpio_ofdata_to_platdata(struct udevice 
*dev)
struct sifive_gpio_platdata *plat = dev_get_platdata(dev);
fdt_addr_t addr;
 
-   addr = devfdt_get_addr(dev);
+   addr = dev_read_addr(dev);
if (addr == FDT_ADDR_T_NONE)
return -EINVAL;
 
-- 
2.26.2



[PATCH v3 00/10] riscv: Add FPIOA and GPIO support for Kendryte K210

2020-06-14 Thread Sean Anderson
This patch series adds support for pinmuxing, gpios, and leds on the Kendyte
K210.

This patch series was previously part of
https://patchwork.ozlabs.org/project/uboot/list/?series=161576

This patch series depends on
https://patchwork.ozlabs.org/project/uboot/list/?series=178480

Changes in v3:
- Add dt-bindings/pinctrl/sandbox-pinmux.h to patch

Changes in v2:
- Add test for pinmuxing
- Don't clear existing pinctrl settings on probe
- Re-order GPIOs to match the defaults more closely
- Rebase onto v13 of "riscv: Add Sipeed Maix support"
- Rewrite FPIOA driver to use pinmux property
- Support muxing the output enable signal for each function in the FPIOA
- Support output and input inversion in the pinmux driver
- Support pinmux property in pinctrl-generic

Sean Anderson (10):
  pinctrl: Add pinmux property support to pinctrl-generic
  test: pinmux: Add test for pin muxing
  pinctrl: Add support for Kendryte K210 FPIOA
  gpio: sifive: Use generic reg read function
  gpio: dw: Fix warnings about casting int to pointer
  gpio: dw: Add a trailing underscore to generated name
  gpio: dw: Return output value when direction is out
  led: gpio: Default to using node name if label is absent
  riscv: Add pinmux and gpio bindings for Kendryte K210
  riscv: Add FPIOA and GPIO support for Kendryte K210

 MAINTAINERS   |   2 +
 arch/riscv/dts/k210-maix-bit.dts  | 104 +++
 arch/riscv/dts/k210.dtsi  |  12 +
 arch/sandbox/dts/test.dts |  45 +-
 board/sipeed/maix/Kconfig |   9 +
 doc/board/sipeed/maix.rst |  64 +-
 .../pinctrl/kendryte,k210-fpioa.txt   | 102 +++
 .../pinctrl/pinctrl-bindings.txt  |  65 +-
 drivers/gpio/dwapb_gpio.c |  33 +-
 drivers/gpio/sifive-gpio.c|   2 +-
 drivers/led/led_gpio.c|   7 +-
 drivers/pinctrl/Kconfig   |   1 +
 drivers/pinctrl/Makefile  |   1 +
 drivers/pinctrl/kendryte/Kconfig  |   7 +
 drivers/pinctrl/kendryte/Makefile |   1 +
 drivers/pinctrl/kendryte/pinctrl.c| 678 ++
 drivers/pinctrl/kendryte/pinctrl.h|  70 ++
 drivers/pinctrl/pinctrl-generic.c | 125 +++-
 drivers/pinctrl/pinctrl-sandbox.c | 155 +++-
 include/dm/pinctrl.h  |  21 +-
 include/dt-bindings/pinctrl/k210-pinctrl.h| 277 +++
 include/dt-bindings/pinctrl/sandbox-pinmux.h  |  19 +
 test/dm/Makefile  |   3 +
 test/py/tests/test_pinmux.py  |  36 +-
 24 files changed, 1717 insertions(+), 122 deletions(-)
 create mode 100644 doc/device-tree-bindings/pinctrl/kendryte,k210-fpioa.txt
 create mode 100644 drivers/pinctrl/kendryte/Kconfig
 create mode 100644 drivers/pinctrl/kendryte/Makefile
 create mode 100644 drivers/pinctrl/kendryte/pinctrl.c
 create mode 100644 drivers/pinctrl/kendryte/pinctrl.h
 create mode 100644 include/dt-bindings/pinctrl/k210-pinctrl.h
 create mode 100644 include/dt-bindings/pinctrl/sandbox-pinmux.h

-- 
2.26.2



[PATCH v3 02/10] test: pinmux: Add test for pin muxing

2020-06-14 Thread Sean Anderson
This extends the pinctrl-sandbox driver to support pin muxing, and adds a
test for that behaviour. The test is done in C and not python (like the
existing tests for the pinctrl uclass) because it needs to call
pinctrl_select_state.  Another option could be to add a command that
invokes pinctrl_select_state and then test everything in
test/py/tests/test_pinmux.py.

The pinctrl-sandbox driver now mimics the way that many pinmux devices
work.  There are two groups of pins which are muxed together, as well as
four pins which are muxed individually. I have tried to test all normal
paths. However, very few error cases are explicitly checked for.

Signed-off-by: Sean Anderson 
---

Changes in v3:
- Add dt-bindings/pinctrl/sandbox-pinmux.h to patch

Changes in v2:
- New

 arch/sandbox/dts/test.dts|  45 +-
 drivers/pinctrl/pinctrl-sandbox.c| 155 ++-
 include/dt-bindings/pinctrl/sandbox-pinmux.h |  19 +++
 test/dm/Makefile |   3 +
 test/py/tests/test_pinmux.py |  36 ++---
 5 files changed, 197 insertions(+), 61 deletions(-)
 create mode 100644 include/dt-bindings/pinctrl/sandbox-pinmux.h

diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts
index f5b685f7fe..36736f374d 100644
--- a/arch/sandbox/dts/test.dts
+++ b/arch/sandbox/dts/test.dts
@@ -2,6 +2,7 @@
 
 #include 
 #include 
+#include 
 
 / {
model = "sandbox";
@@ -967,30 +968,60 @@
pinctrl {
compatible = "sandbox,pinctrl";
 
-   pinctrl-names = "default";
-   pinctrl-0 = <>;
+   pinctrl-names = "default", "alternate";
+   pinctrl-0 = <_gpios>, <_i2s>;
+   pinctrl-1 = <_spi>, <_i2c>;
 
-   gpios: gpios {
+   pinctrl_gpios: gpios {
gpio0 {
-   pins = "GPIO0";
+   pins = "P5";
+   function = "GPIO";
bias-pull-up;
input-disable;
};
gpio1 {
-   pins = "GPIO1";
+   pins = "P6";
+   function = "GPIO";
output-high;
drive-open-drain;
};
gpio2 {
-   pins = "GPIO2";
+   pinmux = ;
bias-pull-down;
input-enable;
};
gpio3 {
-   pins = "GPIO3";
+   pinmux = ;
bias-disable;
};
};
+
+   pinctrl_i2c: i2c {
+   groups {
+   groups = "I2C_UART";
+   function = "I2C";
+   };
+
+   pins {
+   pins = "P0", "P1";
+   drive-open-drain;
+   };
+   };
+
+   pinctrl_i2s: i2s {
+   groups = "SPI_I2S";
+   function = "I2S";
+   };
+
+   pinctrl_spi: spi {
+   groups = "SPI_I2S";
+   function = "SPI";
+
+   cs {
+   pinmux = ,
+;
+   };
+   };
};
 
hwspinlock@0 {
diff --git a/drivers/pinctrl/pinctrl-sandbox.c 
b/drivers/pinctrl/pinctrl-sandbox.c
index ac0119d198..9aa13fbd55 100644
--- a/drivers/pinctrl/pinctrl-sandbox.c
+++ b/drivers/pinctrl/pinctrl-sandbox.c
@@ -3,55 +3,67 @@
  * Copyright (C) 2015  Masahiro Yamada 
  */
 
-/* #define DEBUG */
-
 #include 
 #include 
-#include 
 #include 
+#include 
+#include 
 #include 
 
+/*
+ * This driver emulates a pin controller with the following rules:
+ * - The pinctrl config for each pin must be set individually
+ * - The first three pins (P0-P2) must be muxed as a group
+ * - The next two pins (P3-P4) must be muxed as a group
+ * - The last four pins (P5-P8) must be muxed individually
+ */
+
 static const char * const sandbox_pins[] = {
-   "SCL",
-   "SDA",
-   "TX",
-   "RX",
-   "W1",
-   "GPIO0",
-   "GPIO1",
-   "GPIO2",
-   "GPIO3",
+#define PIN(x) \
+   [x] = "P" #x
+   PIN(0),
+   PIN(1),
+   PIN(2),
+   PIN(3),
+   PIN(4),
+   PIN(5),
+   PIN(6),
+   PIN(7),
+   PIN(8),
+#undef PIN
 };
 
-static const char * const sandbox_pins_muxing[] = {
-   "I2C SCL",
-   "I2C SDA",
-   "Uart TX",
-   "Uart RX",
-   "1-wire gpio",
-   "gpio",
-   "gpio",
-   "gpio",

[PATCH v3 09/10] riscv: Add pinmux and gpio bindings for Kendryte K210

2020-06-14 Thread Sean Anderson
This patch adds the necessary device tree bindings.

Signed-off-by: Sean Anderson 

---

(no changes since v2)

Changes in v2:
- Convert to use pinmux property
- Don't hog ISP on boot
- Re-order GPIOs to match the defaults more closely

 arch/riscv/dts/k210-maix-bit.dts | 104 +++
 arch/riscv/dts/k210.dtsi |  12 
 2 files changed, 116 insertions(+)

diff --git a/arch/riscv/dts/k210-maix-bit.dts b/arch/riscv/dts/k210-maix-bit.dts
index 5b32c5fd5f..e840e04ada 100644
--- a/arch/riscv/dts/k210-maix-bit.dts
+++ b/arch/riscv/dts/k210-maix-bit.dts
@@ -17,6 +17,22 @@
stdout-path = "serial0:115200";
};
 
+   gpio-leds {
+   compatible = "gpio-leds";
+
+   green {
+   gpios = <_0 4 GPIO_ACTIVE_LOW>;
+   };
+
+   red {
+   gpios = <_0 5 GPIO_ACTIVE_LOW>;
+   };
+
+   blue {
+   gpios = <_0 6 GPIO_ACTIVE_LOW>;
+   };
+   };
+
sound {
compatible = "simple-audio-card";
simple-audio-card,format = "i2s";
@@ -39,9 +55,97 @@
 };
 
  {
+   pinctrl-0 = <_uarths>;
+   pinctrl-names = "default";
+   status = "okay";
+};
+
+ {
+   pinctrl-0 = <_gpiohs>;
+   pinctrl-names = "default";
+   status = "okay";
+};
+
+ {
+   pinctrl-0 = <_gpio>;
+   pinctrl-names = "default";
status = "okay";
 };
 
  {
#sound-dai-cells = <1>;
+   pinctrl-0 = <_i2s0>;
+   pinctrl-names = "default";
+};
+
+ {
+   status = "okay";
+
+   fpioa_uarths: uarths {
+   pinmux = ,
+;
+   };
+
+   fpioa_gpio: gpio {
+   pinmux = ,
+,
+,
+,
+,
+,
+,
+;
+   };
+
+   fpioa_gpiohs: gpiohs {
+   pinmux = ,
+,
+,
+,
+,
+,
+,
+,
+,
+,
+,
+,
+;
+   };
+
+   fpioa_i2s0: i2s0 {
+   pinmux = ,
+,
+;
+   };
+
+   fpioa_dvp: dvp {
+   pinmux = ,
+,
+,
+,
+,
+,
+,
+;
+   };
+
+   fpioa_spi0: spi0 {
+   pinmux = ,  /* cs */
+,  /* rst */
+,  /* dc */
+; /* wr */
+   };
+
+   fpioa_spi1: spi1 {
+   pinmux = ,
+,
+,
+;
+   };
+};
+
+ {
+   pinctrl-0 = <_dvp>;
+   pinctrl-names = "default";
 };
diff --git a/arch/riscv/dts/k210.dtsi b/arch/riscv/dts/k210.dtsi
index 2546c7d4e0..fc7986b326 100644
--- a/arch/riscv/dts/k210.dtsi
+++ b/arch/riscv/dts/k210.dtsi
@@ -5,6 +5,7 @@
 
 #include 
 #include 
+#include 
 #include 
 
 / {
@@ -367,7 +368,18 @@
reg = <0x502B 0x100>;
clocks = < K210_CLK_FPIOA>;
resets = < K210_RST_FPIOA>;
+   kendryte,sysctl = <>;
+   kendryte,power-offset = ;
+   pinctrl-0 = <_jtag>;
+   pinctrl-names = "default";
status = "disabled";
+
+   fpioa_jtag: jtag {
+   pinmux = ,
+,
+,
+;
+   };
};
 
sha256: sha256@502C {
-- 
2.26.2



[PATCH v3 10/10] riscv: Add FPIOA and GPIO support for Kendryte K210

2020-06-14 Thread Sean Anderson
This patch adds the necessary configs and docs for FPIOA and GPIO support
on the K210.

Signed-off-by: Sean Anderson 
---

Changes in v3:
- Document pins 6 and 7 as not set

Changes in v2:
- Remove SPI flash related Kconfig settings

 board/sipeed/maix/Kconfig |  9 ++
 doc/board/sipeed/maix.rst | 64 +--
 2 files changed, 71 insertions(+), 2 deletions(-)

diff --git a/board/sipeed/maix/Kconfig b/board/sipeed/maix/Kconfig
index 0cdcd32adc..4c42dd2087 100644
--- a/board/sipeed/maix/Kconfig
+++ b/board/sipeed/maix/Kconfig
@@ -44,4 +44,13 @@ config BOARD_SPECIFIC_OPTIONS
imply RESET_SYSCON
imply SYSRESET
imply SYSRESET_SYSCON
+   imply PINCTRL
+   imply PINCONF
+   imply PINCTRL_K210
+   imply DM_GPIO
+   imply DWAPB_GPIO
+   imply SIFIVE_GPIO
+   imply CMD_GPIO
+   imply LED
+   imply LED_GPIO
 endif
diff --git a/doc/board/sipeed/maix.rst b/doc/board/sipeed/maix.rst
index 06e0008b9f..1865e2adfb 100644
--- a/doc/board/sipeed/maix.rst
+++ b/doc/board/sipeed/maix.rst
@@ -132,7 +132,7 @@ To run legacy images, use the ``bootm`` command:
 Load Address: 8000
 Entry Point:  8000
 
-$ picocom -b 115200 /dev/ttyUSB0i
+$ picocom -b 115200 /dev/ttyUSB0
 => loady
 ## Ready for binary (ymodem) download to 0x8000 at 115200 bps...
 C
@@ -163,6 +163,66 @@ To run legacy images, use the ``bootm`` command:
 argv[0] = ""
 Hit any key to exit ...
 
+Pin Assignment
+--
+
+The K210 contains a Fully Programmable I/O Array (FPIOA), which can remap any 
of
+its 256 input functions to any any of 48 output pins. The following table has
+the default pin assignments for the BitM.
+
+= == ===
+Pin   Function   Comment
+= == ===
+IO_0  JTAG_TCLK
+IO_1  JTAG_TDI
+IO_2  JTAG_TMS
+IO_3  JTAG_TDO
+IO_4  UARTHS_RX
+IO_5  UARTHS_TX
+IO_6 Not set
+IO_7 Not set
+IO_8  GPIO_0
+IO_9  GPIO_1
+IO_10 GPIO_2
+IO_11 GPIO_3
+IO_12 GPIO_4 Green LED
+IO_13 GPIO_5 Red LED
+IO_14 GPIO_6 Blue LED
+IO_15 GPIO_7
+IO_16 GPIOHS_0   ISP
+IO_17 GPIOHS_1
+IO_18 I2S0_SCLK  MIC CLK
+IO_19 I2S0_WSMIC WS
+IO_20 I2S0_IN_D0 MIC SD
+IO_21 GPIOHS_5
+IO_22 GPIOHS_6
+IO_23 GPIOHS_7
+IO_24 GPIOHS_8
+IO_25 GPIOHS_9
+IO_26 SPI1_D1MMC MISO
+IO_27 SPI1_SCLK  MMC CLK
+IO_28 SPI1_D0MMC MOSI
+IO_29 GPIOHS_13  MMC CS
+IO_30 GPIOHS_14
+IO_31 GPIOHS_15
+IO_32 GPIOHS_16
+IO_33 GPIOHS_17
+IO_34 GPIOHS_18
+IO_35 GPIOHS_19
+IO_36 GPIOHS_20  Panel CS
+IO_37 GPIOHS_21  Panel RST
+IO_38 GPIOHS_22  Panel DC
+IO_39 SPI0_SCK   Panel WR
+IO_40 SCCP_SDA
+IO_41 SCCP_SCLK
+IO_42 DVP_RST
+IO_43 DVP_VSYNC
+IO_44 DVP_PWDN
+IO_45 DVP_HSYNC
+IO_46 DVP_XCLK
+IO_47 DVP_PCLK
+= == ===
+
 Over- and Under-clocking
 
 
@@ -294,5 +354,5 @@ AddressSize  Description
 0x8801C000 0x1000riscv priv spec 1.9 config
 0x8801D000 0x2000flattened device tree (contains only addresses and
  interrupts)
-0x8801f000 0x1000credits
+0x8801F000 0x1000credits
 == = ===
-- 
2.26.2



<    1   2