| 
									
										
										
										
											2010-05-29 22:02:25 +05:30
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Smart reflex Class 3 specific implementations | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Author: Thara Gopinath       <thara@ti.com> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (C) 2010 Texas Instruments, Inc. | 
					
						
							|  |  |  |  * Thara Gopinath <thara@ti.com> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU General Public License version 2 as | 
					
						
							|  |  |  |  * published by the Free Software Foundation. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-25 16:06:20 +05:30
										 |  |  | #include <linux/power/smartreflex.h>
 | 
					
						
							| 
									
										
										
										
											2013-02-09 19:20:57 -08:00
										 |  |  | #include "soc.h"
 | 
					
						
							| 
									
										
										
										
											2012-04-25 16:06:20 +05:30
										 |  |  | #include "voltage.h"
 | 
					
						
							| 
									
										
										
										
											2010-05-29 22:02:25 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-24 10:22:12 +05:30
										 |  |  | static int sr_class3_enable(struct omap_sr *sr) | 
					
						
							| 
									
										
										
										
											2010-05-29 22:02:25 +05:30
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-04-24 10:22:12 +05:30
										 |  |  | 	unsigned long volt = voltdm_get_voltage(sr->voltdm); | 
					
						
							| 
									
										
										
										
											2010-05-29 22:02:25 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (!volt) { | 
					
						
							| 
									
										
										
										
											2014-09-13 11:31:16 -07:00
										 |  |  | 		pr_warn("%s: Curr voltage unknown. Cannot enable %s\n", | 
					
						
							|  |  |  | 			__func__, sr->name); | 
					
						
							| 
									
										
										
										
											2010-05-29 22:02:25 +05:30
										 |  |  | 		return -ENODATA; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-24 10:22:12 +05:30
										 |  |  | 	omap_vp_enable(sr->voltdm); | 
					
						
							| 
									
										
										
										
											2013-05-27 14:09:24 +03:00
										 |  |  | 	return sr_enable(sr, volt); | 
					
						
							| 
									
										
										
										
											2010-05-29 22:02:25 +05:30
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-24 10:22:12 +05:30
										 |  |  | static int sr_class3_disable(struct omap_sr *sr, int is_volt_reset) | 
					
						
							| 
									
										
										
										
											2010-05-29 22:02:25 +05:30
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-05-27 14:09:22 +03:00
										 |  |  | 	sr_disable_errgen(sr); | 
					
						
							| 
									
										
										
										
											2012-04-24 10:22:12 +05:30
										 |  |  | 	omap_vp_disable(sr->voltdm); | 
					
						
							| 
									
										
										
										
											2013-05-27 14:09:24 +03:00
										 |  |  | 	sr_disable(sr); | 
					
						
							| 
									
										
										
										
											2010-05-29 22:02:25 +05:30
										 |  |  | 	if (is_volt_reset) | 
					
						
							| 
									
										
										
										
											2012-04-24 10:22:12 +05:30
										 |  |  | 		voltdm_reset(sr->voltdm); | 
					
						
							| 
									
										
										
										
											2010-05-29 22:02:25 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-24 10:22:12 +05:30
										 |  |  | static int sr_class3_configure(struct omap_sr *sr) | 
					
						
							| 
									
										
										
										
											2010-05-29 22:02:25 +05:30
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-05-27 14:09:22 +03:00
										 |  |  | 	return sr_configure_errgen(sr); | 
					
						
							| 
									
										
										
										
											2010-05-29 22:02:25 +05:30
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* SR class3 structure */ | 
					
						
							|  |  |  | static struct omap_sr_class_data class3_data = { | 
					
						
							|  |  |  | 	.enable = sr_class3_enable, | 
					
						
							|  |  |  | 	.disable = sr_class3_disable, | 
					
						
							|  |  |  | 	.configure = sr_class3_configure, | 
					
						
							|  |  |  | 	.class_type = SR_CLASS3, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Smartreflex Class3 init API to be called from board file */ | 
					
						
							|  |  |  | static int __init sr_class3_init(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	pr_info("SmartReflex Class3 initialized\n"); | 
					
						
							|  |  |  | 	return sr_register_class(&class3_data); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2013-01-11 11:24:18 -08:00
										 |  |  | omap_late_initcall(sr_class3_init); |