Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

serial: sccnxp: Using CLK API for getting UART clock

This patch removes "frequency" parameter from SCCNXP platform_data
and uses CLK API for getting clock. If CLK ommited, default IC
frequency will be used instead.

Signed-off-by: Alexander Shiyan <shc_work@mail.ru>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Alexander Shiyan and committed by
Greg Kroah-Hartman
90efa75f e087ab74

+22 -18
-1
arch/mips/sni/a20r.c
··· 122 122 123 123 static struct sccnxp_pdata sccnxp_data = { 124 124 .reg_shift = 2, 125 - .frequency = 3686400, 126 125 .mctrl_cfg[0] = MCTRL_SIG(DTR_OP, LINE_OP7) | 127 126 MCTRL_SIG(RTS_OP, LINE_OP3) | 128 127 MCTRL_SIG(DSR_IP, LINE_IP5) |
+22 -14
drivers/tty/serial/sccnxp.c
··· 15 15 #define SUPPORT_SYSRQ 16 16 #endif 17 17 18 + #include <linux/clk.h> 18 19 #include <linux/err.h> 19 20 #include <linux/module.h> 20 21 #include <linux/device.h> ··· 784 783 struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 785 784 int chiptype = pdev->id_entry->driver_data; 786 785 struct sccnxp_pdata *pdata = dev_get_platdata(&pdev->dev); 787 - int i, ret, fifosize, freq_min, freq_max; 786 + int i, ret, fifosize, freq_min, freq_max, uartclk; 788 787 struct sccnxp_port *s; 789 788 void __iomem *membase; 789 + struct clk *clk; 790 790 791 791 membase = devm_ioremap_resource(&pdev->dev, res); 792 792 if (IS_ERR(membase)) ··· 900 898 } else if (PTR_ERR(s->regulator) == -EPROBE_DEFER) 901 899 return -EPROBE_DEFER; 902 900 903 - if (!pdata) { 904 - dev_warn(&pdev->dev, 905 - "No platform data supplied, using defaults\n"); 906 - s->pdata.frequency = s->freq_std; 901 + clk = devm_clk_get(&pdev->dev, NULL); 902 + if (IS_ERR(clk)) { 903 + if (PTR_ERR(clk) == -EPROBE_DEFER) { 904 + ret = -EPROBE_DEFER; 905 + goto err_out; 906 + } 907 + dev_notice(&pdev->dev, "Using default clock frequency\n"); 908 + uartclk = s->freq_std; 907 909 } else 910 + uartclk = clk_get_rate(clk); 911 + 912 + /* Check input frequency */ 913 + if ((uartclk < freq_min) || (uartclk > freq_max)) { 914 + dev_err(&pdev->dev, "Frequency out of bounds\n"); 915 + ret = -EINVAL; 916 + goto err_out; 917 + } 918 + 919 + if (pdata) 908 920 memcpy(&s->pdata, pdata, sizeof(struct sccnxp_pdata)); 909 921 910 922 if (s->pdata.poll_time_us) { ··· 934 918 ret = -ENXIO; 935 919 goto err_out; 936 920 } 937 - } 938 - 939 - /* Check input frequency */ 940 - if ((s->pdata.frequency < freq_min) || 941 - (s->pdata.frequency > freq_max)) { 942 - dev_err(&pdev->dev, "Frequency out of bounds\n"); 943 - ret = -EINVAL; 944 - goto err_out; 945 921 } 946 922 947 923 s->uart.owner = THIS_MODULE; ··· 967 959 s->port[i].mapbase = res->start; 968 960 s->port[i].membase = membase; 969 961 s->port[i].regshift = s->pdata.reg_shift; 970 - s->port[i].uartclk = s->pdata.frequency; 962 + s->port[i].uartclk = uartclk; 971 963 s->port[i].ops = &sccnxp_ops; 972 964 uart_add_one_port(&s->uart, &s->port[i]); 973 965 /* Set direction to input */
-3
include/linux/platform_data/serial-sccnxp.h
··· 60 60 * }; 61 61 * 62 62 * static struct sccnxp_pdata sc2892_info = { 63 - * .frequency = 3686400, 64 63 * .mctrl_cfg[0] = MCTRL_SIG(DIR_OP, LINE_OP0), 65 64 * .mctrl_cfg[1] = MCTRL_SIG(DIR_OP, LINE_OP1), 66 65 * }; ··· 77 78 78 79 /* SCCNXP platform data structure */ 79 80 struct sccnxp_pdata { 80 - /* Frequency (extrenal clock or crystal) */ 81 - int frequency; 82 81 /* Shift for A0 line */ 83 82 const u8 reg_shift; 84 83 /* Modem control lines configuration */