static int cpm_uart_drv_probe(struct device *dev) { struct platform_device *pdev = to_platform_device(dev); struct fs_uart_platform_info *pdata; int ret = -ENODEV; if(!pdev) { printk(KERN_ERR"CPM UART: platform data missing!\n"); return ret; } pdata = pdev->dev.platform_data; #ifdef CONFIG_KGDB_CPM_UART /* We are not interested in ports yet utilized by kgdb */ if(cpm_uart_id2nr(fs_uart_get_id(pdata)) == KGDB_PINFO_INDEX) return ret; #endif if ((ret = cpm_uart_drv_get_platform_data(pdev, 0))) return ret; pr_debug("cpm_uart_drv_probe: Adding CPM UART %d\n", cpm_uart_id2nr(pdata->fs_no)); if (pdata->init_ioports) pdata->init_ioports(pdata); ret = uart_add_one_port(&cpm_reg, &cpm_uart_ports[pdata->fs_no].port); return ret; }
int cpm_uart_drv_get_platform_data(struct platform_device *pdev, int is_con) { struct resource *r; struct fs_uart_platform_info *pdata = pdev->dev.platform_data; int idx; /* It is UART_SMCx or UART_SCCx index */ struct uart_cpm_port *pinfo; int line; u32 mem, pram; idx = pdata->fs_no = fs_uart_get_id(pdata); line = cpm_uart_id2nr(idx); if(line < 0) { printk(KERN_ERR"%s(): port %d is not registered", __FUNCTION__, idx); return -EINVAL; } pinfo = (struct uart_cpm_port *) &cpm_uart_ports[idx]; pinfo->brg = pdata->brg; if (!is_con) { pinfo->port.line = line; pinfo->port.flags = UPF_BOOT_AUTOCONF; } if (!(r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs"))) return -EINVAL; mem = (u32)ioremap(r->start, r->end - r->start + 1); if (!(r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pram"))) return -EINVAL; pram = (u32)ioremap(r->start, r->end - r->start + 1); if(idx > fsid_smc2_uart) { pinfo->sccp = (scc_t *)mem; pinfo->sccup = (scc_uart_t *)pram; } else { pinfo->smcp = (smc_t *)mem; pinfo->smcup = (smc_uart_t *)pram; } pinfo->tx_nrfifos = pdata->tx_num_fifo; pinfo->tx_fifosize = pdata->tx_buf_size; pinfo->rx_nrfifos = pdata->rx_num_fifo; pinfo->rx_fifosize = pdata->rx_buf_size; pinfo->port.uartclk = pdata->uart_clk; pinfo->port.mapbase = (unsigned long)mem; pinfo->port.irq = platform_get_irq(pdev, 0); return 0; }