hwmon_dev = devm_hwmon_device_register_with_groups(dev, "jz4740", hwmon,
#include <linux/interrupt.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/completion.h>
#include <linux/mfd/core.h>
const struct mfd_cell *cell;
struct platform_device *pdev;
struct completion read_completion;
static irqreturn_t jz4740_hwmon_irq(int irq, void *data)
struct jz4740_hwmon *hwmon = data;
complete(&hwmon->read_completion);
static ssize_t in0_input_show(struct device *dev,
struct device_attribute *dev_attr, char *buf)
struct jz4740_hwmon *hwmon = dev_get_drvdata(dev);
struct platform_device *pdev = hwmon->pdev;
struct completion *completion = &hwmon->read_completion;
mutex_lock(&hwmon->lock);
reinit_completion(completion);
hwmon->cell->enable(pdev);
t = wait_for_completion_interruptible_timeout(completion, HZ);
val = readw(hwmon->base) & 0xfff;
val = (val * 3300) >> 12;
ret = sprintf(buf, "%lu\n", val);
ret = t ? t : -ETIMEDOUT;