Received: by 2002:a05:6a10:6d10:0:0:0:0 with SMTP id gq16csp809454pxb; Fri, 22 Apr 2022 11:37:03 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwlfIj6T7ZgVZtQyhiJRkSPJPTq1e4SRY72W8WP7ejFBF1QpO1IbZUymwxp90Keu3jouKF6 X-Received: by 2002:a17:90b:4b87:b0:1d3:d3:3f90 with SMTP id lr7-20020a17090b4b8700b001d300d33f90mr17508917pjb.232.1650652623032; Fri, 22 Apr 2022 11:37:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1650652623; cv=none; d=google.com; s=arc-20160816; b=uL2N5ZCzkz2jni2a/mdDrsSS39OWiks7DxK+XlJAQ3jGCC9Z8/ZTMR3A8LAffHDLCn bBE495t3YEZfkQ8qdx7UIZ1Ej+X1M88reiemZZ49EXfIA2camM9qQyuP3OobDxB0TfBY Y7ju2/oBHd4C1rfnfGgpx7YvIJjBdkH0TGwnVzUbLNNJ6AvtaYCLePclxwyN6FELg8J5 fAwTDRLHGgZgwFzOGA10Wvi0unSNWOMNVOoxNbnhzKuWWk8rq8JROLz7kdOL4zYMKnTP nwEwf1Zj07H6xrg4oPh6RERHGgMomWnhg2zHk7SoWJTfvfrY7km+5fElUZqD/Azd79Tv LKYw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=2aRVs6JKjS/4QADQT8ZIKZt/YqvGRsKnu930k09fHzY=; b=AJzRFd/jn2gvytk4fLw/Ps5lQfOTNUstW2okdB56URsFtrDjSnzk5fU8lpkjc8fccB 2UW2aGvOFetpNwv582o8Lxa1yCcHGLIjsvh94UJ4JgNs+XhAaV6RiYPSagWbqmG9yo+Y JOddQRtSTfnd6btsg3qkcPSbuHl0KB0bkAe/9oFZJG5VZ+u7DJS9Qfy60UZR9KUkFqk1 YIj9BTfCbjY+smSgh+HZ78UKQgnJeK3HhL2k1d5FQr5uSl1GPehd7S4m62f/+TtGtQ9+ CsbmEH3cXCCSX815lqNLFpn4lBgqZ3uH2pHf7lFiiKGzowamwKoq8riWrthuDikfU3wo GDjQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id 206-20020a6302d7000000b003aa618cb173si9498895pgc.793.2022.04.22.11.37.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Apr 2022 11:37:03 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 11D89EC12D; Fri, 22 Apr 2022 11:05:26 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1447048AbiDVLRk (ORCPT + 99 others); Fri, 22 Apr 2022 07:17:40 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36104 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1447036AbiDVLRf (ORCPT ); Fri, 22 Apr 2022 07:17:35 -0400 Received: from mail-sh.amlogic.com (mail-sh.amlogic.com [58.32.228.43]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2448C53A77; Fri, 22 Apr 2022 04:14:42 -0700 (PDT) Received: from droid06.amlogic.com (10.18.11.248) by mail-sh.amlogic.com (10.18.11.5) with Microsoft SMTP Server id 15.1.2176.14; Fri, 22 Apr 2022 19:14:39 +0800 From: Yu Tu To: , , , , Greg Kroah-Hartman , Neil Armstrong , Kevin Hilman , Jerome Brunet CC: Jiri Slaby , Martin Blumenstingl , Yu Tu Subject: [PATCH V3 1/2] tty: serial: meson: Add a 12MHz internal clock rate to calculate baud rate in order to meet the baud rate requirements of special BT modules Date: Fri, 22 Apr 2022 19:13:19 +0800 Message-ID: <20220422111320.19234-2-yu.tu@amlogic.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20220422111320.19234-1-yu.tu@amlogic.com> References: <20220422111320.19234-1-yu.tu@amlogic.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7BIT Content-Type: text/plain; charset=US-ASCII X-Originating-IP: [10.18.11.248] X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RDNS_NONE, SPF_HELO_NONE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org A /2 divider over XTAL was introduced since G12A, and is preferred to be used over the still present /3 divider since it provides much closer frequencies vs the request baudrate. Especially the BT module uses 3Mhz baud rate. 8Mhz calculations can lead to baud rate bias, causing some problems. Signed-off-by: Yu Tu --- drivers/tty/serial/meson_uart.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/drivers/tty/serial/meson_uart.c b/drivers/tty/serial/meson_uart.c index 8e59624935af..58bd2723c004 100644 --- a/drivers/tty/serial/meson_uart.c +++ b/drivers/tty/serial/meson_uart.c @@ -68,6 +68,7 @@ #define AML_UART_BAUD_MASK 0x7fffff #define AML_UART_BAUD_USE BIT(23) #define AML_UART_BAUD_XTAL BIT(24) +#define AML_UART_BAUD_XTAL_DIV2 BIT(27) #define AML_UART_PORT_NUM 12 #define AML_UART_PORT_OFFSET 6 @@ -80,6 +81,10 @@ static struct uart_driver meson_uart_driver; static struct uart_port *meson_ports[AML_UART_PORT_NUM]; +struct meson_uart_data { + bool has_xtal_div2; +}; + static void meson_uart_set_mctrl(struct uart_port *port, unsigned int mctrl) { } @@ -293,13 +298,20 @@ static int meson_uart_startup(struct uart_port *port) static void meson_uart_change_speed(struct uart_port *port, unsigned long baud) { - u32 val; + const struct meson_uart_data *private_data = port->private_data; + u32 val = 0; while (!meson_uart_tx_empty(port)) cpu_relax(); if (port->uartclk == 24000000) { - val = DIV_ROUND_CLOSEST(port->uartclk / 3, baud) - 1; + unsigned int xtal_div = 3; + + if (private_data && private_data->has_xtal_div2) { + xtal_div = 2; + val |= AML_UART_BAUD_XTAL_DIV2; + } + val |= DIV_ROUND_CLOSEST(port->uartclk / xtal_div, baud) - 1; val |= AML_UART_BAUD_XTAL; } else { val = DIV_ROUND_CLOSEST(port->uartclk / 4, baud) - 1; @@ -749,6 +761,7 @@ static int meson_uart_probe(struct platform_device *pdev) port->x_char = 0; port->ops = &meson_uart_ops; port->fifosize = fifosize; + port->private_data = (void *)device_get_match_data(&pdev->dev); meson_ports[pdev->id] = port; platform_set_drvdata(pdev, port); -- 2.33.1