Blame view

drivers/macintosh/windfarm_max6690_sensor.c 3.23 KB
ddceed9d1   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-only
ac171c466   Benjamin Herrenschmidt   [PATCH] powerpc: ...
2
3
4
5
  /*
   * Windfarm PowerMac thermal control.  MAX6690 sensor.
   *
   * Copyright (C) 2005 Paul Mackerras, IBM Corp. <paulus@samba.org>
ac171c466   Benjamin Herrenschmidt   [PATCH] powerpc: ...
6
7
8
9
10
11
12
   */
  #include <linux/types.h>
  #include <linux/errno.h>
  #include <linux/kernel.h>
  #include <linux/init.h>
  #include <linux/slab.h>
  #include <linux/i2c.h>
ac171c466   Benjamin Herrenschmidt   [PATCH] powerpc: ...
13
14
15
16
  #include <asm/prom.h>
  #include <asm/pmac_low_i2c.h>
  
  #include "windfarm.h"
22b6d2ea3   Benjamin Herrenschmidt   powerpc/pmac: Con...
17
  #define VERSION "1.0"
ac171c466   Benjamin Herrenschmidt   [PATCH] powerpc: ...
18
19
20
21
22
23
24
25
26
  
  /* This currently only exports the external temperature sensor,
     since that's all the control loops need. */
  
  /* Some MAX6690 register numbers */
  #define MAX6690_INTERNAL_TEMP	0
  #define MAX6690_EXTERNAL_TEMP	1
  
  struct wf_6690_sensor {
351ca3e31   Jean Delvare   windfarm: Convert...
27
  	struct i2c_client	*i2c;
ac171c466   Benjamin Herrenschmidt   [PATCH] powerpc: ...
28
29
30
31
  	struct wf_sensor	sens;
  };
  
  #define wf_to_6690(x)	container_of((x), struct wf_6690_sensor, sens)
ac171c466   Benjamin Herrenschmidt   [PATCH] powerpc: ...
32
33
34
35
36
  
  static int wf_max6690_get(struct wf_sensor *sr, s32 *value)
  {
  	struct wf_6690_sensor *max = wf_to_6690(sr);
  	s32 data;
351ca3e31   Jean Delvare   windfarm: Convert...
37
  	if (max->i2c == NULL)
ac171c466   Benjamin Herrenschmidt   [PATCH] powerpc: ...
38
39
40
  		return -ENODEV;
  
  	/* chip gets initialized by firmware */
351ca3e31   Jean Delvare   windfarm: Convert...
41
  	data = i2c_smbus_read_byte_data(max->i2c, MAX6690_EXTERNAL_TEMP);
ac171c466   Benjamin Herrenschmidt   [PATCH] powerpc: ...
42
43
44
45
46
47
48
49
50
  	if (data < 0)
  		return data;
  	*value = data << 16;
  	return 0;
  }
  
  static void wf_max6690_release(struct wf_sensor *sr)
  {
  	struct wf_6690_sensor *max = wf_to_6690(sr);
ac171c466   Benjamin Herrenschmidt   [PATCH] powerpc: ...
51
52
  	kfree(max);
  }
de854e54d   Julia Lawall   powerpc/macintosh...
53
  static const struct wf_sensor_ops wf_max6690_ops = {
ac171c466   Benjamin Herrenschmidt   [PATCH] powerpc: ...
54
55
56
57
  	.get_value	= wf_max6690_get,
  	.release	= wf_max6690_release,
  	.owner		= THIS_MODULE,
  };
351ca3e31   Jean Delvare   windfarm: Convert...
58
59
  static int wf_max6690_probe(struct i2c_client *client,
  			    const struct i2c_device_id *id)
