* [PATCH v2 1/2] string: implement strchrnul
@ 2021-06-28 5:19 Ahmad Fatoum
2021-06-28 5:19 ` [PATCH v2 2/2] console: respect baudrate specified in device-tree stdout-path Ahmad Fatoum
2021-06-28 12:50 ` [PATCH v2 1/2] string: implement strchrnul Sascha Hauer
0 siblings, 2 replies; 3+ messages in thread
From: Ahmad Fatoum @ 2021-06-28 5:19 UTC (permalink / raw)
To: barebox; +Cc: Ahmad Fatoum
We have at least two places opencoding strchrnul, one of them needlessly
iterating twice instead of once over the string. Replace both by calling
a common single pass implementation.
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
v1 -> v2:
no change
---
commands/hwclock.c | 8 --------
drivers/of/base.c | 5 +----
include/linux/string.h | 4 ++++
lib/string.c | 18 ++++++++++++++++++
4 files changed, 23 insertions(+), 12 deletions(-)
diff --git a/commands/hwclock.c b/commands/hwclock.c
index 1b5c2cd100ca..7a5600c456c9 100644
--- a/commands/hwclock.c
+++ b/commands/hwclock.c
@@ -9,14 +9,6 @@
#include <string.h>
#include <environment.h>
-static char *strchrnul(const char *s, int c)
-{
- while (*s != '\0' && *s != c)
- s++;
-
- return (char *)s;
-}
-
static int sscanf_two_digits(char *s, int *res)
{
char buf[3];
diff --git a/drivers/of/base.c b/drivers/of/base.c
index f962159597df..1a1265bdd689 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -2497,10 +2497,7 @@ struct device_node *of_get_stdoutpath(void)
if (!name)
return 0;
- /* This could make use of strchrnul if it were available */
- p = strchr(name, ':');
- if (!p)
- p = name + strlen(name);
+ p = strchrnul(name, ':');
q = xstrndup(name, p - name);
diff --git a/include/linux/string.h b/include/linux/string.h
index 55bc905c0e6b..47a27a391f0b 100644
--- a/include/linux/string.h
+++ b/include/linux/string.h
@@ -25,6 +25,10 @@ extern __kernel_size_t strspn(const char *,const char *);
(typeof(&(s1)[0]))(_strstr((s1), (s2))); \
})
+#ifndef __HAVE_ARCH_STRCHRNUL
+extern char * strchrnul(const char *,int);
+#endif
+
/*
* Include machine specific inline routines
*/
diff --git a/lib/string.c b/lib/string.c
index bad186586fac..9aeb1d883022 100644
--- a/lib/string.c
+++ b/lib/string.c
@@ -274,6 +274,24 @@ char * _strchr(const char * s, int c)
#endif
EXPORT_SYMBOL(_strchr);
+#ifndef __HAVE_ARCH_STRCHRNUL
+/**
+ * strchrnul - Find and return a character in a string, or end of string
+ * @s: The string to be searched
+ * @c: The character to search for
+ *
+ * Returns pointer to first occurrence of 'c' in s. If c is not found, then
+ * return a pointer to the null byte at the end of s.
+ */
+char *strchrnul(const char *s, int c)
+{
+ while (*s && *s != (char)c)
+ s++;
+ return (char *)s;
+}
+EXPORT_SYMBOL(strchrnul);
+#endif
+
#ifndef __HAVE_ARCH_STRRCHR
/**
* strrchr - Find the last occurrence of a character in a string
--
2.30.2
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH v2 2/2] console: respect baudrate specified in device-tree stdout-path
2021-06-28 5:19 [PATCH v2 1/2] string: implement strchrnul Ahmad Fatoum
@ 2021-06-28 5:19 ` Ahmad Fatoum
2021-06-28 12:50 ` [PATCH v2 1/2] string: implement strchrnul Sascha Hauer
1 sibling, 0 replies; 3+ messages in thread
From: Ahmad Fatoum @ 2021-06-28 5:19 UTC (permalink / raw)
To: barebox; +Cc: Ahmad Fatoum
stdout-path in the device tree can have a suffix indicating line
settings. The baud rate contained within was so far ignored by barebox.
Change this so barebox first consults the stdout-path alias before
falling back to CONFIG_BAUDRATE.
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
v1 -> v2:
- don't override original baudrate if there's no :baudrate suffix
---
common/console.c | 20 ++++++++++----------
drivers/of/base.c | 19 ++++++++++++++-----
drivers/of/platform.c | 2 +-
include/of.h | 8 ++++----
4 files changed, 29 insertions(+), 20 deletions(-)
diff --git a/common/console.c b/common/console.c
index 8a0af75a1ff4..ad1a6aaab2a0 100644
--- a/common/console.c
+++ b/common/console.c
@@ -220,7 +220,7 @@ static void console_init_early(void)
initialized = CONSOLE_INITIALIZED_BUFFER;
}
-static void console_set_stdoutpath(struct console_device *cdev)
+static void console_set_stdoutpath(struct console_device *cdev, unsigned baudrate)
{
int id;
char *str;
@@ -232,8 +232,7 @@ static void console_set_stdoutpath(struct console_device *cdev)
if (id < 0)
return;
- str = basprintf("console=%s%d,%dn8", cdev->linux_console_name, id,
- cdev->baudrate);
+ str = basprintf("console=%s%d,%dn8", cdev->linux_console_name, id, baudrate);
globalvar_add_simple("linux.bootargs.console", str);
@@ -297,6 +296,7 @@ int console_register(struct console_device *newcdev)
struct device_node *serdev_node = console_is_serdev_node(newcdev);
struct device_d *dev = &newcdev->class_dev;
int activate = 0, ret;
+ unsigned baudrate = CONFIG_BAUDRATE;
if (!serdev_node && initialized == CONSOLE_UNINITIALIZED)
console_init_early();
@@ -327,11 +327,16 @@ int console_register(struct console_device *newcdev)
if (serdev_node)
return of_platform_populate(serdev_node, NULL, dev);
+ if (newcdev->dev && of_device_is_stdout_path(newcdev->dev, &baudrate)) {
+ activate = 1;
+ console_set_stdoutpath(newcdev, baudrate);
+ }
+
if (newcdev->setbrg) {
- ret = newcdev->setbrg(newcdev, CONFIG_BAUDRATE);
+ ret = newcdev->setbrg(newcdev, baudrate);
if (ret)
return ret;
- newcdev->baudrate_param = newcdev->baudrate = CONFIG_BAUDRATE;
+ newcdev->baudrate_param = newcdev->baudrate = baudrate;
dev_add_param_uint32(dev, "baudrate", console_baudrate_set,
NULL, &newcdev->baudrate_param, "%u", newcdev);
}
@@ -349,11 +354,6 @@ int console_register(struct console_device *newcdev)
activate = 1;
}
- if (newcdev->dev && of_device_is_stdout_path(newcdev->dev)) {
- activate = 1;
- console_set_stdoutpath(newcdev);
- }
-
list_add_tail(&newcdev->list, &console_list);
if (activate)
diff --git a/drivers/of/base.c b/drivers/of/base.c
index 1a1265bdd689..4104d7589305 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -2483,7 +2483,7 @@ void of_delete_node(struct device_node *node)
of_set_root_node(NULL);
}
-struct device_node *of_get_stdoutpath(void)
+struct device_node *of_get_stdoutpath(unsigned int *baudrate)
{
struct device_node *dn;
const char *name;
@@ -2505,15 +2505,24 @@ struct device_node *of_get_stdoutpath(void)
free(q);
+ if (baudrate && *p) {
+ unsigned rate = simple_strtoul(p + 1, NULL, 10);
+ if (rate)
+ *baudrate = rate;
+ }
+
return dn;
}
-int of_device_is_stdout_path(struct device_d *dev)
+int of_device_is_stdout_path(struct device_d *dev, unsigned int *baudrate)
{
- if (!dev->device_node)
- return 0;
+ unsigned int tmp = *baudrate;
+
+ if (!dev || !dev->device_node || dev->device_node != of_get_stdoutpath(&tmp))
+ return false;
- return dev->device_node == of_get_stdoutpath();
+ *baudrate = tmp;
+ return true;
}
/**
diff --git a/drivers/of/platform.c b/drivers/of/platform.c
index e3e8227b8c24..92b6caef5a2d 100644
--- a/drivers/of/platform.c
+++ b/drivers/of/platform.c
@@ -532,7 +532,7 @@ static int of_stdoutpath_init(void)
{
struct device_node *np;
- np = of_get_stdoutpath();
+ np = of_get_stdoutpath(NULL);
if (!np)
return 0;
diff --git a/include/of.h b/include/of.h
index a362ecfffb29..d82790c0523e 100644
--- a/include/of.h
+++ b/include/of.h
@@ -288,8 +288,8 @@ struct cdev *of_parse_partition(struct cdev *cdev, struct device_node *node);
int of_parse_partitions(struct cdev *cdev, struct device_node *node);
int of_fixup_partitions(struct device_node *np, struct cdev *cdev);
int of_partitions_register_fixup(struct cdev *cdev);
-struct device_node *of_get_stdoutpath(void);
-int of_device_is_stdout_path(struct device_d *dev);
+struct device_node *of_get_stdoutpath(unsigned int *);
+int of_device_is_stdout_path(struct device_d *dev, unsigned int *baudrate);
const char *of_get_model(void);
void *of_flatten_dtb(struct device_node *node);
int of_add_memory(struct device_node *node, bool dump);
@@ -326,12 +326,12 @@ static inline int of_partitions_register_fixup(struct cdev *cdev)
return -ENOSYS;
}
-static inline struct device_node *of_get_stdoutpath(void)
+static inline struct device_node *of_get_stdoutpath(unsigned int *rate)
{
return NULL;
}
-static inline int of_device_is_stdout_path(struct device_d *dev)
+static inline int of_device_is_stdout_path(struct device_d *dev, unsigned int *baudrate)
{
return 0;
}
--
2.30.2
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v2 1/2] string: implement strchrnul
2021-06-28 5:19 [PATCH v2 1/2] string: implement strchrnul Ahmad Fatoum
2021-06-28 5:19 ` [PATCH v2 2/2] console: respect baudrate specified in device-tree stdout-path Ahmad Fatoum
@ 2021-06-28 12:50 ` Sascha Hauer
1 sibling, 0 replies; 3+ messages in thread
From: Sascha Hauer @ 2021-06-28 12:50 UTC (permalink / raw)
To: Ahmad Fatoum; +Cc: barebox
On Mon, Jun 28, 2021 at 07:19:33AM +0200, Ahmad Fatoum wrote:
> We have at least two places opencoding strchrnul, one of them needlessly
> iterating twice instead of once over the string. Replace both by calling
> a common single pass implementation.
>
> Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
Applied, thanks
Sascha
--
Pengutronix e.K. | |
Steuerwalder Str. 21 | http://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2021-06-28 12:52 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-06-28 5:19 [PATCH v2 1/2] string: implement strchrnul Ahmad Fatoum
2021-06-28 5:19 ` [PATCH v2 2/2] console: respect baudrate specified in device-tree stdout-path Ahmad Fatoum
2021-06-28 12:50 ` [PATCH v2 1/2] string: implement strchrnul Sascha Hauer
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.