Changeset be1b1e68 in mainline for uspace/drv/intctl/obio/obio.c
- Timestamp:
- 2017-10-24T10:10:00Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 48adf0f
- Parents:
- cc92076
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/intctl/obio/obio.c
rcc92076 rbe1b1e68 42 42 */ 43 43 44 #include <align.h> 45 #include <as.h> 46 #include <async.h> 47 #include <ddf/driver.h> 48 #include <ddf/log.h> 49 #include <ddi.h> 50 #include <errno.h> 51 #include <inttypes.h> 44 52 #include <ipc/irc.h> 45 #include <loc.h>46 #include <as.h>47 #include <ddi.h>48 #include <align.h>49 #include <inttypes.h>50 53 #include <stdbool.h> 51 #include <errno.h>52 #include <async.h>53 #include <align.h>54 #include <async.h>55 54 #include <stdio.h> 55 56 #include "obio.h" 56 57 57 58 #define NAME "obio" … … 88 89 while (1) { 89 90 int inr; 90 91 91 92 callid = async_get_call(&call); 92 93 switch (IPC_GET_IMETHOD(call)) { … … 112 113 } 113 114 114 /** Initialize the OBIO driver. 115 * 116 * In the future, the OBIO driver should be integrated with the sun4u platform driver. 117 */ 118 static bool obio_init(void) 115 /** Add OBIO device. */ 116 int obio_add(obio_t *obio, obio_res_t *res) 119 117 { 120 category_id_t irc_cat; 121 service_id_t svc_id; 118 ddf_fun_t *fun_a = NULL; 122 119 int rc; 123 120 124 121 base_phys = (uintptr_t) 0x1fe00000000ULL; 125 122 126 123 int flags = AS_AREA_READ | AS_AREA_WRITE; 127 124 int retval = physmem_map(base_phys, 128 125 ALIGN_UP(OBIO_SIZE, PAGE_SIZE) >> PAGE_WIDTH, flags, 129 126 (void *) &base_virt); 130 127 131 128 if (retval < 0) { 132 printf("%s: Error mapping OBIO registers\n", NAME); 133 return false; 129 ddf_msg(LVL_ERROR, "Error mapping OBIO registers"); 130 rc = EIO; 131 goto error; 134 132 } 135 136 printf("%s: OBIO registers with base at 0x%" PRIun "\n", NAME, base_phys); 137 138 async_set_fallback_port_handler(obio_connection, NULL); 139 140 rc = loc_server_register(NAME); 133 134 ddf_msg(LVL_NOTE, "OBIO registers with base at 0x%" PRIun, base_phys); 135 136 fun_a = ddf_fun_create(obio->dev, fun_exposed, "a"); 137 if (fun_a == NULL) { 138 ddf_msg(LVL_ERROR, "Failed creating function 'a'."); 139 rc = ENOMEM; 140 goto error; 141 } 142 143 ddf_fun_set_conn_handler(fun_a, obio_connection); 144 145 rc = ddf_fun_bind(fun_a); 141 146 if (rc != EOK) { 142 printf("%s: Failed registering server. (%d)\n", NAME, rc);143 return false;147 ddf_msg(LVL_ERROR, "Failed binding function 'a'. (%d)", rc); 148 goto error; 144 149 } 145 146 rc = loc_service_register("irc/" NAME, &svc_id); 147 if (rc != EOK) { 148 printf("%s: Failed registering service. (%d)\n", NAME, rc); 149 return false; 150 } 151 152 rc = loc_category_get_id("irc", &irc_cat, IPC_FLAG_BLOCKING); 153 if (rc != EOK) { 154 printf("%s: Failed resolving category 'iplink' (%d).\n", NAME, 155 rc); 156 return false; 157 } 158 159 rc = loc_service_add_to_cat(svc_id, irc_cat); 160 if (rc != EOK) { 161 printf("%s: Failed adding service to category (%d).\n", NAME, 162 rc); 163 return false; 164 } 165 166 return true; 150 151 rc = ddf_fun_add_to_category(fun_a, "irc"); 152 if (rc != EOK) 153 goto error; 154 155 return EOK; 156 error: 157 if (fun_a != NULL) 158 ddf_fun_destroy(fun_a); 159 return rc; 167 160 } 168 161 169 int main(int argc, char **argv) 162 /** Remove OBIO device */ 163 int obio_remove(obio_t *obio) 170 164 { 171 printf("%s: HelenOS OBIO driver\n", NAME); 172 173 if (!obio_init()) 174 return -1; 175 176 printf("%s: Accepting connections\n", NAME); 177 task_retval(0); 178 async_manager(); 179 180 /* Never reached */ 181 return 0; 165 return ENOTSUP; 182 166 } 167 168 /** OBIO device gone */ 169 int obio_gone(obio_t *obio) 170 { 171 return ENOTSUP; 172 } 173 183 174 184 175 /**
Note:
See TracChangeset
for help on using the changeset viewer.