Ignore:
File:
1 edited

Legend:

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

    rc4e30607 r956d4281  
    5757#include <ops/char_dev.h>
    5858
    59 #include <irc.h>
     59#include <ns.h>
     60#include <ipc/services.h>
     61#include <ipc/irc.h>
    6062#include <device/hw_res.h>
    6163#include <ipc/serial_ctl.h>
     
    163165        int irq;
    164166        /** The base i/o address of the devices registers. */
    165         uintptr_t io_addr;
     167        uint32_t io_addr;
    166168        /** The i/o port used to access the serial ports registers. */
    167169        ioport8_t *port;
     
    330332       
    331333        /* Gain control over port's registers. */
    332         if (pio_enable((void *) ns->io_addr, REG_COUNT,
     334        if (pio_enable((void *)(uintptr_t) ns->io_addr, REG_COUNT,
    333335            (void **) &ns->port)) {
    334                 ddf_msg(LVL_ERROR, "Cannot map the port %#" PRIxn
     336                ddf_msg(LVL_ERROR, "Cannot map the port %#" PRIx32
    335337                    " for device %s.", ns->io_addr, ddf_dev_get_name(ns->dev));
    336338                return false;
     
    391393       
    392394        /* Connect to the parent's driver. */
    393         parent_sess = ddf_dev_parent_sess_create(ns->dev);
     395        parent_sess = ddf_dev_parent_sess_create(ns->dev, EXCHANGE_SERIALIZE);
    394396        if (parent_sess == NULL) {
    395397                ddf_msg(LVL_ERROR, "Failed to connect to parent driver of "
     
    432434                        ioport = true;
    433435                        ddf_msg(LVL_NOTE, "Device %s was assigned I/O address = "
    434                             "0x%#" PRIxn ".", ddf_dev_get_name(ns->dev), ns->io_addr);
     436                            "0x%x.", ddf_dev_get_name(ns->dev), ns->io_addr);
    435437                        break;
    436438                       
     
    486488static int ns8250_interrupt_enable(ns8250_t *ns)
    487489{
    488         /* Enable interrupt using IRC service. */
    489         int rc = irc_enable_interrupt(ns->irq);
    490         if (rc != EOK)
     490        /*
     491         * Enable interrupt using IRC service.
     492         * TODO: This is a temporary solution until the device framework
     493         * takes care of this itself.
     494         */
     495        async_sess_t *irc_sess = service_connect_blocking(EXCHANGE_SERIALIZE,
     496            SERVICE_IRC, 0, 0);
     497        if (!irc_sess) {
    491498                return EIO;
    492        
     499        }
     500
     501        async_exch_t *exch = async_exchange_begin(irc_sess);
     502        if (!exch) {
     503                return EIO;
     504        }
     505        async_msg_1(exch, IRC_ENABLE_INTERRUPT, ns->irq);
     506        async_exchange_end(exch);
     507
    493508        /* Read LSR to clear possible previous LSR interrupt */
    494509        pio_read_8(&ns->regs->lsr);
    495        
     510
    496511        /* Enable interrupt on the serial port. */
    497512        ns8250_port_interrupts_enable(ns->regs);
     
    764779 * data and reading the line status register.
    765780 *
    766  * @param dev The serial port device.
    767  *
    768  */
    769 static inline void ns8250_interrupt_handler(ipc_callid_t iid, ipc_call_t *icall,
    770     ddf_dev_t *dev)
     781 * @param dev           The serial port device.
     782 */
     783static inline void ns8250_interrupt_handler(ddf_dev_t *dev, ipc_callid_t iid,
     784    ipc_call_t *icall)
    771785{
    772786        ns8250_t *ns = dev_ns8250(dev);
     787
    773788        uint8_t iir = pio_read_8(&ns->regs->iid);
    774789        if ((iir & NS8250_IID_CAUSE_MASK) == NS8250_IID_CAUSE_RXSTATUS) {
     
    780795       
    781796        ns8250_read_from_device(ns);
    782         irc_disable_interrupt(ns->irq);
    783797}
    784798
     
    857871        }
    858872        need_unreg_intr_handler = true;
    859 
     873       
    860874        /* Enable interrupt. */
    861875        rc = ns8250_interrupt_enable(ns);
Note: See TracChangeset for help on using the changeset viewer.