static const int uart3_irqs[] = {UART3_IRQ, -1}; static const int uart4_irqs[] = {UART4_IRQ, -1}; static const int uart5_irqs[] = {UART5_IRQ, -1}; #define UART_DEFN(devid) { \ .id = IMX6_UART##devid, \ .paddr = UART##devid##_PADDR, \ .size = BIT(12), \ .irqs = uart##devid##_irqs, \ .init_fn = &uart_init \ } static const struct dev_defn dev_defn[] = { UART_DEFN(1), UART_DEFN(2), UART_DEFN(3), UART_DEFN(4), UART_DEFN(5) }; struct ps_chardevice* ps_cdev_init(enum chardev_id id, const ps_io_ops_t* o, struct ps_chardevice* d) { unsigned int i; for (i = 0; i < ARRAY_SIZE(dev_defn); i++) { if (dev_defn[i].id == id) { return (dev_defn[i].init_fn(dev_defn + i, o, d)) ? NULL : d; } } return NULL;
static const int uart2_irqs[] = {UART2_IRQ, -1}; static const int uart3_irqs[] = {UART3_IRQ, -1}; struct ps_chardevice* uart_init(const struct dev_defn* defn, const ps_io_ops_t* ops, struct ps_chardevice* dev); #define UART_DEFN(devid) { \ .id = EXYNOS5_UART##devid, \ .paddr = UART##devid##_PADDR, \ .size = (1<<12), \ .irqs = uart##devid##_irqs, \ .init_fn = &uart_init \ } static const struct dev_defn dev_defn[] = { UART_DEFN(0), UART_DEFN(1), UART_DEFN(2), UART_DEFN(3), }; /* It would be nice to reuse this, but it requires knowledge of the variable * * sized 'dev_defn' */ struct ps_chardevice* ps_cdev_init(enum chardev_id id, const ps_io_ops_t* o, struct ps_chardevice* d) { unsigned int i; for (i = 0; i < ARRAY_SIZE(dev_defn); i++) { if (dev_defn[i].id == id) { return dev_defn[i].init_fn(dev_defn + i, o, d); }