18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Smart reflex Class 3 specific implementations 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Author: Thara Gopinath <thara@ti.com> 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Copyright (C) 2010 Texas Instruments, Inc. 88c2ecf20Sopenharmony_ci * Thara Gopinath <thara@ti.com> 98c2ecf20Sopenharmony_ci */ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <linux/power/smartreflex.h> 128c2ecf20Sopenharmony_ci#include "soc.h" 138c2ecf20Sopenharmony_ci#include "voltage.h" 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_cistatic int sr_class3_enable(struct omap_sr *sr) 168c2ecf20Sopenharmony_ci{ 178c2ecf20Sopenharmony_ci unsigned long volt = voltdm_get_voltage(sr->voltdm); 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci if (!volt) { 208c2ecf20Sopenharmony_ci pr_warn("%s: Curr voltage unknown. Cannot enable %s\n", 218c2ecf20Sopenharmony_ci __func__, sr->name); 228c2ecf20Sopenharmony_ci return -ENODATA; 238c2ecf20Sopenharmony_ci } 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci omap_vp_enable(sr->voltdm); 268c2ecf20Sopenharmony_ci return sr_enable(sr, volt); 278c2ecf20Sopenharmony_ci} 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_cistatic int sr_class3_disable(struct omap_sr *sr, int is_volt_reset) 308c2ecf20Sopenharmony_ci{ 318c2ecf20Sopenharmony_ci sr_disable_errgen(sr); 328c2ecf20Sopenharmony_ci omap_vp_disable(sr->voltdm); 338c2ecf20Sopenharmony_ci sr_disable(sr); 348c2ecf20Sopenharmony_ci if (is_volt_reset) 358c2ecf20Sopenharmony_ci voltdm_reset(sr->voltdm); 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci return 0; 388c2ecf20Sopenharmony_ci} 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_cistatic int sr_class3_configure(struct omap_sr *sr) 418c2ecf20Sopenharmony_ci{ 428c2ecf20Sopenharmony_ci return sr_configure_errgen(sr); 438c2ecf20Sopenharmony_ci} 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci/* SR class3 structure */ 468c2ecf20Sopenharmony_cistatic struct omap_sr_class_data class3_data = { 478c2ecf20Sopenharmony_ci .enable = sr_class3_enable, 488c2ecf20Sopenharmony_ci .disable = sr_class3_disable, 498c2ecf20Sopenharmony_ci .configure = sr_class3_configure, 508c2ecf20Sopenharmony_ci .class_type = SR_CLASS3, 518c2ecf20Sopenharmony_ci}; 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci/* Smartreflex Class3 init API to be called from board file */ 548c2ecf20Sopenharmony_cistatic int __init sr_class3_init(void) 558c2ecf20Sopenharmony_ci{ 568c2ecf20Sopenharmony_ci pr_info("SmartReflex Class3 initialized\n"); 578c2ecf20Sopenharmony_ci return sr_register_class(&class3_data); 588c2ecf20Sopenharmony_ci} 598c2ecf20Sopenharmony_ciomap_late_initcall(sr_class3_init); 60