Changeset be1b1e68 in mainline for uspace/drv/intctl/obio/obio.c


Ignore:
Timestamp:
2017-10-24T10:10:00Z (6 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
48adf0f
Parents:
cc92076
Message:

Enumerate OBIO by DDF.

File:
1 moved

Legend:

Unmodified
Added
Removed
  • uspace/drv/intctl/obio/obio.c

    rcc92076 rbe1b1e68  
    4242 */
    4343
     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>
    4452#include <ipc/irc.h>
    45 #include <loc.h>
    46 #include <as.h>
    47 #include <ddi.h>
    48 #include <align.h>
    49 #include <inttypes.h>
    5053#include <stdbool.h>
    51 #include <errno.h>
    52 #include <async.h>
    53 #include <align.h>
    54 #include <async.h>
    5554#include <stdio.h>
     55
     56#include "obio.h"
    5657
    5758#define NAME "obio"
     
    8889        while (1) {
    8990                int inr;
    90        
     91
    9192                callid = async_get_call(&call);
    9293                switch (IPC_GET_IMETHOD(call)) {
     
    112113}
    113114
    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. */
     116int obio_add(obio_t *obio, obio_res_t *res)
    119117{
    120         category_id_t irc_cat;
    121         service_id_t svc_id;
     118        ddf_fun_t *fun_a = NULL;
    122119        int rc;
    123        
     120
    124121        base_phys = (uintptr_t) 0x1fe00000000ULL;
    125        
     122
    126123        int flags = AS_AREA_READ | AS_AREA_WRITE;
    127124        int retval = physmem_map(base_phys,
    128125            ALIGN_UP(OBIO_SIZE, PAGE_SIZE) >> PAGE_WIDTH, flags,
    129126            (void *) &base_virt);
    130        
     127
    131128        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;
    134132        }
    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);
    141146        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;
    144149        }
    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;
     156error:
     157        if (fun_a != NULL)
     158                ddf_fun_destroy(fun_a);
     159        return rc;
    167160}
    168161
    169 int main(int argc, char **argv)
     162/** Remove OBIO device */
     163int obio_remove(obio_t *obio)
    170164{
    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;
    182166}
     167
     168/** OBIO device gone */
     169int obio_gone(obio_t *obio)
     170{
     171        return ENOTSUP;
     172}
     173
    183174
    184175/**
Note: See TracChangeset for help on using the changeset viewer.