162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Interface for power-management for ppc64 compliant platform 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Manish Ahuja <mahuja@us.ibm.com> 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Feb 2007 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci * Copyright (C) 2007 IBM Corporation. 1062306a36Sopenharmony_ci */ 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <linux/kobject.h> 1362306a36Sopenharmony_ci#include <linux/string.h> 1462306a36Sopenharmony_ci#include <linux/errno.h> 1562306a36Sopenharmony_ci#include <linux/init.h> 1662306a36Sopenharmony_ci#include <asm/machdep.h> 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#include "pseries.h" 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ciunsigned long rtas_poweron_auto; /* default and normal state is 0 */ 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_cistatic ssize_t auto_poweron_show(struct kobject *kobj, 2362306a36Sopenharmony_ci struct kobj_attribute *attr, char *buf) 2462306a36Sopenharmony_ci{ 2562306a36Sopenharmony_ci return sprintf(buf, "%lu\n", rtas_poweron_auto); 2662306a36Sopenharmony_ci} 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_cistatic ssize_t auto_poweron_store(struct kobject *kobj, 2962306a36Sopenharmony_ci struct kobj_attribute *attr, 3062306a36Sopenharmony_ci const char *buf, size_t n) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci int ret; 3362306a36Sopenharmony_ci unsigned long ups_restart; 3462306a36Sopenharmony_ci ret = sscanf(buf, "%lu", &ups_restart); 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci if ((ret == 1) && ((ups_restart == 1) || (ups_restart == 0))){ 3762306a36Sopenharmony_ci rtas_poweron_auto = ups_restart; 3862306a36Sopenharmony_ci return n; 3962306a36Sopenharmony_ci } 4062306a36Sopenharmony_ci return -EINVAL; 4162306a36Sopenharmony_ci} 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistatic struct kobj_attribute auto_poweron_attr = 4462306a36Sopenharmony_ci __ATTR(auto_poweron, 0644, auto_poweron_show, auto_poweron_store); 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci#ifndef CONFIG_PM 4762306a36Sopenharmony_cistruct kobject *power_kobj; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cistatic struct attribute *g[] = { 5062306a36Sopenharmony_ci &auto_poweron_attr.attr, 5162306a36Sopenharmony_ci NULL, 5262306a36Sopenharmony_ci}; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_cistatic const struct attribute_group attr_group = { 5562306a36Sopenharmony_ci .attrs = g, 5662306a36Sopenharmony_ci}; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistatic int __init pm_init(void) 5962306a36Sopenharmony_ci{ 6062306a36Sopenharmony_ci power_kobj = kobject_create_and_add("power", NULL); 6162306a36Sopenharmony_ci if (!power_kobj) 6262306a36Sopenharmony_ci return -ENOMEM; 6362306a36Sopenharmony_ci return sysfs_create_group(power_kobj, &attr_group); 6462306a36Sopenharmony_ci} 6562306a36Sopenharmony_cimachine_core_initcall(pseries, pm_init); 6662306a36Sopenharmony_ci#else 6762306a36Sopenharmony_cistatic int __init apo_pm_init(void) 6862306a36Sopenharmony_ci{ 6962306a36Sopenharmony_ci return (sysfs_create_file(power_kobj, &auto_poweron_attr.attr)); 7062306a36Sopenharmony_ci} 7162306a36Sopenharmony_cimachine_device_initcall(pseries, apo_pm_init); 7262306a36Sopenharmony_ci#endif 73