common: Add autoenable for components
PATCH 1/3 common: Add autoenable for components
This patch adds an API to automatically enable either hardware components with existing device drivers or i2c clients. All functions take a device tree path to find the hardware and will fix up the node status in the kernel device tree, if it's accessible.
--- common/Kconfig | 9 +++++ common/Makefile | 1 + common/autoenable.c | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++ include/autoenable.h | 21 ++++++++++ 4 files changed, 140 insertions(+) create mode 100644 common/autoenable.c create mode 100644 include/autoenable.h
common/Kconfig +9 -0
@@ -712,6 +712,15 @@ config CONSOLE_NONE endchoice +config KERNEL_AUTOENABLE + bool + prompt "Autoenable of components" + help + Say Y to unlock an API for automatically enable either hardware + components with existing device drivers or i2c clients. All functions + take a device tree path to find the hardware and will fix up the node + status in the kernel device tree, if it's accessible. + choice prompt "Console activation strategy" depends on CONSOLE_FULL
common/Makefile +1 -0
@@ -31,6 +31,7 @@ obj-$(CONFIG_FLEXIBLE_BOOTARGS) += bootargs.o obj-$(CONFIG_GLOBALVAR) += globalvar.o obj-$(CONFIG_GREGORIAN_CALENDER) += date.o obj-$(CONFIG_KALLSYMS) += kallsyms.o +obj-$(CONFIG_KERNEL_AUTOENABLE) += autoenable.o obj-$(CONFIG_MALLOC_DLMALLOC) += dlmalloc.o obj-$(CONFIG_MALLOC_TLSF) += tlsf_malloc.o tlsf.o obj-$(CONFIG_MALLOC_DUMMY) += dummy_malloc.o
common/autoenable.c new file +109 -0
109 lines not on this page · raw message
include/autoenable.h new file +21 -0
@@ -0,0 +1,21 @@ +#ifndef __AUTOENABLE_H +#define __AUTOENABLE_H + +#include <linux/err.h> + +#ifdef CONFIG_KERNEL_AUTOENABLE +int autoenable_device_by_path (char *path); +int autoenable_i2c_by_path (char *path); +#else +inline int autoenable_device_by_path (char *path) +{ +return -EINVAL ; +} + +inline int autoenable_i2c_by_path (char *path) +{ +return -EINVAL ; +} +#endif /* CONFIG_KERNEL_AUTOENABLE */ + +#endif /* __AUTOENABLE_H */
Signature · 7 lines
2.7.4 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
PATCH 2/3 ARM: dts: AM335x: Add dummy i2c nodes
These i2c nodes are needed for autoenable of i2c clients, because the autoenable API searches for device tree nodes to get the client address.
--- arch/arm/dts/am335x-phytec-phycore-som.dtsi | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
arch/arm/dts/am335x-phytec-phycore-som.dtsi +14 -0
@@ -164,6 +164,20 @@ pagesize = <32>; reg = <0x52>; }; + + /* The following i2c nodes are for the autoenable */ + i2c_tmp102: temp@4b { + compatible = "ti,tmp102"; + reg = <0x4b>; + status = "disabled"; + }; + + i2c_rtc: rtc@68 { + compatible = "rv4162"; + reg = <0x68>; + status = "disabled"; + }; + }; &mmc1 {
Signature · 7 lines
2.7.4 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
PATCH 3/3 ARM: phytec-som-am335x: Add autoenable
In reply to Daniel SchultzAdd autoenable for components, which can be populated on an AM335x phyCORE SoM.
--- arch/arm/boards/phytec-som-am335x/board.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
arch/arm/boards/phytec-som-am335x/board.c +12 -0
@@ -26,6 +26,7 @@#include <io.h> #include <linux/sizes.h> #include <envfs.h> +#include <autoenable.h> #include <state.h> #include <asm/armlinux.h> #include <generated/mach-types.h>
@@ -136,6 +137,17 @@ static int physom_devices_init(void) } } +/* Enable NAND */ +autoenable_device_by_path ("/ocp/gpmc@50000000" ); +/* Enable eMMC */ +autoenable_device_by_path ("/ocp/mmc@481d8000" ); +/* Enable SPI NOR */ +autoenable_device_by_path ("/ocp/spi@48030000/m25p80@0" ); + +autoenable_i2c_by_path ("/ocp/i2c@44e0b000/temp@4b" ); +autoenable_i2c_by_path ("/ocp/i2c@44e0b000/eeprom@52" ); +autoenable_i2c_by_path ("/ocp/i2c@44e0b000/rtc@68" ); +if (IS_ENABLED (CONFIG_SHELL_NONE ))return am33xx_of_register_bootdevice ();
Signature · 7 lines
2.7.4 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
Quoted 21 lines · Daniel Schultz
This patch adds an API to automatically enable either hardware components with existing device drivers or i2c clients. All functions take a device tree path to find the hardware and will fix up the node status in the kernel device tree, if it's accessible.
Signed-off-by Daniel Schultz <[email protected]>--- common/Kconfig | 9 +++++ common/Makefile | 1 + common/autoenable.c | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++ include/autoenable.h | 21 ++++++++++ 4 files changed, 140 insertions(+) create mode 100644 common/autoenable.c create mode 100644 include/autoenable.hcommon/Kconfig +0
-0@@ -712,6 +712,15 @@ config CONSOLE_NONE
common/Kconfig config CONSOLE_NONE · line 722
Quoted 10 lines
common/Kconfig +8
-0endchoice +config KERNEL_AUTOENABLE + bool + prompt "Autoenable of components" + help + Say Y to unlock an API for automatically enable either hardware + components with existing device drivers or i2c clients. All functions + take a device tree path to find the hardware and will fix up the node + status in the kernel device tree, if it's accessible.
I don't think we need an extra option for this. Just compile it unconditionally. The code will be dropped if unused anyway, and if it's used we probably do not want to fall back to the no-op inline wrappers.
common/autoenable.c
Quoted 17 lines
common/Kconfig +1
-0+ choice prompt "Console activation strategy" depends on CONSOLE_FULLcommon/Makefile +1
-0@@ -31,6 +31,7 @@ obj-$(CONFIG_FLEXIBLE_BOOTARGS) += bootargs.o obj-$(CONFIG_GLOBALVAR) += globalvar.o obj-$(CONFIG_GREGORIAN_CALENDER) += date.o obj-$(CONFIG_KALLSYMS) += kallsyms.o +obj-$(CONFIG_KERNEL_AUTOENABLE) += autoenable.o obj-$(CONFIG_MALLOC_DLMALLOC) += dlmalloc.o obj-$(CONFIG_MALLOC_TLSF) += tlsf_malloc.o tlsf.o obj-$(CONFIG_MALLOC_DUMMY) += dummy_malloc.ocommon/autoenable.c +0
-0
common/oftree.c would be a good place for the code.
Quoted 25 lines
new file mode 100644
index 0000000..be76942common/autoenable.c new file +20
-0@@ -0,0 +1,109 @@ +/* +* Copyright (C) 2017 PHYTEC Messtechnik GmbH, +* Author: Daniel Schultz <[email protected]> +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* version 2 as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +*/ + +#include <linux/err.h> +#include <of.h> +#include <stdio.h> +#include <stdlib.h> +#include <i2c/i2c.h> +
common/autoenable.c line 30
Quoted 10 lines
common/autoenable.c new file +10
-0+/** +* autoenable_device_by_path() - Autoenable a device by a device tree path +* @param path Device tree path up from the root to the device +* @return 0 on success, -enodev on failure. If no device found in the device +* tree. +* +* This function will search for a device and will enable it in the kernel +* device tree, if it exists and is loaded. +*/ +int autoenable_device_by_path (char *path)
This function and the other one should get a of_ prefix.
Quoted 11 lines
common/autoenable.c new file +11
-0+{ +struct device_d *device; +struct device_node *node; +int ret; + + node =of_find_node_by_name (NULL , path); +if (!node) + node =of_find_node_by_path (path); + +if (!node) +return -ENODEV ;
common/autoenable.c line 51
Quoted 10 lines
common/autoenable.c new file +10
-0+ + device =of_find_device_by_node (node); +if (!device) +return -ENODEV ; + + ret =of_register_set_status_fixup (path,1 ); +if (!ret) +printf ("autoenabled %s\n" , device->name); +return ret; +}
I'm not sure this function actually does what you want to archieve. From the usage of the function in patch 3/3 it seems you want to enable for example the NAND controller in the kernel device tree if you find a board with NAND chip equipped, right? To do this you want to have a function which enables a device in the kernel device tree if it's enabled in the barebox device tree, but I don't think you want to depend on the driver actually being enabled in barebox. What if you find a board with NAND chip equipped but the driver is disabled in barebox to safe some space?
common/autoenable.c line 63
Quoted 12 lines
common/autoenable.c new file +12
-0+ +/** +* autoenable_i2c_by_path - Autoenable a i2c client by a device tree path +* @param path Device tree path up from the root to the i2c client +* @return 0 on success, -enodev on failure. If no i2c client found in the i2c +* device tree. +* +* This function will search for a i2c client, tries to write to the client and +* will enable it in the kernel device tree, if it exists and is accessible. +*/ +int autoenable_i2c_by_path (char *path) +{
I don't like that this function has the same name pattern as the function above, but does something different. The above function does something when it encounters a device which has a driver, but this function actually checks for physical presence of a device.
Quoted 10 lines
common/autoenable.c new file +10
-0+struct device_node *node; +struct i2c_adapter *i2c_adapter; +struct i2c_msg msg; +char data[1 ] = {0x0 }; +int addr; +const __be32 *ip; +int ret; + + node =of_find_node_by_name (NULL , path); +if (!node)
common/autoenable.c line 83
Quoted 10 lines
common/autoenable.c new file +10
-0+ node =of_find_node_by_path (path); +if (!node) +return -ENODEV ; +if (!node->parent) +return -ENODEV ; + + ip =of_get_property (node,"reg" ,NULL ); +if (!ip) +return -ENODEV ; + addr =be32_to_cpup (ip);
We have of_property_read_u32() for this.
Sascha
Signature · 9 lines
Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox