162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Smart reflex Class 3 specific implementations 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Author: Thara Gopinath <thara@ti.com> 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Copyright (C) 2010 Texas Instruments, Inc. 862306a36Sopenharmony_ci * Thara Gopinath <thara@ti.com> 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/power/smartreflex.h> 1262306a36Sopenharmony_ci#include "soc.h" 1362306a36Sopenharmony_ci#include "voltage.h" 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_cistatic int sr_class3_enable(struct omap_sr *sr) 1662306a36Sopenharmony_ci{ 1762306a36Sopenharmony_ci unsigned long volt = voltdm_get_voltage(sr->voltdm); 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci if (!volt) { 2062306a36Sopenharmony_ci pr_warn("%s: Curr voltage unknown. Cannot enable %s\n", 2162306a36Sopenharmony_ci __func__, sr->name); 2262306a36Sopenharmony_ci return -ENODATA; 2362306a36Sopenharmony_ci } 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci omap_vp_enable(sr->voltdm); 2662306a36Sopenharmony_ci return sr_enable(sr, volt); 2762306a36Sopenharmony_ci} 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cistatic int sr_class3_disable(struct omap_sr *sr, int is_volt_reset) 3062306a36Sopenharmony_ci{ 3162306a36Sopenharmony_ci sr_disable_errgen(sr); 3262306a36Sopenharmony_ci omap_vp_disable(sr->voltdm); 3362306a36Sopenharmony_ci sr_disable(sr); 3462306a36Sopenharmony_ci if (is_volt_reset) 3562306a36Sopenharmony_ci voltdm_reset(sr->voltdm); 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci return 0; 3862306a36Sopenharmony_ci} 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cistatic int sr_class3_configure(struct omap_sr *sr) 4162306a36Sopenharmony_ci{ 4262306a36Sopenharmony_ci return sr_configure_errgen(sr); 4362306a36Sopenharmony_ci} 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci/* SR class3 structure */ 4662306a36Sopenharmony_cistatic struct omap_sr_class_data class3_data = { 4762306a36Sopenharmony_ci .enable = sr_class3_enable, 4862306a36Sopenharmony_ci .disable = sr_class3_disable, 4962306a36Sopenharmony_ci .configure = sr_class3_configure, 5062306a36Sopenharmony_ci .class_type = SR_CLASS3, 5162306a36Sopenharmony_ci}; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci/* Smartreflex Class3 init API to be called from board file */ 5462306a36Sopenharmony_cistatic int __init sr_class3_init(void) 5562306a36Sopenharmony_ci{ 5662306a36Sopenharmony_ci pr_info("SmartReflex Class3 initialized\n"); 5762306a36Sopenharmony_ci return sr_register_class(&class3_data); 5862306a36Sopenharmony_ci} 5962306a36Sopenharmony_ciomap_late_initcall(sr_class3_init); 60