| 1 | /* | 
|---|
| 2 |  * sysfs.h - sysfs interface  | 
|---|
| 3 |  * | 
|---|
| 4 |  * Authors   Ghassan Almaless (2008,2009,2010,2011,2012) | 
|---|
| 5 |  *           Mohamed Lamine Karaoui (2015) | 
|---|
| 6 |  *           Alain Greiner (2016) | 
|---|
| 7 |  * | 
|---|
| 8 |  * Copyright (c) 2011,2012 UPMC Sorbonne Universites | 
|---|
| 9 |  * | 
|---|
| 10 |  * This file is part of ALMOS-MKH. | 
|---|
| 11 |  * | 
|---|
| 12 |  * ALMOS-MKH is free software; you can redistribute it and/or modify it | 
|---|
| 13 |  * under the terms of the GNU General Public License as published by | 
|---|
| 14 |  * the Free Software Foundation; version 2.0 of the License. | 
|---|
| 15 |  * | 
|---|
| 16 |  * ALMOS-MKH is distributed in the hope that it will be useful, but | 
|---|
| 17 |  * WITHOUT ANY WARRANTY; without even the implied warranty of | 
|---|
| 18 |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|---|
| 19 |  * General Public License for more details. | 
|---|
| 20 |  * | 
|---|
| 21 |  * You should have received a copy of the GNU General Public License | 
|---|
| 22 |  * along with ALMOS-MKH; if not, write to the Free Software Foundation, | 
|---|
| 23 |  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | 
|---|
| 24 |  */ | 
|---|
| 25 |  | 
|---|
| 26 | #ifndef _SYSFS_H_ | 
|---|
| 27 | #define _SYSFS_H_ | 
|---|
| 28 |  | 
|---|
| 29 | #include <hal_types.h> | 
|---|
| 30 | #include <metafs.h> | 
|---|
| 31 |  | 
|---|
| 32 |  | 
|---|
| 33 | struct sysfs_op_s; | 
|---|
| 34 | struct sysfs_entry_s; | 
|---|
| 35 | struct sysfs_request_s; | 
|---|
| 36 |  | 
|---|
| 37 |  | 
|---|
| 38 | /******************************************************************************************* | 
|---|
| 39 |  * This structure TODO | 
|---|
| 40 |  ******************************************************************************************/ | 
|---|
| 41 |  | 
|---|
| 42 | typedef struct sysfs_context_s | 
|---|
| 43 | { | 
|---|
| 44 |         void * empty; | 
|---|
| 45 | } | 
|---|
| 46 | sysfs_context_t; | 
|---|
| 47 |  | 
|---|
| 48 | /******************************************************************************************* | 
|---|
| 49 |  * Operations definition must be provided by underlying kernel subsystem. | 
|---|
| 50 |  ******************************************************************************************/ | 
|---|
| 51 |  | 
|---|
| 52 | typedef error_t (sysfs_request_func_t)( struct sysfs_entry_s   * entry,  | 
|---|
| 53 |                                         struct sysfs_request_s * rq,  | 
|---|
| 54 |                                         uint32_t               * offset ); | 
|---|
| 55 |  | 
|---|
| 56 | typedef struct sysfs_op_s | 
|---|
| 57 | { | 
|---|
| 58 |         sysfs_request_func_t *open; | 
|---|
| 59 |         sysfs_request_func_t *read; | 
|---|
| 60 |         sysfs_request_func_t *write; | 
|---|
| 61 |         sysfs_request_func_t *close; | 
|---|
| 62 | } | 
|---|
| 63 | sysfs_op_t; | 
|---|
| 64 |  | 
|---|
| 65 | /******************************************************************************************* | 
|---|
| 66 |  * This structure TODO   | 
|---|
| 67 |  ******************************************************************************************/ | 
|---|
| 68 |  | 
|---|
| 69 | typedef struct sysfs_request_s | 
|---|
| 70 | { | 
|---|
| 71 |         void     * data; | 
|---|
| 72 |         uint32_t   count; | 
|---|
| 73 |         uint8_t    buffer[CONFIG_SYSFS_BUFFER_SIZE]; | 
|---|
| 74 | } | 
|---|
| 75 | sysfs_request_t; | 
|---|
| 76 |  | 
|---|
| 77 | /******************************************************************************************* | 
|---|
| 78 |  * This structure TODO   | 
|---|
| 79 |  ******************************************************************************************/ | 
|---|
| 80 |  | 
|---|
| 81 | typedef struct sysfs_entry_s | 
|---|
| 82 | { | 
|---|
| 83 |         sysfs_op_t   op; | 
|---|
| 84 |         metafs_t     node; | 
|---|
| 85 | } | 
|---|
| 86 | sysfs_entry_t; | 
|---|
| 87 |  | 
|---|
| 88 | /******************************************************************************************* | 
|---|
| 89 |  *        Extern Variable : sysfs root node. | 
|---|
| 90 |  ******************************************************************************************/ | 
|---|
| 91 |  | 
|---|
| 92 | extern sysfs_entry_t       sysfs_root_entry; | 
|---|
| 93 |  | 
|---|
| 94 | /******************************************************************************************* | 
|---|
| 95 |  * This function initializes the sysfs root. | 
|---|
| 96 |  ******************************************************************************************/ | 
|---|
| 97 | static inline void sysfs_root_init() | 
|---|
| 98 | { | 
|---|
| 99 |     if( CONFIG_ROOTFS_IS_VFAT ) metafs_init( &sysfs_root_entry.node , "SYS" ); | 
|---|
| 100 |     else                        metafs_init( &sysfs_root_entry.node , "sys" ); | 
|---|
| 101 | } | 
|---|
| 102 |  | 
|---|
| 103 |  | 
|---|
| 104 | /******************************************************************************************* | 
|---|
| 105 |  * This function initializes a given sysfs entry. | 
|---|
| 106 |  ******************************************************************************************/ | 
|---|
| 107 | static inline void sysfs_entry_init( sysfs_entry_t * entry, | 
|---|
| 108 |                                      sysfs_op_t    * op, | 
|---|
| 109 |                                      char          * name ) | 
|---|
| 110 | { | 
|---|
| 111 |         metafs_init( &entry->node , name ); | 
|---|
| 112 |  | 
|---|
| 113 |         if(op == NULL) return; | 
|---|
| 114 |    | 
|---|
| 115 |         entry->op.open  = op->open; | 
|---|
| 116 |         entry->op.read  = op->read; | 
|---|
| 117 |         entry->op.write = op->write; | 
|---|
| 118 |         entry->op.close = op->close; | 
|---|
| 119 | } | 
|---|
| 120 |  | 
|---|
| 121 | /******************************************************************************************* | 
|---|
| 122 |  * This function registers a given sysfs entry into it's parent list. | 
|---|
| 123 |  ******************************************************************************************/ | 
|---|
| 124 | static inline void sysfs_entry_register( sysfs_entry_t * parent, | 
|---|
| 125 |                                          sysfs_entry_t * entry ) | 
|---|
| 126 | { | 
|---|
| 127 |         metafs_register( &parent->node , &entry->node ); | 
|---|
| 128 | } | 
|---|
| 129 |  | 
|---|
| 130 | /******************************************************************************************* | 
|---|
| 131 |  * This function removes a given sysfs entry from it's parent list. | 
|---|
| 132 |  ******************************************************************************************/ | 
|---|
| 133 | static inline void sysfs_entry_unregister( sysfs_entry_t * parent, | 
|---|
| 134 |                                            sysfs_entry_t * entry ) | 
|---|
| 135 | { | 
|---|
| 136 |         metafs_unregister( &parent->node , &entry->node ); | 
|---|
| 137 | } | 
|---|
| 138 |  | 
|---|
| 139 | #endif  /* _SYSFS_H_ */ | 
|---|