ea807d7d0b
Why I did it A demo driver base on this framework will display the sysfs node wich conform to the s3ip sysfs specification How I did it 1、 demo driver will call the s3ip kernel framework interface How to verify it run the demo ,it will display the sysfs node wich conform to the s3ip sysfs specification
588 lines
17 KiB
C
588 lines
17 KiB
C
/*
|
||
* psu_device_driver.c
|
||
*
|
||
* This module realize /sys/s3ip/psu attributes read and write functions
|
||
*
|
||
* History
|
||
* [Version] [Date] [Description]
|
||
* * v1.0 2021-08-31 S3IP sysfs
|
||
*/
|
||
|
||
#include <linux/slab.h>
|
||
|
||
#include "device_driver_common.h"
|
||
#include "psu_sysfs.h"
|
||
|
||
#define PSU_INFO(fmt, args...) LOG_INFO("psu: ", fmt, ##args)
|
||
#define PSU_ERR(fmt, args...) LOG_ERR("psu: ", fmt, ##args)
|
||
#define PSU_DBG(fmt, args...) LOG_DBG("psu: ", fmt, ##args)
|
||
|
||
static int g_loglevel = 0;
|
||
|
||
/********************************************psu**********************************************/
|
||
static int demo_get_psu_number(void)
|
||
{
|
||
/* add vendor codes here */
|
||
return 1;
|
||
}
|
||
|
||
static int demo_get_psu_temp_number(unsigned int psu_index)
|
||
{
|
||
/* add vendor codes here */
|
||
return 1;
|
||
}
|
||
|
||
/*
|
||
* demo_get_psu_model_name - Used to get psu model name,
|
||
* @psu_index: start with 1
|
||
* @buf: Data receiving buffer
|
||
* @count: length of buf
|
||
*
|
||
* This function returns the length of the filled buffer,
|
||
* if not support this attributes filled "NA" to buf,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static ssize_t demo_get_psu_model_name(unsigned int psu_index, char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_get_psu_serial_number - Used to get psu serial number,
|
||
* @psu_index: start with 1
|
||
* @buf: Data receiving buffer
|
||
* @count: length of buf
|
||
*
|
||
* This function returns the length of the filled buffer,
|
||
* if not support this attributes filled "NA" to buf,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static ssize_t demo_get_psu_serial_number(unsigned int psu_index, char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_get_psu_part_number - Used to get psu part number,
|
||
* @psu_index: start with 1
|
||
* @buf: Data receiving buffer
|
||
* @count: length of buf
|
||
*
|
||
* This function returns the length of the filled buffer,
|
||
* if not support this attributes filled "NA" to buf,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static ssize_t demo_get_psu_part_number(unsigned int psu_index, char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_get_psu_hardware_version - Used to get psu hardware version,
|
||
* @psu_index: start with 1
|
||
* @buf: Data receiving buffer
|
||
* @count: length of buf
|
||
*
|
||
* This function returns the length of the filled buffer,
|
||
* if not support this attributes filled "NA" to buf,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static ssize_t demo_get_psu_hardware_version(unsigned int psu_index, char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_get_psu_type - Used to get the input type of psu
|
||
* filled the value to buf, input type value define as below:
|
||
* 0: DC
|
||
* 1: AC
|
||
*
|
||
* @psu_index: start with 1
|
||
* @buf: Data receiving buffer
|
||
* @count: length of buf
|
||
*
|
||
* This function returns the length of the filled buffer,
|
||
* if not support this attributes filled "NA" to buf,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static ssize_t demo_get_psu_type(unsigned int psu_index, char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_get_psu_in_curr - Used to get the input current of psu
|
||
* filled the value to buf, and the value keep three decimal places
|
||
* @psu_index: start with 1
|
||
* @buf: Data receiving buffer
|
||
* @count: length of buf
|
||
*
|
||
* This function returns the length of the filled buffer,
|
||
* if not support this attributes filled "NA" to buf,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static ssize_t demo_get_psu_in_curr(unsigned int psu_index, char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_get_psu_in_vol - Used to get the input voltage of psu
|
||
* filled the value to buf, and the value keep three decimal places
|
||
* @psu_index: start with 1
|
||
* @buf: Data receiving buffer
|
||
* @count: length of buf
|
||
*
|
||
* This function returns the length of the filled buffer,
|
||
* if not support this attributes filled "NA" to buf,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static ssize_t demo_get_psu_in_vol(unsigned int psu_index, char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_get_psu_in_power - Used to get the input power of psu
|
||
* filled the value to buf, and the value keep three decimal places
|
||
* @psu_index: start with 1
|
||
* @buf: Data receiving buffer
|
||
* @count: length of buf
|
||
*
|
||
* This function returns the length of the filled buffer,
|
||
* if not support this attributes filled "NA" to buf,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static ssize_t demo_get_psu_in_power(unsigned int psu_index, char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_get_psu_out_curr - Used to get the output current of psu
|
||
* filled the value to buf, and the value keep three decimal places
|
||
* @psu_index: start with 1
|
||
* @buf: Data receiving buffer
|
||
* @count: length of buf
|
||
*
|
||
* This function returns the length of the filled buffer,
|
||
* if not support this attributes filled "NA" to buf,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static ssize_t demo_get_psu_out_curr(unsigned int psu_index, char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_get_psu_out_vol - Used to get the output voltage of psu
|
||
* filled the value to buf, and the value keep three decimal places
|
||
* @psu_index: start with 1
|
||
* @buf: Data receiving buffer
|
||
* @count: length of buf
|
||
*
|
||
* This function returns the length of the filled buffer,
|
||
* if not support this attributes filled "NA" to buf,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static ssize_t demo_get_psu_out_vol(unsigned int psu_index, char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_get_psu_out_power - Used to get the output power of psu
|
||
* filled the value to buf, and the value keep three decimal places
|
||
* @psu_index: start with 1
|
||
* @buf: Data receiving buffer
|
||
* @count: length of buf
|
||
*
|
||
* This function returns the length of the filled buffer,
|
||
* if not support this attributes filled "NA" to buf,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static ssize_t demo_get_psu_out_power(unsigned int psu_index, char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_get_psu_out_max_power - Used to get the output max power of psu
|
||
* filled the value to buf, and the value keep three decimal places
|
||
* @psu_index: start with 1
|
||
* @buf: Data receiving buffer
|
||
* @count: length of buf
|
||
*
|
||
* This function returns the length of the filled buffer,
|
||
* if not support this attributes filled "NA" to buf,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static ssize_t demo_get_psu_out_max_power(unsigned int psu_index, char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_get_psu_present_status - Used to get psu present status
|
||
* filled the value to buf, psu present status define as below:
|
||
* 0: ABSENT
|
||
* 1: PRESENT
|
||
*
|
||
* @psu_index: start with 1
|
||
* @buf: Data receiving buffer
|
||
* @count: length of buf
|
||
*
|
||
* This function returns the length of the filled buffer,
|
||
* if not support this attributes filled "NA" to buf,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static ssize_t demo_get_psu_present_status(unsigned int psu_index, char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_get_psu_in_status - Used to get psu input status
|
||
* filled the value to buf, psu input status define as below:
|
||
* 0: NOT OK
|
||
* 1: OK
|
||
*
|
||
* @psu_index: start with 1
|
||
* @buf: Data receiving buffer
|
||
* @count: length of buf
|
||
*
|
||
* This function returns the length of the filled buffer,
|
||
* if not support this attributes filled "NA" to buf,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static ssize_t demo_get_psu_in_status(unsigned int psu_index, char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_get_psu_out_status - Used to get psu output status
|
||
* filled the value to buf, psu output status define as below:
|
||
* 0: NOT OK
|
||
* 1: OK
|
||
*
|
||
* @psu_index: start with 1
|
||
* @buf: Data receiving buffer
|
||
* @count: length of buf
|
||
*
|
||
* This function returns the length of the filled buffer,
|
||
* if not support this attributes filled "NA" to buf,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static ssize_t demo_get_psu_out_status(unsigned int psu_index, char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_get_psu_fan_speed - Used to get psu fan speed
|
||
* filled the value to buf
|
||
* @psu_index: start with 1
|
||
* @buf: Data receiving buffer
|
||
* @count: length of buf
|
||
*
|
||
* This function returns the length of the filled buffer,
|
||
* if not support this attributes filled "NA" to buf,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static ssize_t demo_get_psu_fan_speed(unsigned int psu_index, char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_get_psu_fan_ratio - Used to get the ratio of psu fan
|
||
* filled the value to buf
|
||
* @psu_index: start with 1
|
||
* @buf: Data receiving buffer
|
||
* @count: length of buf
|
||
*
|
||
* This function returns the length of the filled buffer,
|
||
* if not support this attributes filled "NA" to buf,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static ssize_t demo_get_psu_fan_ratio(unsigned int psu_index, char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_set_psu_fan_ratio - Used to set the ratio of psu fan
|
||
* @psu_index: start with 1
|
||
* @ratio: from 0 to 100
|
||
*
|
||
* This function returns 0 on success,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static int demo_set_psu_fan_ratio(unsigned int psu_index, int ratio)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_get_psu_fan_direction - Used to get psu air flow direction,
|
||
* filled the value to buf, air flow direction define as below:
|
||
* 0: F2B
|
||
* 1: B2F
|
||
*
|
||
* @psu_index: start with 1
|
||
* @buf: Data receiving buffer
|
||
* @count: length of buf
|
||
*
|
||
* This function returns the length of the filled buffer,
|
||
* if not support this attributes filled "NA" to buf,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static ssize_t demo_get_psu_fan_direction(unsigned int psu_index, char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_get_psu_led_status - Used to get psu led status
|
||
* filled the value to buf, led status value define as below:
|
||
* 0: dark
|
||
* 1: green
|
||
* 2: yellow
|
||
* 3: red
|
||
* 4:blue
|
||
* 5: green light flashing
|
||
* 6: yellow light flashing
|
||
* 7: red light flashing
|
||
* 8:blue light flashing
|
||
*
|
||
* @psu_index: start with 1
|
||
* @buf: Data receiving buffer
|
||
* @count: length of buf
|
||
*
|
||
* This function returns the length of the filled buffer,
|
||
* if not support this attributes filled "NA" to buf,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static ssize_t demo_get_psu_led_status(unsigned int psu_index, char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_get_psu_temp_alias - Used to identify the location of the temperature sensor of psu,
|
||
* @psu_index: start with 1
|
||
* @temp_index: start with 1
|
||
* @buf: Data receiving buffer
|
||
* @count: length of buf
|
||
*
|
||
* This function returns the length of the filled buffer,
|
||
* if not support this attributes filled "NA" to buf,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static ssize_t demo_get_psu_temp_alias(unsigned int psu_index, unsigned int temp_index,
|
||
char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_get_psu_temp_type - Used to get the model of temperature sensor of psu,
|
||
* @psu_index: start with 1
|
||
* @temp_index: start with 1
|
||
* @buf: Data receiving buffer
|
||
* @count: length of buf
|
||
*
|
||
* This function returns the length of the filled buffer,
|
||
* if not support this attributes filled "NA" to buf,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static ssize_t demo_get_psu_temp_type(unsigned int psu_index, unsigned int temp_index,
|
||
char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_get_psu_temp_max - Used to get the maximum threshold of temperature sensor of psu,
|
||
* filled the value to buf, and the value keep three decimal places
|
||
* @psu_index: start with 1
|
||
* @temp_index: start with 1
|
||
* @buf: Data receiving buffer
|
||
* @count: length of buf
|
||
*
|
||
* This function returns the length of the filled buffer,
|
||
* if not support this attributes filled "NA" to buf,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static ssize_t demo_get_psu_temp_max(unsigned int psu_index, unsigned int temp_index,
|
||
char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_set_psu_temp_max - Used to set the maximum threshold of temperature sensor of psu,
|
||
* get value from buf and set it to maximum threshold of psu temperature sensor
|
||
* @psu_index: start with 1
|
||
* @temp_index: start with 1
|
||
* @buf: the buf store the data to be set, eg '80.000'
|
||
* @count: length of buf
|
||
*
|
||
* This function returns 0 on success,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static int demo_set_psu_temp_max(unsigned int psu_index, unsigned int temp_index,
|
||
const char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_get_psu_temp_min - Used to get the minimum threshold of temperature sensor of psu,
|
||
* filled the value to buf, and the value keep three decimal places
|
||
* @psu_index: start with 1
|
||
* @temp_index: start with 1
|
||
* @buf: Data receiving buffer
|
||
* @count: length of buf
|
||
*
|
||
* This function returns the length of the filled buffer,
|
||
* if not support this attributes filled "NA" to buf,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static ssize_t demo_get_psu_temp_min(unsigned int psu_index, unsigned int temp_index,
|
||
char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_set_psu_temp_min - Used to set the minimum threshold of temperature sensor of psu,
|
||
* get value from buf and set it to minimum threshold of psu temperature sensor
|
||
* @psu_index: start with 1
|
||
* @temp_index: start with 1
|
||
* @buf: the buf store the data to be set, eg '50.000'
|
||
* @count: length of buf
|
||
*
|
||
* This function returns 0 on success,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static int demo_set_psu_temp_min(unsigned int psu_index, unsigned int temp_index,
|
||
const char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
|
||
/*
|
||
* demo_get_psu_temp_value - Used to get the input value of temperature sensor of psu
|
||
* filled the value to buf, and the value keep three decimal places
|
||
* @psu_index: start with 1
|
||
* @temp_index: start with 1
|
||
* @buf: Data receiving buffer
|
||
* @count: length of buf
|
||
*
|
||
* This function returns the length of the filled buffer,
|
||
* otherwise it returns a negative value on failed.
|
||
*/
|
||
static ssize_t demo_get_psu_temp_value(unsigned int psu_index, unsigned int temp_index,
|
||
char *buf, size_t count)
|
||
{
|
||
/* add vendor codes here */
|
||
return -ENOSYS;
|
||
}
|
||
/****************************************end of psu*******************************************/
|
||
|
||
static struct s3ip_sysfs_psu_drivers_s drivers = {
|
||
/*
|
||
* set ODM psu drivers to /sys/s3ip/psu,
|
||
* if not support the function, set corresponding hook to NULL.
|
||
*/
|
||
.get_psu_number = demo_get_psu_number,
|
||
.get_psu_temp_number = demo_get_psu_temp_number,
|
||
.get_psu_model_name = demo_get_psu_model_name,
|
||
.get_psu_serial_number = demo_get_psu_serial_number,
|
||
.get_psu_part_number = demo_get_psu_part_number,
|
||
.get_psu_hardware_version = demo_get_psu_hardware_version,
|
||
.get_psu_type = demo_get_psu_type,
|
||
.get_psu_in_curr = demo_get_psu_in_curr,
|
||
.get_psu_in_vol = demo_get_psu_in_vol,
|
||
.get_psu_in_power = demo_get_psu_in_power,
|
||
.get_psu_out_curr = demo_get_psu_out_curr,
|
||
.get_psu_out_vol = demo_get_psu_out_vol,
|
||
.get_psu_out_power = demo_get_psu_out_power,
|
||
.get_psu_out_max_power = demo_get_psu_out_max_power,
|
||
.get_psu_present_status = demo_get_psu_present_status,
|
||
.get_psu_in_status = demo_get_psu_in_status,
|
||
.get_psu_out_status = demo_get_psu_out_status,
|
||
.get_psu_fan_speed = demo_get_psu_fan_speed,
|
||
.get_psu_fan_ratio = demo_get_psu_fan_ratio,
|
||
.set_psu_fan_ratio = demo_set_psu_fan_ratio,
|
||
.get_psu_fan_direction = demo_get_psu_fan_direction,
|
||
.get_psu_led_status = demo_get_psu_led_status,
|
||
.get_psu_temp_alias = demo_get_psu_temp_alias,
|
||
.get_psu_temp_type = demo_get_psu_temp_type,
|
||
.get_psu_temp_max = demo_get_psu_temp_max,
|
||
.set_psu_temp_max = demo_set_psu_temp_max,
|
||
.get_psu_temp_min = demo_get_psu_temp_min,
|
||
.set_psu_temp_min = demo_set_psu_temp_min,
|
||
.get_psu_temp_value = demo_get_psu_temp_value,
|
||
};
|
||
|
||
static int __init psu_dev_drv_init(void)
|
||
{
|
||
int ret;
|
||
|
||
PSU_INFO("psu_init...\n");
|
||
|
||
ret = s3ip_sysfs_psu_drivers_register(&drivers);
|
||
if (ret < 0) {
|
||
PSU_ERR("psu drivers register err, ret %d.\n", ret);
|
||
return ret;
|
||
}
|
||
PSU_INFO("psu_init success.\n");
|
||
return 0;
|
||
}
|
||
|
||
static void __exit psu_dev_drv_exit(void)
|
||
{
|
||
s3ip_sysfs_psu_drivers_unregister();
|
||
PSU_INFO("psu_exit ok.\n");
|
||
|
||
return;
|
||
}
|
||
|
||
module_init(psu_dev_drv_init);
|
||
module_exit(psu_dev_drv_exit);
|
||
module_param(g_loglevel, int, 0644);
|
||
MODULE_PARM_DESC(g_loglevel, "the log level(info=0x1, err=0x2, dbg=0x4, all=0xf).\n");
|
||
MODULE_LICENSE("GPL");
|
||
MODULE_AUTHOR("sonic S3IP sysfs");
|
||
MODULE_DESCRIPTION("psu device driver");
|