Blame view
drivers/hwmon/jz4740-hwmon.c
3.44 KB
7f983ba93 HWMON: Add JZ4740... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/* * Copyright (C) 2009-2010, Lars-Peter Clausen <lars@metafoo.de> * JZ4740 SoC HWMON driver * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 675 Mass Ave, Cambridge, MA 02139, USA. * */ #include <linux/err.h> #include <linux/interrupt.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/mutex.h> #include <linux/platform_device.h> #include <linux/slab.h> |
b25df2bfb hwmon: (jz4740-hw... |
23 |
#include <linux/io.h> |
7f983ba93 HWMON: Add JZ4740... |
24 25 26 27 28 29 30 |
#include <linux/completion.h> #include <linux/mfd/core.h> #include <linux/hwmon.h> struct jz4740_hwmon { |
7f983ba93 HWMON: Add JZ4740... |
31 |
void __iomem *base; |
7f983ba93 HWMON: Add JZ4740... |
32 |
int irq; |
e9300066b jz4740: silence w... |
33 |
const struct mfd_cell *cell; |
699f279d9 hwmon: (jz4740) C... |
34 |
struct platform_device *pdev; |
7f983ba93 HWMON: Add JZ4740... |
35 |
struct completion read_completion; |
7f983ba93 HWMON: Add JZ4740... |
36 37 |
struct mutex lock; }; |
7f983ba93 HWMON: Add JZ4740... |
38 39 40 41 42 43 44 45 46 47 48 49 |
static irqreturn_t jz4740_hwmon_irq(int irq, void *data) { struct jz4740_hwmon *hwmon = data; complete(&hwmon->read_completion); return IRQ_HANDLED; } static ssize_t jz4740_hwmon_read_adcin(struct device *dev, struct device_attribute *dev_attr, char *buf) { struct jz4740_hwmon *hwmon = dev_get_drvdata(dev); |
699f279d9 hwmon: (jz4740) C... |
50 |
struct platform_device *pdev = hwmon->pdev; |
7f983ba93 HWMON: Add JZ4740... |
51 |
struct completion *completion = &hwmon->read_completion; |
0b57d7602 hwmon: (jz4740) f... |
52 |
long t; |
7f983ba93 HWMON: Add JZ4740... |
53 54 55 56 |
unsigned long val; int ret; mutex_lock(&hwmon->lock); |
16735d022 tree-wide: use re... |
57 |
reinit_completion(completion); |
7f983ba93 HWMON: Add JZ4740... |
58 59 |
enable_irq(hwmon->irq); |
699f279d9 hwmon: (jz4740) C... |
60 |
hwmon->cell->enable(pdev); |
7f983ba93 HWMON: Add JZ4740... |
61 62 63 64 65 66 67 68 69 70 71 |
t = wait_for_completion_interruptible_timeout(completion, HZ); if (t > 0) { val = readw(hwmon->base) & 0xfff; val = (val * 3300) >> 12; ret = sprintf(buf, "%lu ", val); } else { ret = t ? t : -ETIMEDOUT; } |
699f279d9 hwmon: (jz4740) C... |
72 |
hwmon->cell->disable(pdev); |
7f983ba93 HWMON: Add JZ4740... |
73 74 75 76 77 78 |
disable_irq(hwmon->irq); mutex_unlock(&hwmon->lock); return ret; } |
7f983ba93 HWMON: Add JZ4740... |
79 |
static DEVICE_ATTR(in0_input, S_IRUGO, jz4740_hwmon_read_adcin, NULL); |
699f279d9 hwmon: (jz4740) C... |
80 |
static struct attribute *jz4740_attrs[] = { |
7f983ba93 HWMON: Add JZ4740... |
81 82 83 |
&dev_attr_in0_input.attr, NULL }; |
699f279d9 hwmon: (jz4740) C... |
84 |
ATTRIBUTE_GROUPS(jz4740); |
7f983ba93 HWMON: Add JZ4740... |
85 |
|
6c931ae1c hwmon: remove use... |
86 |
static int jz4740_hwmon_probe(struct platform_device *pdev) |
7f983ba93 HWMON: Add JZ4740... |
87 88 |
{ int ret; |
699f279d9 hwmon: (jz4740) C... |
89 |
struct device *dev = &pdev->dev; |
7f983ba93 HWMON: Add JZ4740... |
90 |
struct jz4740_hwmon *hwmon; |
699f279d9 hwmon: (jz4740) C... |
91 |
struct device *hwmon_dev; |
939a0a3fe hwmon: (jz4740) U... |
92 |
struct resource *mem; |
7f983ba93 HWMON: Add JZ4740... |
93 |
|
699f279d9 hwmon: (jz4740) C... |
94 |
hwmon = devm_kzalloc(dev, sizeof(*hwmon), GFP_KERNEL); |
b25df2bfb hwmon: (jz4740-hw... |
95 |
if (!hwmon) |
7f983ba93 HWMON: Add JZ4740... |
96 |
return -ENOMEM; |
7f983ba93 HWMON: Add JZ4740... |
97 |
|
6a54ac214 mfd: mfd_cell is ... |
98 |
hwmon->cell = mfd_get_cell(pdev); |
7f983ba93 HWMON: Add JZ4740... |
99 100 101 |
hwmon->irq = platform_get_irq(pdev, 0); if (hwmon->irq < 0) { |
b25df2bfb hwmon: (jz4740-hw... |
102 103 104 105 |
dev_err(&pdev->dev, "Failed to get platform irq: %d ", hwmon->irq); return hwmon->irq; |
7f983ba93 HWMON: Add JZ4740... |
106 |
} |
939a0a3fe hwmon: (jz4740) U... |
107 108 109 110 |
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); hwmon->base = devm_ioremap_resource(&pdev->dev, mem); if (IS_ERR(hwmon->base)) return PTR_ERR(hwmon->base); |
7f983ba93 HWMON: Add JZ4740... |
111 |
|
699f279d9 hwmon: (jz4740) C... |
112 |
hwmon->pdev = pdev; |
7f983ba93 HWMON: Add JZ4740... |
113 114 |
init_completion(&hwmon->read_completion); mutex_init(&hwmon->lock); |
699f279d9 hwmon: (jz4740) C... |
115 |
ret = devm_request_irq(dev, hwmon->irq, jz4740_hwmon_irq, 0, |
b25df2bfb hwmon: (jz4740-hw... |
116 |
pdev->name, hwmon); |
7f983ba93 HWMON: Add JZ4740... |
117 118 119 |
if (ret) { dev_err(&pdev->dev, "Failed to request irq: %d ", ret); |
b25df2bfb hwmon: (jz4740-hw... |
120 |
return ret; |
7f983ba93 HWMON: Add JZ4740... |
121 122 |
} disable_irq(hwmon->irq); |
699f279d9 hwmon: (jz4740) C... |
123 124 125 |
hwmon_dev = devm_hwmon_device_register_with_groups(dev, "jz4740", hwmon, jz4740_groups); return PTR_ERR_OR_ZERO(hwmon_dev); |
7f983ba93 HWMON: Add JZ4740... |
126 |
} |
d6c4f2ac1 hwmon: (jz4740) S... |
127 |
static struct platform_driver jz4740_hwmon_driver = { |
7f983ba93 HWMON: Add JZ4740... |
128 |
.probe = jz4740_hwmon_probe, |
7f983ba93 HWMON: Add JZ4740... |
129 130 |
.driver = { .name = "jz4740-hwmon", |
7f983ba93 HWMON: Add JZ4740... |
131 132 |
}, }; |
25a236a5d hwmon: convert dr... |
133 |
module_platform_driver(jz4740_hwmon_driver); |
7f983ba93 HWMON: Add JZ4740... |
134 135 136 137 138 |
MODULE_DESCRIPTION("JZ4740 SoC HWMON driver"); MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); MODULE_LICENSE("GPL"); MODULE_ALIAS("platform:jz4740-hwmon"); |