From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752002AbdHBH7N (ORCPT ); Wed, 2 Aug 2017 03:59:13 -0400 Received: from mail1.bemta6.messagelabs.com ([193.109.254.108]:5040 "EHLO mail1.bemta6.messagelabs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751061AbdHBH66 (ORCPT ); Wed, 2 Aug 2017 03:58:58 -0400 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrNIsWRWlGSWpSXmKPExsUS8J9toq5jW2O kwbK54hbNi9ezWVyfP5HJYsqGD0wWl3fNYbM4s7iX3YHVY//cNewe67dcZfHYfLra4/MmuQCW KNbMvKT8igTWjKnnlzAV7NSuONnymbGB8bhqFyMnh5BAA6PE8scWILaEgJ/Elp2T2bsYuYDi8 xgltnauZAFJsAloSZyfdYcJxBYRKJFY+3IJM4jNLGAh0f9kOlhcWEBP4tT8i4wgNouAisSM14 fZQGxeAUuJHR+XskAskJfoODAZyObg4BSwkrh8mg/iBkuJpSvOMkOUC0qcnPmEBSKuKLG88R8 zRKucROf3DnaQVgmBOIkvd0whTGuJiZsTIY6RkDj44gXzBEahWUgGzUKSWsDItIpRvTi1qCy1 SNdYL6koMz2jJDcxM0fX0MBMLze1uDgxPTUnMalYLzk/dxMjMOAZgGAHY8c/p0OMkhxMSqK8i j31kUJ8SfkplRmJxRnxRaU5qcWHGGU4OJQkeMVbGiOFBItS01Mr0jJzgLEHk5bg4FES4RUESf MWFyTmFmemQ6ROMepyvJrw/xuTEEtefl6qlDivJ0iRAEhRRmke3AhYGrjEKCslzMsIdJQQT0F qUW5mCar8K0ZxDkYlYd4+kCk8mXklcJteAR3BBHTEnzqwI0oSEVJSDYyxASYVfNq3eX97B2T8 aKh9kOjc33VK/YAOa3Zum3JQZ4pnyjwNYT+7w9rst/oP2xWkTu5kKfHTDdHpXPB+J1Nb+KS0j VrHn9tsFd+qvnatwYXtotuy63IjluVOsP7FcUNQ2l/5t9HvySpbqtJv7rzIcLVSkPVc4tP/16 c7cJ0Ut5l2l0coSImlOCPRUIu5qDgRAC4d3o/+AgAA X-Env-Sender: michael.moese@men.de X-Msg-Ref: server-2.tower-194.messagelabs.com!1501660736!10450750!1 X-Originating-IP: [80.255.6.145] X-StarScan-Received: X-StarScan-Version: 9.4.25; banners=-,-,- X-VirusChecked: Checked X-PGP-Universal: processed; by keys.men.de on Wed, 02 Aug 2017 09:58:57 +0200 From: Michael Moese To: , , , CC: , Subject: [PATCH v2 2/2] Introduce 8250_men_mcb Date: Wed, 2 Aug 2017 09:58:53 +0200 Message-ID: <20170802075853.18911-2-michael.moese@men.de> X-Mailer: git-send-email 2.12.3 In-Reply-To: <20170802075853.18911-1-michael.moese@men.de> References: <20170802075853.18911-1-michael.moese@men.de> MIME-Version: 1.0 X-Originating-IP: [192.1.2.30] X-ClientProxiedBy: MEN-EX01.intra.men.de (192.168.1.1) To MEN-EX01.intra.men.de (192.168.1.1) X-EXCLAIMER-MD-CONFIG: e4841e51-7998-49c0-ba41-8b8a0e2d8962 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch introduces the 8250_men_mcb driver for the MEN 16Z125 IP-Core. This is a 16550-type UART with a 60 byte FIFO. Due to strange old hardware, every board using this IP core requires different values for uartclk. A reasonable default is included in addition to the support of three boards. Additional values for other boards will be added later. This v2 has some whitespace fixes, I screwed this up yesterday. Signed-off-by: Michael Moese --- drivers/tty/serial/8250/8250_men_mcb.c | 118 +++++++++++++++++++++++++++++++++ drivers/tty/serial/8250/Kconfig | 11 +++ drivers/tty/serial/8250/Makefile | 1 + 3 files changed, 130 insertions(+) create mode 100644 drivers/tty/serial/8250/8250_men_mcb.c diff --git a/drivers/tty/serial/8250/8250_men_mcb.c b/drivers/tty/serial/8250/8250_men_mcb.c new file mode 100644 index 000000000000..308977807994 --- /dev/null +++ b/drivers/tty/serial/8250/8250_men_mcb.c @@ -0,0 +1,118 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +struct serial_8250_men_mcb_data { + struct uart_8250_port uart; + int line; +}; + +/* + * The Z125 16550-compatible UART has no fixed base clock assigned + * So, depending on the board we're on, we need to adjust the + * parameter in order to really set the correct baudrate, and + * do so if possible without user interaction + */ +static u32 men_z125_lookup_uartclk(struct mcb_device *mdev) +{ + /* use default value if board is not available below */ + u32 clkval = 1041666; + + dev_info(&mdev->dev, "%s on board %s\n", + dev_name(&mdev->dev), + mdev->bus->name); + if (strncmp(mdev->bus->name, "F075", 4) == 0) + clkval = 1041666; + else if (strncmp(mdev->bus->name, "F216", 4) == 0) + clkval = 1843200; + else if (strncmp(mdev->bus->name, "G215", 4) == 0) + clkval = 1843200; + else + dev_info(&mdev->dev, + "board not detected, using default uartclk\n"); + + clkval = clkval << 4; + + return clkval; +} + +static int serial_8250_men_mcb_probe(struct mcb_device *mdev, + const struct mcb_device_id *id) +{ + struct serial_8250_men_mcb_data *data; + struct resource *mem; + + data = devm_kzalloc(&mdev->dev, + sizeof(struct serial_8250_men_mcb_data), + GFP_KERNEL); + if (!data) + return -ENOMEM; + + mcb_set_drvdata(mdev, data); + data->uart.port.dev = mdev->dma_dev; + spin_lock_init(&data->uart.port.lock); + + data->uart.port.type = PORT_16550; + data->uart.port.flags = UPF_SKIP_TEST | UPF_SHARE_IRQ | UPF_FIXED_TYPE; + data->uart.port.iotype = UPIO_MEM; + data->uart.port.uartclk = men_z125_lookup_uartclk(mdev); + data->uart.port.regshift = 0; + data->uart.port.fifosize = 60; + + mem = mcb_get_resource(mdev, IORESOURCE_MEM); + if (mem == NULL) + return -ENXIO; + + data->uart.port.irq = mcb_get_irq(mdev); + + data->uart.port.membase = devm_ioremap_resource(&mdev->dev, mem); + if (IS_ERR(data->uart.port.membase)) + return PTR_ERR_OR_ZERO(data->uart.port.membase); + + data->uart.port.mapbase = (unsigned long) mem->start; + data->uart.port.iobase = data->uart.port.mapbase; + + /* ok, register the port */ + data->line = serial8250_register_8250_port(&data->uart); + if (data->line < 0) + return data->line; + + dev_info(&mdev->dev, "found 16Z125 UART: ttyS%d\n", data->line); + + return 0; +} + +static void serial_8250_men_mcb_remove(struct mcb_device *mdev) +{ + struct serial_8250_men_mcb_data *data = mcb_get_drvdata(mdev); + + if (data) + serial8250_unregister_port(data->line); +} + +static const struct mcb_device_id serial_8250_men_mcb_ids[] = { + { .device = 0x7d }, + { } +}; +MODULE_DEVICE_TABLE(mcb, serial_8250_men_mcb_ids); + +static struct mcb_driver mcb_driver = { + .driver = { + .name = "8250_men_mcb", + .owner = THIS_MODULE, + }, + .probe = serial_8250_men_mcb_probe, + .remove = serial_8250_men_mcb_remove, + .id_table = serial_8250_men_mcb_ids, +}; +module_mcb_driver(mcb_driver); + +MODULE_LICENSE("GPL v2"); +MODULE_DESCRIPTION("MEN 16z125 8250 UART driver"); +MODULE_AUTHOR("Michael Moese