Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 56fd7cf in mainline for uspace/drv/char/ns8250/ns8250.c


Ignore:
Timestamp:
2012-08-17T11:37:03Z (9 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master
Children:
1d5a540
Parents:
be2a38ad
Message:

Make ddf_dev_t and ddf_fun_t opaque. This further tighthens the DDF interface.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/char/ns8250/ns8250.c

    rbe2a38ad r56fd7cf  
    5858#include <ops/char_dev.h>
    5959
    60 #include <devman.h>
    6160#include <ns.h>
    62 #include <ipc/devman.h>
    6361#include <ipc/services.h>
    6462#include <ipc/irc.h>
     
    127125#define NS8250_MSR_SIGNALS      (NS8250_MSR_CTS | NS8250_MSR_DSR \
    128126    | NS8250_MSR_RI | NS8250_MSR_DCD)
    129 
    130 /** Obtain soft-state structure from function node */
    131 #define NS8250(fnode) ((ns8250_t *) ((fnode)->dev->driver_data))
    132 
    133 /** Obtain soft-state structure from device node */
    134 #define NS8250_FROM_DEV(dnode) ((ns8250_t *) ((dnode)->driver_data))
    135127
    136128/** The number of bits of one data unit send by the serial port. */
     
    187179} ns8250_t;
    188180
     181/** Obtain soft-state structure from device node */
     182static ns8250_t *dev_ns8250(ddf_dev_t *dev)
     183{
     184        return ddf_dev_data_get(dev);
     185}
     186
     187/** Obtain soft-state structure from function node */
     188static ns8250_t *fun_ns8250(ddf_fun_t *fun)
     189{
     190        return dev_ns8250(ddf_fun_get_dev(fun));
     191}
     192
    189193/** Find out if there is some incomming data available on the serial port.
    190194 *
     
    241245static int ns8250_read(ddf_fun_t *fun, char *buf, size_t count)
    242246{
    243         ns8250_t *ns = NS8250(fun);
     247        ns8250_t *ns = fun_ns8250(fun);
    244248        int ret = 0;
    245249       
     
    279283static int ns8250_write(ddf_fun_t *fun, char *buf, size_t count)
    280284{
    281         ns8250_t *ns = NS8250(fun);
     285        ns8250_t *ns = fun_ns8250(fun);
    282286        size_t idx;
    283287       
     
    317321static void ns8250_dev_cleanup(ns8250_t *ns)
    318322{
    319         if (ns->dev->parent_sess) {
    320                 async_hangup(ns->dev->parent_sess);
    321                 ns->dev->parent_sess = NULL;
    322         }
    323323}
    324324
     
    330330static bool ns8250_pio_enable(ns8250_t *ns)
    331331{
    332         ddf_msg(LVL_DEBUG, "ns8250_pio_enable %s", ns->dev->name);
     332        ddf_msg(LVL_DEBUG, "ns8250_pio_enable %s", ddf_dev_get_name(ns->dev));
    333333       
    334334        /* Gain control over port's registers. */
     
    336336            (void **) &ns->port)) {
    337337                ddf_msg(LVL_ERROR, "Cannot map the port %#" PRIx32
    338                     " for device %s.", ns->io_addr, ns->dev->name);
     338                    " for device %s.", ns->io_addr, ddf_dev_get_name(ns->dev));
    339339                return false;
    340340        }
     
    352352static bool ns8250_dev_probe(ns8250_t *ns)
    353353{
    354         ddf_msg(LVL_DEBUG, "ns8250_dev_probe %s", ns->dev->name);
     354        ddf_msg(LVL_DEBUG, "ns8250_dev_probe %s", ddf_dev_get_name(ns->dev));
    355355       
    356356        bool res = true;
     
    372372        if (!res) {
    373373                ddf_msg(LVL_DEBUG, "Device %s is not present.",
    374                     ns->dev->name);
     374                    ddf_dev_get_name(ns->dev));
    375375        }
    376376       
     
    385385static int ns8250_dev_initialize(ns8250_t *ns)
    386386{
    387         ddf_msg(LVL_DEBUG, "ns8250_dev_initialize %s", ns->dev->name);
    388        
     387        async_sess_t *parent_sess;
    389388        int ret = EOK;
     389       
     390        ddf_msg(LVL_DEBUG, "ns8250_dev_initialize %s", ddf_dev_get_name(ns->dev));
    390391       
    391392        hw_resource_list_t hw_resources;
     
    393394       
    394395        /* Connect to the parent's driver. */
    395         ns->dev->parent_sess = devman_parent_device_connect(EXCHANGE_SERIALIZE,
    396             ns->dev->handle, IPC_FLAG_BLOCKING);
    397         if (!ns->dev->parent_sess) {
     396        parent_sess = ddf_dev_parent_sess_create(ns->dev, EXCHANGE_SERIALIZE);
     397        if (parent_sess == NULL) {
    398398                ddf_msg(LVL_ERROR, "Failed to connect to parent driver of "
    399                     "device %s.", ns->dev->name);
     399                    "device %s.", ddf_dev_get_name(ns->dev));
    400400                ret = ENOENT;
    401401                goto failed;
     
    403403       
    404404        /* Get hw resources. */
    405         ret = hw_res_get_resource_list(ns->dev->parent_sess, &hw_resources);
     405        ret = hw_res_get_resource_list(parent_sess, &hw_resources);
    406406        if (ret != EOK) {
    407407                ddf_msg(LVL_ERROR, "Failed to get HW resources for device "
    408                     "%s.", ns->dev->name);
     408                    "%s.", ddf_dev_get_name(ns->dev));
    409409                goto failed;
    410410        }
     
    422422                        irq = true;
    423423                        ddf_msg(LVL_NOTE, "Device %s was asigned irq = 0x%x.",
    424                             ns->dev->name, ns->irq);
     424                            ddf_dev_get_name(ns->dev), ns->irq);
    425425                        break;
    426426                       
     
    429429                        if (res->res.io_range.size < REG_COUNT) {
    430430                                ddf_msg(LVL_ERROR, "I/O range assigned to "
    431                                     "device %s is too small.", ns->dev->name);
     431                                    "device %s is too small.", ddf_dev_get_name(ns->dev));
    432432                                ret = ELIMIT;
    433433                                goto failed;
     
    435435                        ioport = true;
    436436                        ddf_msg(LVL_NOTE, "Device %s was asigned I/O address = "
    437                             "0x%x.", ns->dev->name, ns->io_addr);
     437                            "0x%x.", ddf_dev_get_name(ns->dev), ns->io_addr);
    438438                        break;
    439439                       
     
    445445        if (!irq || !ioport) {
    446446                ddf_msg(LVL_ERROR, "Missing HW resource(s) for device %s.",
    447                     ns->dev->name);
     447                    ddf_dev_get_name(ns->dev));
    448448                ret = ENOENT;
    449449                goto failed;
     
    613613        *parity = ((val >> NS8250_LCR_PARITY) & 7);
    614614       
     615        /* Silence warnings */
     616        *word_length = 0;
     617
    615618        switch (val & 3) {
    616619        case WORD_LENGTH_5:
     
    755758                                if (!buf_push_back(&ns->input_buffer, val)) {
    756759                                        ddf_msg(LVL_WARN, "Buffer overflow on "
    757                                             "%s.", ns->dev->name);
     760                                            "%s.", ddf_dev_get_name(ns->dev));
    758761                                        break;
    759762                                } else {
    760763                                        ddf_msg(LVL_DEBUG2, "Character %c saved "
    761764                                            "to the buffer of %s.",
    762                                             val, ns->dev->name);
     765                                            val, ddf_dev_get_name(ns->dev));
    763766                                        if (buf_was_empty)
    764767                                                fibril_condvar_broadcast(&ns->input_buffer_available);
     
    782785    ipc_call_t *icall)
    783786{
    784         ns8250_t *ns = NS8250_FROM_DEV(dev);
     787        ns8250_t *ns = dev_ns8250(dev);
    785788
    786789        uint8_t iir = pio_read_8(&ns->regs->iid);
     
    788791                uint8_t lsr = pio_read_8(&ns->regs->lsr);
    789792                if (lsr & NS8250_LSR_OE) {
    790                         ddf_msg(LVL_WARN, "Overrun error on %s", ns->dev->name);
     793                        ddf_msg(LVL_WARN, "Overrun error on %s", ddf_dev_get_name(ns->dev));
    791794                }
    792795        }
     
    828831       
    829832        ddf_msg(LVL_DEBUG, "ns8250_dev_add %s (handle = %d)",
    830             dev->name, (int) dev->handle);
     833            ddf_dev_get_name(dev), (int) ddf_dev_get_handle(dev));
    831834       
    832835        /* Allocate soft-state for the device */
     
    883886       
    884887        /* Set device operations. */
    885         fun->ops = &ns8250_dev_ops;
     888        ddf_fun_set_ops(fun, &ns8250_dev_ops);
    886889        rc = ddf_fun_bind(fun);
    887890        if (rc != EOK) {
     
    895898       
    896899        ddf_msg(LVL_NOTE, "Device %s successfully initialized.",
    897             dev->name);
     900            ddf_dev_get_name(dev));
    898901       
    899902        return EOK;
     
    908911static int ns8250_dev_remove(ddf_dev_t *dev)
    909912{
    910         ns8250_t *ns = NS8250_FROM_DEV(dev);
     913        ns8250_t *ns = dev_ns8250(dev);
    911914        int rc;
    912915       
     
    942945static int ns8250_open(ddf_fun_t *fun)
    943946{
    944         ns8250_t *ns = NS8250(fun);
     947        ns8250_t *ns = fun_ns8250(fun);
    945948        int res;
    946949       
     
    968971static void ns8250_close(ddf_fun_t *fun)
    969972{
    970         ns8250_t *data = (ns8250_t *) fun->dev->driver_data;
     973        ns8250_t *data = fun_ns8250(fun);
    971974       
    972975        fibril_mutex_lock(&data->mutex);
     
    993996    unsigned int *word_length, unsigned int* stop_bits)
    994997{
    995         ns8250_t *data = (ns8250_t *) dev->driver_data;
     998        ns8250_t *data = dev_ns8250(dev);
    996999        ns8250_regs_t *regs = data->regs;
    9971000       
     
    10241027            stop_bits);
    10251028       
    1026         ns8250_t *data = (ns8250_t *) dev->driver_data;
     1029        ns8250_t *data = dev_ns8250(dev);
    10271030        ns8250_regs_t *regs = data->regs;
    10281031        int ret;
     
    10531056        switch (method) {
    10541057        case SERIAL_GET_COM_PROPS:
    1055                 ns8250_get_props(fun->dev, &baud_rate, &parity, &word_length,
     1058                ns8250_get_props(ddf_fun_get_dev(fun), &baud_rate, &parity, &word_length,
    10561059                    &stop_bits);
    10571060                async_answer_4(callid, EOK, baud_rate, parity, word_length,
     
    10641067                word_length = IPC_GET_ARG3(*call);
    10651068                stop_bits = IPC_GET_ARG4(*call);
    1066                 ret = ns8250_set_props(fun->dev, baud_rate, parity, word_length,
     1069                ret = ns8250_set_props(ddf_fun_get_dev(fun), baud_rate, parity, word_length,
    10671070                    stop_bits);
    10681071                async_answer_0(callid, ret);
Note: See TracChangeset for help on using the changeset viewer.