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
					
				| @ -122,7 +122,6 @@ static struct resource sc26xx_rsrc[] = { | ||||
| 
 | ||||
| static struct sccnxp_pdata sccnxp_data = { | ||||
| 	.reg_shift	= 2, | ||||
| 	.frequency	= 3686400, | ||||
| 	.mctrl_cfg[0]	= MCTRL_SIG(DTR_OP, LINE_OP7) | | ||||
| 			  MCTRL_SIG(RTS_OP, LINE_OP3) | | ||||
| 			  MCTRL_SIG(DSR_IP, LINE_IP5) | | ||||
|  | ||||
| @ -15,6 +15,7 @@ | ||||
| #define SUPPORT_SYSRQ | ||||
| #endif | ||||
| 
 | ||||
| #include <linux/clk.h> | ||||
| #include <linux/err.h> | ||||
| #include <linux/module.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); | ||||
| 	int chiptype = pdev->id_entry->driver_data; | ||||
| 	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; | ||||
| 	void __iomem *membase; | ||||
| 	struct clk *clk; | ||||
| 
 | ||||
| 	membase = devm_ioremap_resource(&pdev->dev, res); | ||||
| 	if (IS_ERR(membase)) | ||||
| @ -898,11 +900,25 @@ static int sccnxp_probe(struct platform_device *pdev) | ||||
| 	} else if (PTR_ERR(s->regulator) == -EPROBE_DEFER) | ||||
| 		return -EPROBE_DEFER; | ||||
| 
 | ||||
| 	if (!pdata) { | ||||
| 		dev_warn(&pdev->dev, | ||||
| 			 "No platform data supplied, using defaults\n"); | ||||
| 		s->pdata.frequency = s->freq_std; | ||||
| 	clk = devm_clk_get(&pdev->dev, NULL); | ||||
| 	if (IS_ERR(clk)) { | ||||
| 		if (PTR_ERR(clk) == -EPROBE_DEFER) { | ||||
| 			ret = -EPROBE_DEFER; | ||||
| 			goto err_out; | ||||
| 		} | ||||
| 		dev_notice(&pdev->dev, "Using default clock frequency\n"); | ||||
| 		uartclk = s->freq_std; | ||||
| 	} 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)); | ||||
| 
 | ||||
| 	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.dev_name	= "ttySC"; | ||||
| 	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].membase	= membase; | ||||
| 		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; | ||||
| 		uart_add_one_port(&s->uart, &s->port[i]); | ||||
| 		/* Set direction to input */ | ||||
|  | ||||
| @ -60,7 +60,6 @@ | ||||
|  * }; | ||||
|  * | ||||
|  * static struct sccnxp_pdata sc2892_info = { | ||||
|  *	.frequency	= 3686400, | ||||
|  *	.mctrl_cfg[0]	= MCTRL_SIG(DIR_OP, LINE_OP0), | ||||
|  *	.mctrl_cfg[1]	= MCTRL_SIG(DIR_OP, LINE_OP1), | ||||
|  * }; | ||||
| @ -78,8 +77,6 @@ | ||||
| 
 | ||||
| /* SCCNXP platform data structure */ | ||||
| struct sccnxp_pdata { | ||||
| 	/* Frequency (extrenal clock or crystal) */ | ||||
| 	int			frequency; | ||||
| 	/* Shift for A0 line */ | ||||
| 	const u8		reg_shift; | ||||
| 	/* Modem control lines configuration */ | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user