New callback will give a necessary information to fill up ACPI SPCR table,
for example. Maybe used later for other purposes.

Signed-off-by: Andy Shevchenko <andriy.shevche...@linux.intel.com>
---
 drivers/serial/serial-uclass.c | 21 +++++++++++++++++++++
 include/common.h               |  3 +++
 include/serial.h               | 17 +++++++++++++++++
 3 files changed, 41 insertions(+)

diff --git a/drivers/serial/serial-uclass.c b/drivers/serial/serial-uclass.c
index 665cca85cb..274734d059 100644
--- a/drivers/serial/serial-uclass.c
+++ b/drivers/serial/serial-uclass.c
@@ -308,6 +308,25 @@ int serial_setconfig(uint config)
        return 0;
 }
 
+int serial_getinfo(struct serial_device_info *info)
+{
+       struct dm_serial_ops *ops;
+
+       if (!gd->cur_serial_dev)
+               return -ENODEV;
+
+       if (!info)
+               return -EINVAL;
+
+       info->baudrate = gd->baudrate;
+
+       ops = serial_get_ops(gd->cur_serial_dev);
+       if (ops->getinfo)
+               return ops->getinfo(gd->cur_serial_dev, info);
+
+       return -EINVAL;
+}
+
 void serial_stdio_init(void)
 {
 }
@@ -425,6 +444,8 @@ static int serial_post_probe(struct udevice *dev)
        if (ops->loop)
                ops->loop += gd->reloc_off;
 #endif
+       if (ops->getinfo)
+               ops->getinfo += gd->reloc_off;
 #endif
        /* Set the baud rate */
        if (ops->setbrg) {
diff --git a/include/common.h b/include/common.h
index 8b9f859c07..1f9c98e735 100644
--- a/include/common.h
+++ b/include/common.h
@@ -349,6 +349,8 @@ void smp_set_core_boot_addr(unsigned long addr, int corenr);
 void smp_kick_all_cpus(void);
 
 /* $(CPU)/serial.c */
+struct serial_device_info;
+
 int    serial_init   (void);
 void   serial_setbrg (void);
 void   serial_putc   (const char);
@@ -357,6 +359,7 @@ void        serial_puts   (const char *);
 int    serial_getc   (void);
 int    serial_tstc   (void);
 int    serial_setconfig(uint config);
+int    serial_getinfo(struct serial_device_info *info);
 
 /* $(CPU)/speed.c */
 int    get_clocks (void);
diff --git a/include/serial.h b/include/serial.h
index 020cd392e8..33531b7791 100644
--- a/include/serial.h
+++ b/include/serial.h
@@ -111,6 +111,16 @@ enum serial_stop {
                                SERIAL_8_BITS << SERIAL_BITS_SHIFT | \
                                SERIAL_ONE_STOP << SERIAL_STOP_SHIFT
 
+/* REVISIT: ACPI GAS specification implied */
+struct serial_device_info {
+       unsigned int baudrate;
+       u8      addr_space;     /* 0 - MMIO, 1 - IO */
+       u8      reg_width;
+       u8      reg_offset;
+       u8      reg_shift;
+       u64     addr;
+};
+
 /**
  * struct struct dm_serial_ops - Driver model serial operations
  *
@@ -201,6 +211,13 @@ struct dm_serial_ops {
         * @return 0 if OK, -ve on error
         */
        int (*setconfig)(struct udevice *dev, uint serial_config);
+       /**
+        * getinfo() - Get serial device information
+        *
+        * @dev: Device pointer
+        * @info: struct serial_device_info to fill
+        */
+       int (*getinfo)(struct udevice *dev, struct serial_device_info *info);
 };
 
 /**
-- 
2.19.1

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to