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