All of lore.kernel.org
 help / color / mirror / Atom feed
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: linuxppc-dev@ozlabs.org
Cc: khali@linux-fr.org
Subject: [PATCH 12/15] powerpc/windfarm: Add lm87 sensor
Date: Thu, 19 Apr 2012 18:16:53 +1000	[thread overview]
Message-ID: <1334823416-9138-13-git-send-email-benh@kernel.crashing.org> (raw)
In-Reply-To: <1334823416-9138-1-git-send-email-benh@kernel.crashing.org>

For use by the upcoming windfarm_rm31

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
 drivers/macintosh/windfarm_lm87_sensor.c |  201 ++++++++++++++++++++++++++++++
 1 file changed, 201 insertions(+)
 create mode 100644 drivers/macintosh/windfarm_lm87_sensor.c

diff --git a/drivers/macintosh/windfarm_lm87_sensor.c b/drivers/macintosh/windfarm_lm87_sensor.c
new file mode 100644
index 0000000..c071aab
--- /dev/null
+++ b/drivers/macintosh/windfarm_lm87_sensor.c
@@ -0,0 +1,201 @@
+/*
+ * Windfarm PowerMac thermal control. LM87 sensor
+ *
+ * Copyright 2012 Benjamin Herrenschmidt, IBM Corp.
+ *
+ * Released under the term of the GNU GPL v2.
+ *
+ */
+
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <linux/kernel.h>
+#include <linux/delay.h>
+#include <linux/slab.h>
+#include <linux/init.h>
+#include <linux/wait.h>
+#include <linux/i2c.h>
+#include <asm/prom.h>
+#include <asm/machdep.h>
+#include <asm/io.h>
+#include <asm/sections.h>
+#include <asm/pmac_low_i2c.h>
+
+#include "windfarm.h"
+
+#define VERSION "1.0"
+
+#undef DEBUG
+
+#ifdef DEBUG
+#define DBG(args...)	printk(args)
+#else
+#define DBG(args...)	do { } while(0)
+#endif
+
+struct wf_lm87_sensor {
+	struct i2c_client	*i2c;
+	struct wf_sensor	sens;
+};
+#define wf_to_lm87(c) container_of(c, struct wf_lm87_sensor, sens)
+
+
+static int wf_lm87_read_reg(struct i2c_client *chip, int reg)
+{
+	int rc, tries = 0;
+	u8 buf;
+
+	for (;;) {
+		/* Set address */
+		buf = (u8)reg;
+		rc = i2c_master_send(chip, &buf, 1);
+		if (rc <= 0)
+			goto error;
+		rc = i2c_master_recv(chip, &buf, 1);
+		if (rc <= 0)
+			goto error;
+		return (int)buf;
+	error:
+		DBG("wf_lm87: Error reading LM87, retrying...\n");
+		if (++tries > 10) {
+			printk(KERN_ERR "wf_lm87: Error reading LM87 !\n");
+			return -EIO;
+		}
+		msleep(10);
+	}
+}
+
+static int wf_lm87_get(struct wf_sensor *sr, s32 *value)
+{
+	struct wf_lm87_sensor *lm = sr->priv;
+	s32 temp;
+
+	if (lm->i2c == NULL)
+		return -ENODEV;
+
+#define LM87_INT_TEMP		0x27
+
+	/* Read temperature register */
+	temp = wf_lm87_read_reg(lm->i2c, LM87_INT_TEMP);
+	if (temp < 0)
+		return temp;
+	*value = temp << 16;
+
+	return 0;
+}
+
+static void wf_lm87_release(struct wf_sensor *sr)
+{
+	struct wf_lm87_sensor *lm = wf_to_lm87(sr);
+
+	kfree(lm);
+}
+
+static struct wf_sensor_ops wf_lm87_ops = {
+	.get_value	= wf_lm87_get,
+	.release	= wf_lm87_release,
+	.owner		= THIS_MODULE,
+};
+
+static int wf_lm87_probe(struct i2c_client *client,
+			 const struct i2c_device_id *id)
+{	
+	struct wf_lm87_sensor *lm;
+	const char *name = NULL, *loc;
+	struct device_node *np = NULL;
+	int rc;
+
+	/*
+	 * The lm87 contains a whole pile of sensors, additionally,
+	 * the Xserve G5 has several lm87's. However, for now we only
+	 * care about the internal temperature sensor
+	 */
+	while ((np = of_get_next_child(client->dev.of_node, np)) != NULL) {
+		if (strcmp(np->name, "int-temp"))
+			continue;
+		loc = of_get_property(np, "location", NULL);
+		if (!loc)
+			continue;
+		if (strstr(loc, "DIMM"))
+			name = "dimms-temp";
+		else if (strstr(loc, "Processors"))
+			name = "between-cpus-temp";
+		if (name) {
+			of_node_put(np);
+			break;
+		}
+	}
+	if (!name) {
+		pr_warning("wf_lm87: Unsupported sensor %s\n",
+			   client->dev.of_node->full_name);
+		return -ENODEV;
+	}
+
+	lm = kzalloc(sizeof(struct wf_lm87_sensor), GFP_KERNEL);
+	if (lm == NULL)
+		return -ENODEV;
+
+	lm->i2c = client;
+	lm->sens.name = name;
+	lm->sens.ops = &wf_lm87_ops;
+	lm->sens.priv = lm;
+	i2c_set_clientdata(client, lm);
+
+	rc = wf_register_sensor(&lm->sens);
+	if (rc)
+		kfree(lm);
+	return rc;
+}
+
+static int wf_lm87_remove(struct i2c_client *client)
+{
+	struct wf_lm87_sensor *lm = i2c_get_clientdata(client);
+
+	DBG("wf_lm87: i2c detatch called for %s\n", lm->sens.name);
+
+	/* Mark client detached */
+	lm->i2c = NULL;
+
+	/* release sensor */
+	wf_unregister_sensor(&lm->sens);
+
+	return 0;
+}
+
+static const struct i2c_device_id wf_lm87_id[] = {
+	{ "MAC,lm87cimt", 0 },
+	{ }
+};
+MODULE_DEVICE_TABLE(i2c, wf_lm87_id);
+
+static struct i2c_driver wf_lm87_driver = {
+	.driver = {
+		.name	= "wf_lm87",
+	},
+	.probe		= wf_lm87_probe,
+	.remove		= wf_lm87_remove,
+	.id_table	= wf_lm87_id,
+};
+
+static int __init wf_lm87_sensor_init(void)
+{
+	/* We only support this on the Xserve */
+	if (!of_machine_is_compatible("RackMac3,1"))
+		return -ENODEV;
+
+	return i2c_add_driver(&wf_lm87_driver);
+}
+
+static void __exit wf_lm87_sensor_exit(void)
+{
+	i2c_del_driver(&wf_lm87_driver);
+}
+
+
+module_init(wf_lm87_sensor_init);
+module_exit(wf_lm87_sensor_exit);
+
+MODULE_AUTHOR("Benjamin Herrenschmidt <benh@kernel.crashing.org>");
+MODULE_DESCRIPTION("LM87 sensor objects for PowerMacs thermal control");
+MODULE_LICENSE("GPL");
+
-- 
1.7.9.5

  parent reply	other threads:[~2012-04-19  8:55 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-04-19  8:16 [PATCH 00/15] PowerMac i2c API conversions & windfarm updates Benjamin Herrenschmidt
2012-04-19  8:16 ` [PATCH 01/15] i2c/powermac: Register i2c devices from device-tree Benjamin Herrenschmidt
2012-04-19  8:16 ` [PATCH 02/15] powerpc/pmac: Convert therm_adt746x to new i2c probing Benjamin Herrenschmidt
2012-04-19  8:16 ` [PATCH 03/15] powerpc/pmac: Convert windfarm_lm75 " Benjamin Herrenschmidt
2012-04-19  8:16 ` [PATCH 04/15] powerpc/pmac: Convert windfarm_max6690 " Benjamin Herrenschmidt
2012-04-19  8:16 ` [PATCH 05/15] powerpc/pmac: Convert windfarm_smu_sat " Benjamin Herrenschmidt
2012-04-19  8:16 ` [PATCH 06/15] powerpc/windfarm: const'ify and add "priv" field to controls & sensors Benjamin Herrenschmidt
2012-04-19  8:16 ` [PATCH 07/15] powerpc/pmac: Don't add_timer() twice Benjamin Herrenschmidt
2012-04-19  8:16 ` [PATCH 08/15] powerpc/windfarm: Remove spurrious sysfs_attr_init() Benjamin Herrenschmidt
2012-04-19  8:16 ` [PATCH 09/15] powerpc/windfarm: Improve display of fan speeds in sysfs Benjamin Herrenschmidt
2012-04-19  8:16 ` [PATCH 10/15] powerpc/windfarm: Add useful accessors Benjamin Herrenschmidt
2012-04-19  8:16 ` [PATCH 11/15] powerpc/windfarm: Add ad7417 sensor Benjamin Herrenschmidt
2012-04-19  8:16 ` Benjamin Herrenschmidt [this message]
2012-04-19  8:16 ` [PATCH 13/15] powerpc/windfarm: Updates to lm75 and max6690 sensors Benjamin Herrenschmidt
2012-04-19  8:16 ` [PATCH 14/15] powerpc/windfarm: Add Fan Control Unit controls for G5s Benjamin Herrenschmidt
2012-04-19  8:16 ` [PATCH 15/15] powerpc/powermac: New windfarm driver for PowerMac G5 (AGP) and Xserve G5 Benjamin Herrenschmidt
     [not found] ` <1334823416-9138-2-git-send-email-benh__33169.052625499$1334826821$gmane$org@kernel.crashing.org>
2012-04-19  9:34   ` [PATCH 01/15] i2c/powermac: Register i2c devices from device-tree Andreas Schwab
2012-06-09 13:58   ` Andreas Schwab
2012-06-09 22:11     ` Benjamin Herrenschmidt
2012-06-09 22:30       ` Andreas Schwab
2012-06-09 22:36         ` Benjamin Herrenschmidt
2012-06-09 22:59           ` Andreas Schwab
2012-06-09 23:10             ` Benjamin Herrenschmidt
2012-06-10  7:13               ` Andreas Schwab
2012-06-10  7:23                 ` Benjamin Herrenschmidt
2012-06-10 11:35                   ` Andreas Schwab
2012-06-18  1:27                   ` Benjamin Herrenschmidt
2012-06-18  2:03     ` Benjamin Herrenschmidt
2012-06-18  7:30       ` [PATCH] sound/aoa: remove i2c attach_adapter method Andreas Schwab
2012-04-19  9:37 ` [PATCH 00/15] PowerMac i2c API conversions & windfarm updates Jean Delvare
2012-04-19  9:36   ` Christian Kujau
2012-04-19 20:59   ` Benjamin Herrenschmidt
     [not found] ` <20120419113723.03a24d46__2279.25503063506$1334829915$gmane$org@endymion.delvare>
2012-04-19 10:11   ` Andreas Schwab
2012-04-19 11:02     ` Jean Delvare
     [not found]   ` <m27gxc2fqq.fsf__16075.0973890119$1334830355$gmane$org@igel.home>
2012-04-19 10:14     ` Andreas Schwab
     [not found]     ` <m239802flw.fsf__48316.0902433612$1334830569$gmane$org@igel.home>
2012-04-19 10:19       ` Andreas Schwab
     [not found] ` <1334823416-9138-3-git-send-email-benh__10691.3206204355$1334826366$gmane$org@kernel.crashing.org>
2012-04-19 13:10   ` [PATCH 02/15] powerpc/pmac: Convert therm_adt746x to new i2c probing Andreas Schwab

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1334823416-9138-13-git-send-email-benh@kernel.crashing.org \
    --to=benh@kernel.crashing.org \
    --cc=khali@linux-fr.org \
    --cc=linuxppc-dev@ozlabs.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.