drivers/hwmon/sg2042-mcu.c

Source file repositories/reference/linux-study-clean/drivers/hwmon/sg2042-mcu.c

File Facts

System
Linux kernel
Corpus path
drivers/hwmon/sg2042-mcu.c
Extension
.c
Size
8399 bytes
Lines
361
Domain
Driver Families
Bucket
drivers/hwmon
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

struct sg2042_mcu_data {
	struct i2c_client	*client;
	struct mutex		mutex;
};

static ssize_t reset_count_show(struct device *dev,
				struct device_attribute *attr,
				char *buf)
{
	struct sg2042_mcu_data *mcu = dev_get_drvdata(dev);
	int ret;

	ret = i2c_smbus_read_byte_data(mcu->client, REG_RST_COUNT);
	if (ret < 0)
		return ret;

	return sprintf(buf, "%d\n", ret);
}

static ssize_t uptime_show(struct device *dev,
			   struct device_attribute *attr,
			   char *buf)
{
	struct sg2042_mcu_data *mcu = dev_get_drvdata(dev);
	u8 time_val[2];
	int ret;

	ret = i2c_smbus_read_i2c_block_data(mcu->client, REG_UPTIME,
					    sizeof(time_val), time_val);
	if (ret < 0)
		return ret;

	return sprintf(buf, "%d\n",
		       (time_val[0]) | (time_val[1] << 8));
}

static ssize_t reset_reason_show(struct device *dev,
				 struct device_attribute *attr,
				 char *buf)
{
	struct sg2042_mcu_data *mcu = dev_get_drvdata(dev);
	int ret;

	ret = i2c_smbus_read_byte_data(mcu->client, REG_RESET_REASON);
	if (ret < 0)
		return ret;

	return sprintf(buf, "0x%02x\n", ret);
}

static ssize_t repower_policy_show(struct device *dev,
				   struct device_attribute *attr,
				   char *buf)
{
	struct sg2042_mcu_data *mcu = dev_get_drvdata(dev);
	int ret;
	const char *action;

	ret = i2c_smbus_read_byte_data(mcu->client, REG_REPOWER_POLICY);
	if (ret < 0)
		return ret;

	if (ret == REPOWER_POLICY_REBOOT)
		action = "repower";
	else if (ret == REPOWER_POLICY_KEEP_OFF)
		action = "keep";
	else
		action = "unknown";

	return sprintf(buf, "%s\n", action);
}

static ssize_t repower_policy_store(struct device *dev,
				    struct device_attribute *attr,
				    const char *buf, size_t count)
{
	struct sg2042_mcu_data *mcu = dev_get_drvdata(dev);
	u8 value;
	int ret;

	if (sysfs_streq("repower", buf))
		value = REPOWER_POLICY_REBOOT;
	else if (sysfs_streq("keep", buf))
		value = REPOWER_POLICY_KEEP_OFF;
	else
		return -EINVAL;

	ret = i2c_smbus_write_byte_data(mcu->client,
					REG_REPOWER_POLICY, value);
	if (ret < 0)

Annotation

Implementation Notes