forked from mirrors/linux
		
	rtc: imx-sc: add rtc set time support
This patch adds i.MX system controller RTC set time support, the RTC set time is implemented via SIP(silicon provider) runtime service call and ARM-Trusted-Firmware will communicate with system controller via MU(message unit) IPC to set RTC time. Signed-off-by: Anson Huang <Anson.Huang@nxp.com> Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
This commit is contained in:
		
							parent
							
								
									761acdda5c
								
							
						
					
					
						commit
						13a929f38a
					
				
					 1 changed files with 19 additions and 0 deletions
				
			
		|  | @ -3,6 +3,7 @@ | ||||||
|  * Copyright 2018 NXP. |  * Copyright 2018 NXP. | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
|  | #include <linux/arm-smccc.h> | ||||||
| #include <linux/firmware/imx/sci.h> | #include <linux/firmware/imx/sci.h> | ||||||
| #include <linux/module.h> | #include <linux/module.h> | ||||||
| #include <linux/of.h> | #include <linux/of.h> | ||||||
|  | @ -12,6 +13,9 @@ | ||||||
| #define IMX_SC_TIMER_FUNC_GET_RTC_SEC1970	9 | #define IMX_SC_TIMER_FUNC_GET_RTC_SEC1970	9 | ||||||
| #define IMX_SC_TIMER_FUNC_SET_RTC_TIME		6 | #define IMX_SC_TIMER_FUNC_SET_RTC_TIME		6 | ||||||
| 
 | 
 | ||||||
|  | #define IMX_SIP_SRTC			0xC2000002 | ||||||
|  | #define IMX_SIP_SRTC_SET_TIME		0x0 | ||||||
|  | 
 | ||||||
| static struct imx_sc_ipc *rtc_ipc_handle; | static struct imx_sc_ipc *rtc_ipc_handle; | ||||||
| static struct rtc_device *imx_sc_rtc; | static struct rtc_device *imx_sc_rtc; | ||||||
| 
 | 
 | ||||||
|  | @ -42,8 +46,23 @@ static int imx_sc_rtc_read_time(struct device *dev, struct rtc_time *tm) | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static int imx_sc_rtc_set_time(struct device *dev, struct rtc_time *tm) | ||||||
|  | { | ||||||
|  | 	struct arm_smccc_res res; | ||||||
|  | 
 | ||||||
|  | 	/* pack 2 time parameters into 1 register, 16 bits for each */ | ||||||
|  | 	arm_smccc_smc(IMX_SIP_SRTC, IMX_SIP_SRTC_SET_TIME, | ||||||
|  | 		      ((tm->tm_year + 1900) << 16) | (tm->tm_mon + 1), | ||||||
|  | 		      (tm->tm_mday << 16) | tm->tm_hour, | ||||||
|  | 		      (tm->tm_min << 16) | tm->tm_sec, | ||||||
|  | 		      0, 0, 0, &res); | ||||||
|  | 
 | ||||||
|  | 	return res.a0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static const struct rtc_class_ops imx_sc_rtc_ops = { | static const struct rtc_class_ops imx_sc_rtc_ops = { | ||||||
| 	.read_time = imx_sc_rtc_read_time, | 	.read_time = imx_sc_rtc_read_time, | ||||||
|  | 	.set_time = imx_sc_rtc_set_time, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static int imx_sc_rtc_probe(struct platform_device *pdev) | static int imx_sc_rtc_probe(struct platform_device *pdev) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Anson Huang
						Anson Huang