@@ -435,6 +435,7 @@ serial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
435
435
{
436
436
struct uart_8250_port uart , * port ;
437
437
int ret , line , flags = dev_id -> driver_data ;
438
+ unsigned char iotype ;
438
439
439
440
if (flags & UNKNOWN_DEV ) {
440
441
ret = serial_pnp_guess_board (dev );
@@ -443,37 +444,46 @@ serial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
443
444
}
444
445
445
446
memset (& uart , 0 , sizeof (uart ));
446
- if (pnp_irq_valid (dev , 0 ))
447
- uart .port .irq = pnp_irq (dev , 0 );
448
447
if ((flags & CIR_PORT ) && pnp_port_valid (dev , 2 )) {
449
448
uart .port .iobase = pnp_port_start (dev , 2 );
450
- uart . port . iotype = UPIO_PORT ;
449
+ iotype = UPIO_PORT ;
451
450
} else if (pnp_port_valid (dev , 0 )) {
452
451
uart .port .iobase = pnp_port_start (dev , 0 );
453
- uart . port . iotype = UPIO_PORT ;
452
+ iotype = UPIO_PORT ;
454
453
} else if (pnp_mem_valid (dev , 0 )) {
455
454
uart .port .mapbase = pnp_mem_start (dev , 0 );
456
- uart .port .iotype = UPIO_MEM ;
455
+ uart .port .mapsize = pnp_mem_len (dev , 0 );
456
+ iotype = UPIO_MEM ;
457
457
uart .port .flags = UPF_IOREMAP ;
458
458
} else
459
459
return - ENODEV ;
460
460
461
- dev_dbg (& dev -> dev ,
462
- "Setup PNP port: port %#lx, mem %#llx, irq %u, type %u\n" ,
463
- uart .port .iobase , (unsigned long long )uart .port .mapbase ,
464
- uart .port .irq , uart .port .iotype );
461
+ uart .port .uartclk = 1843200 ;
462
+ uart .port .dev = & dev -> dev ;
463
+ uart .port .flags |= UPF_SKIP_TEST | UPF_BOOT_AUTOCONF ;
464
+
465
+ ret = uart_read_port_properties (& uart .port );
466
+ /* no interrupt -> fall back to polling */
467
+ if (ret == - ENXIO )
468
+ ret = 0 ;
469
+ if (ret )
470
+ return ret ;
471
+
472
+ /*
473
+ * The previous call may not set iotype correctly when reg-io-width
474
+ * property is absent and it doesn't support IO port resource.
475
+ */
476
+ uart .port .iotype = iotype ;
465
477
466
478
if (flags & CIR_PORT ) {
467
479
uart .port .flags |= UPF_FIXED_PORT | UPF_FIXED_TYPE ;
468
480
uart .port .type = PORT_8250_CIR ;
469
481
}
470
482
471
- uart .port .flags |= UPF_SKIP_TEST | UPF_BOOT_AUTOCONF ;
472
- if (pnp_irq_flags (dev , 0 ) & IORESOURCE_IRQ_SHAREABLE )
473
- uart .port .flags |= UPF_SHARE_IRQ ;
474
- uart .port .uartclk = 1843200 ;
475
- device_property_read_u32 (& dev -> dev , "clock-frequency" , & uart .port .uartclk );
476
- uart .port .dev = & dev -> dev ;
483
+ dev_dbg (& dev -> dev ,
484
+ "Setup PNP port: port %#lx, mem %#llx, size %#llx, irq %u, type %u\n" ,
485
+ uart .port .iobase , (unsigned long long )uart .port .mapbase ,
486
+ (unsigned long long )uart .port .mapsize , uart .port .irq , uart .port .iotype );
477
487
478
488
line = serial8250_register_8250_port (& uart );
479
489
if (line < 0 || (flags & CIR_PORT ))
0 commit comments