ac171c466   Benjamin Herrenschmidt   [PATCH] powerpc: ...
60
  {
22b6d2ea3   Benjamin Herrenschmidt   powerpc/pmac: Con...
61
  	const char *name, *loc;
ac171c466   Benjamin Herrenschmidt   [PATCH] powerpc: ...
62
  	struct wf_6690_sensor *max;
351ca3e31   Jean Delvare   windfarm: Convert...
63
  	int rc;
ac171c466   Benjamin Herrenschmidt   [PATCH] powerpc: ...
64

22b6d2ea3   Benjamin Herrenschmidt   powerpc/pmac: Con...
65
66
67
68
69
70
  	loc = of_get_property(client->dev.of_node, "hwsensor-location", NULL);
  	if (!loc) {
  		dev_warn(&client->dev, "Missing hwsensor-location property!
  ");
  		return -ENXIO;
  	}
d839ba2ab   Benjamin Herrenschmidt   powerpc/windfarm:...
71
72
73
74
75
  	/*
  	 * We only expose the external temperature register for
  	 * now as this is all we need for our control loops
  	 */
  	if (!strcmp(loc, "BACKSIDE") || !strcmp(loc, "SYS CTRLR AMBIENT"))
22b6d2ea3   Benjamin Herrenschmidt   powerpc/pmac: Con...
76
77
78
79
80
81
82
  		name = "backside-temp";
  	else if (!strcmp(loc, "NB Ambient"))
  		name = "north-bridge-temp";
  	else if (!strcmp(loc, "GPU Ambient"))
  		name = "gpu-temp";
  	else
  		return -ENXIO;
ac171c466   Benjamin Herrenschmidt   [PATCH] powerpc: ...
83
84
  	max = kzalloc(sizeof(struct wf_6690_sensor), GFP_KERNEL);
  	if (max == NULL) {
351ca3e31   Jean Delvare   windfarm: Convert...
85
86
87
88
89
90
91
  		printk(KERN_ERR "windfarm: Couldn't create MAX6690 sensor: "
  		       "no memory
  ");
  		return -ENOMEM;
  	}
  
  	max->i2c = client;
8bb61fe1d   Geert Uytterhoeven   powerpc/windfarm:...
92
  	max->sens.name = name;
351ca3e31   Jean Delvare   windfarm: Convert...
93
94
95
96
  	max->sens.ops = &wf_max6690_ops;
  	i2c_set_clientdata(client, max);
  
  	rc = wf_register_sensor(&max->sens);
22b6d2ea3   Benjamin Herrenschmidt   powerpc/pmac: Con...
97
  	if (rc)
351ca3e31   Jean Delvare   windfarm: Convert...
98
  		kfree(max);
351ca3e31   Jean Delvare   windfarm: Convert...
99
100
  	return rc;
  }
351ca3e31   Jean Delvare   windfarm: Convert...
101
  static int wf_max6690_remove(struct i2c_client *client)
ac171c466   Benjamin Herrenschmidt   [PATCH] powerpc: ...
102
  {
351ca3e31   Jean Delvare   windfarm: Convert...
103
  	struct wf_6690_sensor *max = i2c_get_clientdata(client);
ac171c466   Benjamin Herrenschmidt   [PATCH] powerpc: ...
104

351ca3e31   Jean Delvare   windfarm: Convert...
105
  	max->i2c = NULL;
ac171c466   Benjamin Herrenschmidt   [PATCH] powerpc: ...
106
107
108
109
  	wf_unregister_sensor(&max->sens);
  
  	return 0;
  }
351ca3e31   Jean Delvare   windfarm: Convert...
110
  static const struct i2c_device_id wf_max6690_id[] = {
22b6d2ea3   Benjamin Herrenschmidt   powerpc/pmac: Con...
111
  	{ "MAC,max6690", 0 },
351ca3e31   Jean Delvare   windfarm: Convert...
112
113
  	{ }
  };
22b6d2ea3   Benjamin Herrenschmidt   powerpc/pmac: Con...
114
  MODULE_DEVICE_TABLE(i2c, wf_max6690_id);
351ca3e31   Jean Delvare   windfarm: Convert...
115

bcf3588d8   Wolfram Sang   macintosh: windfa...
116
117
118
119
120
  static const struct of_device_id wf_max6690_of_id[] = {
  	{ .compatible = "max6690", },
  	{ }
  };
  MODULE_DEVICE_TABLE(of, wf_max6690_of_id);
351ca3e31   Jean Delvare   windfarm: Convert...
121
122
123
  static struct i2c_driver wf_max6690_driver = {
  	.driver = {
  		.name		= "wf_max6690",
bcf3588d8   Wolfram Sang   macintosh: windfa...
124
  		.of_match_table = wf_max6690_of_id,
351ca3e31   Jean Delvare   windfarm: Convert...
125
  	},
351ca3e31   Jean Delvare   windfarm: Convert...
126
127
128
129
  	.probe		= wf_max6690_probe,
  	.remove		= wf_max6690_remove,
  	.id_table	= wf_max6690_id,
  };
f7fb862b8   Wei Yongjun   powerpc/windfarm:...
130
  module_i2c_driver(wf_max6690_driver);
ac171c466   Benjamin Herrenschmidt   [PATCH] powerpc: ...
131
132
133
134
  
  MODULE_AUTHOR("Paul Mackerras <paulus@samba.org>");
  MODULE_DESCRIPTION("MAX6690 sensor objects for PowerMac thermal control");
  MODULE_LICENSE("GPL");