Changes in uspace/drv/char/ns8250/ns8250.c [c4e30607:956d4281] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/char/ns8250/ns8250.c
rc4e30607 r956d4281 57 57 #include <ops/char_dev.h> 58 58 59 #include <irc.h> 59 #include <ns.h> 60 #include <ipc/services.h> 61 #include <ipc/irc.h> 60 62 #include <device/hw_res.h> 61 63 #include <ipc/serial_ctl.h> … … 163 165 int irq; 164 166 /** The base i/o address of the devices registers. */ 165 uint ptr_t io_addr;167 uint32_t io_addr; 166 168 /** The i/o port used to access the serial ports registers. */ 167 169 ioport8_t *port; … … 330 332 331 333 /* 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, 333 335 (void **) &ns->port)) { 334 ddf_msg(LVL_ERROR, "Cannot map the port %#" PRIx n336 ddf_msg(LVL_ERROR, "Cannot map the port %#" PRIx32 335 337 " for device %s.", ns->io_addr, ddf_dev_get_name(ns->dev)); 336 338 return false; … … 391 393 392 394 /* 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); 394 396 if (parent_sess == NULL) { 395 397 ddf_msg(LVL_ERROR, "Failed to connect to parent driver of " … … 432 434 ioport = true; 433 435 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); 435 437 break; 436 438 … … 486 488 static int ns8250_interrupt_enable(ns8250_t *ns) 487 489 { 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) { 491 498 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 493 508 /* Read LSR to clear possible previous LSR interrupt */ 494 509 pio_read_8(&ns->regs->lsr); 495 510 496 511 /* Enable interrupt on the serial port. */ 497 512 ns8250_port_interrupts_enable(ns->regs); … … 764 779 * data and reading the line status register. 765 780 * 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 */ 783 static inline void ns8250_interrupt_handler(ddf_dev_t *dev, ipc_callid_t iid, 784 ipc_call_t *icall) 771 785 { 772 786 ns8250_t *ns = dev_ns8250(dev); 787 773 788 uint8_t iir = pio_read_8(&ns->regs->iid); 774 789 if ((iir & NS8250_IID_CAUSE_MASK) == NS8250_IID_CAUSE_RXSTATUS) { … … 780 795 781 796 ns8250_read_from_device(ns); 782 irc_disable_interrupt(ns->irq);783 797 } 784 798 … … 857 871 } 858 872 need_unreg_intr_handler = true; 859 873 860 874 /* Enable interrupt. */ 861 875 rc = ns8250_interrupt_enable(ns);
Note:
See TracChangeset
for help on using the changeset viewer.