forked from mirrors/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>
This commit is contained in:
		
							parent
							
								
									e087ab74f3
								
							
						
					
					
						commit
						90efa75f7a
					
				
					 3 changed files with 22 additions and 18 deletions
				
			
		| 
						 | 
					@ -122,7 +122,6 @@ static struct resource sc26xx_rsrc[] = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct sccnxp_pdata sccnxp_data = {
 | 
					static struct sccnxp_pdata sccnxp_data = {
 | 
				
			||||||
	.reg_shift	= 2,
 | 
						.reg_shift	= 2,
 | 
				
			||||||
	.frequency	= 3686400,
 | 
					 | 
				
			||||||
	.mctrl_cfg[0]	= MCTRL_SIG(DTR_OP, LINE_OP7) |
 | 
						.mctrl_cfg[0]	= MCTRL_SIG(DTR_OP, LINE_OP7) |
 | 
				
			||||||
			  MCTRL_SIG(RTS_OP, LINE_OP3) |
 | 
								  MCTRL_SIG(RTS_OP, LINE_OP3) |
 | 
				
			||||||
			  MCTRL_SIG(DSR_IP, LINE_IP5) |
 | 
								  MCTRL_SIG(DSR_IP, LINE_IP5) |
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,6 +15,7 @@
 | 
				
			||||||
#define SUPPORT_SYSRQ
 | 
					#define SUPPORT_SYSRQ
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <linux/clk.h>
 | 
				
			||||||
#include <linux/err.h>
 | 
					#include <linux/err.h>
 | 
				
			||||||
#include <linux/module.h>
 | 
					#include <linux/module.h>
 | 
				
			||||||
#include <linux/device.h>
 | 
					#include <linux/device.h>
 | 
				
			||||||
| 
						 | 
					@ -783,9 +784,10 @@ static int sccnxp_probe(struct platform_device *pdev)
 | 
				
			||||||
	struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 | 
						struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 | 
				
			||||||
	int chiptype = pdev->id_entry->driver_data;
 | 
						int chiptype = pdev->id_entry->driver_data;
 | 
				
			||||||
	struct sccnxp_pdata *pdata = dev_get_platdata(&pdev->dev);
 | 
						struct sccnxp_pdata *pdata = dev_get_platdata(&pdev->dev);
 | 
				
			||||||
	int i, ret, fifosize, freq_min, freq_max;
 | 
						int i, ret, fifosize, freq_min, freq_max, uartclk;
 | 
				
			||||||
	struct sccnxp_port *s;
 | 
						struct sccnxp_port *s;
 | 
				
			||||||
	void __iomem *membase;
 | 
						void __iomem *membase;
 | 
				
			||||||
 | 
						struct clk *clk;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	membase = devm_ioremap_resource(&pdev->dev, res);
 | 
						membase = devm_ioremap_resource(&pdev->dev, res);
 | 
				
			||||||
	if (IS_ERR(membase))
 | 
						if (IS_ERR(membase))
 | 
				
			||||||
| 
						 | 
					@ -898,11 +900,25 @@ static int sccnxp_probe(struct platform_device *pdev)
 | 
				
			||||||
	} else if (PTR_ERR(s->regulator) == -EPROBE_DEFER)
 | 
						} else if (PTR_ERR(s->regulator) == -EPROBE_DEFER)
 | 
				
			||||||
		return -EPROBE_DEFER;
 | 
							return -EPROBE_DEFER;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!pdata) {
 | 
						clk = devm_clk_get(&pdev->dev, NULL);
 | 
				
			||||||
		dev_warn(&pdev->dev,
 | 
						if (IS_ERR(clk)) {
 | 
				
			||||||
			 "No platform data supplied, using defaults\n");
 | 
							if (PTR_ERR(clk) == -EPROBE_DEFER) {
 | 
				
			||||||
		s->pdata.frequency = s->freq_std;
 | 
								ret = -EPROBE_DEFER;
 | 
				
			||||||
 | 
								goto err_out;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							dev_notice(&pdev->dev, "Using default clock frequency\n");
 | 
				
			||||||
 | 
							uartclk = s->freq_std;
 | 
				
			||||||
	} else
 | 
						} else
 | 
				
			||||||
 | 
							uartclk = clk_get_rate(clk);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Check input frequency */
 | 
				
			||||||
 | 
						if ((uartclk < freq_min) || (uartclk > freq_max)) {
 | 
				
			||||||
 | 
							dev_err(&pdev->dev, "Frequency out of bounds\n");
 | 
				
			||||||
 | 
							ret = -EINVAL;
 | 
				
			||||||
 | 
							goto err_out;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (pdata)
 | 
				
			||||||
		memcpy(&s->pdata, pdata, sizeof(struct sccnxp_pdata));
 | 
							memcpy(&s->pdata, pdata, sizeof(struct sccnxp_pdata));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (s->pdata.poll_time_us) {
 | 
						if (s->pdata.poll_time_us) {
 | 
				
			||||||
| 
						 | 
					@ -920,14 +936,6 @@ static int sccnxp_probe(struct platform_device *pdev)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Check input frequency */
 | 
					 | 
				
			||||||
	if ((s->pdata.frequency < freq_min) ||
 | 
					 | 
				
			||||||
	    (s->pdata.frequency > freq_max)) {
 | 
					 | 
				
			||||||
		dev_err(&pdev->dev, "Frequency out of bounds\n");
 | 
					 | 
				
			||||||
		ret = -EINVAL;
 | 
					 | 
				
			||||||
		goto err_out;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	s->uart.owner		= THIS_MODULE;
 | 
						s->uart.owner		= THIS_MODULE;
 | 
				
			||||||
	s->uart.dev_name	= "ttySC";
 | 
						s->uart.dev_name	= "ttySC";
 | 
				
			||||||
	s->uart.major		= SCCNXP_MAJOR;
 | 
						s->uart.major		= SCCNXP_MAJOR;
 | 
				
			||||||
| 
						 | 
					@ -959,7 +967,7 @@ static int sccnxp_probe(struct platform_device *pdev)
 | 
				
			||||||
		s->port[i].mapbase	= res->start;
 | 
							s->port[i].mapbase	= res->start;
 | 
				
			||||||
		s->port[i].membase	= membase;
 | 
							s->port[i].membase	= membase;
 | 
				
			||||||
		s->port[i].regshift	= s->pdata.reg_shift;
 | 
							s->port[i].regshift	= s->pdata.reg_shift;
 | 
				
			||||||
		s->port[i].uartclk	= s->pdata.frequency;
 | 
							s->port[i].uartclk	= uartclk;
 | 
				
			||||||
		s->port[i].ops		= &sccnxp_ops;
 | 
							s->port[i].ops		= &sccnxp_ops;
 | 
				
			||||||
		uart_add_one_port(&s->uart, &s->port[i]);
 | 
							uart_add_one_port(&s->uart, &s->port[i]);
 | 
				
			||||||
		/* Set direction to input */
 | 
							/* Set direction to input */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -60,7 +60,6 @@
 | 
				
			||||||
 * };
 | 
					 * };
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * static struct sccnxp_pdata sc2892_info = {
 | 
					 * static struct sccnxp_pdata sc2892_info = {
 | 
				
			||||||
 *	.frequency	= 3686400,
 | 
					 | 
				
			||||||
 *	.mctrl_cfg[0]	= MCTRL_SIG(DIR_OP, LINE_OP0),
 | 
					 *	.mctrl_cfg[0]	= MCTRL_SIG(DIR_OP, LINE_OP0),
 | 
				
			||||||
 *	.mctrl_cfg[1]	= MCTRL_SIG(DIR_OP, LINE_OP1),
 | 
					 *	.mctrl_cfg[1]	= MCTRL_SIG(DIR_OP, LINE_OP1),
 | 
				
			||||||
 * };
 | 
					 * };
 | 
				
			||||||
| 
						 | 
					@ -78,8 +77,6 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* SCCNXP platform data structure */
 | 
					/* SCCNXP platform data structure */
 | 
				
			||||||
struct sccnxp_pdata {
 | 
					struct sccnxp_pdata {
 | 
				
			||||||
	/* Frequency (extrenal clock or crystal) */
 | 
					 | 
				
			||||||
	int			frequency;
 | 
					 | 
				
			||||||
	/* Shift for A0 line */
 | 
						/* Shift for A0 line */
 | 
				
			||||||
	const u8		reg_shift;
 | 
						const u8		reg_shift;
 | 
				
			||||||
	/* Modem control lines configuration */
 | 
						/* Modem control lines configuration */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue