aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/dme1737.c
diff options
context:
space:
mode:
authorJuerg Haefliger <juergh@gmail.com>2007-10-02 00:20:28 -0400
committerMark M. Hoffman <mhoffman@lightlink.com>2007-10-10 22:24:08 -0400
commit67e2f3285ecff8ceaa555e7614d1603b76e09b95 (patch)
tree1c8dd3a212e9a45aa367247293ca986fba797316 /drivers/hwmon/dme1737.c
parentb237eb25d8e81c31ba561990445cfe4448c9de14 (diff)
hwmon: (dme1737) group functions logically
Move functions to group them logically. Device and I2C functions go in separate places. No functional changes (really!). Signed-off-by: Juerg Haefliger <juergh at gmail.com> Acked-by: Jean Delvare <khali@linux-fr.org> Signed-off-by: Mark M. Hoffman <mhoffman@lightlink.com>
Diffstat (limited to 'drivers/hwmon/dme1737.c')
-rw-r--r--drivers/hwmon/dme1737.c106
1 files changed, 58 insertions, 48 deletions
diff --git a/drivers/hwmon/dme1737.c b/drivers/hwmon/dme1737.c
index cef662c6af9d..63cee3b6f9bf 100644
--- a/drivers/hwmon/dme1737.c
+++ b/drivers/hwmon/dme1737.c
@@ -1697,58 +1697,11 @@ static inline void dme1737_sio_outb(int sio_cip, int reg, int val)
1697 outb(val, sio_cip + 1); 1697 outb(val, sio_cip + 1);
1698} 1698}
1699 1699
1700static int dme1737_i2c_get_features(int sio_cip, struct dme1737_data *data)
1701{
1702 int err = 0, reg;
1703 u16 addr;
1704
1705 dme1737_sio_enter(sio_cip);
1706
1707 /* Check device ID
1708 * The DME1737 can return either 0x78 or 0x77 as its device ID. */
1709 reg = dme1737_sio_inb(sio_cip, 0x20);
1710 if (!(reg == 0x77 || reg == 0x78)) {
1711 err = -ENODEV;
1712 goto exit;
1713 }
1714
1715 /* Select logical device A (runtime registers) */
1716 dme1737_sio_outb(sio_cip, 0x07, 0x0a);
1717
1718 /* Get the base address of the runtime registers */
1719 if (!(addr = (dme1737_sio_inb(sio_cip, 0x60) << 8) |
1720 dme1737_sio_inb(sio_cip, 0x61))) {
1721 err = -ENODEV;
1722 goto exit;
1723 }
1724
1725 /* Read the runtime registers to determine which optional features
1726 * are enabled and available. Bits [3:2] of registers 0x43-0x46 are set
1727 * to '10' if the respective feature is enabled. */
1728 if ((inb(addr + 0x43) & 0x0c) == 0x08) { /* fan6 */
1729 data->has_fan |= (1 << 5);
1730 }
1731 if ((inb(addr + 0x44) & 0x0c) == 0x08) { /* pwm6 */
1732 data->has_pwm |= (1 << 5);
1733 }
1734 if ((inb(addr + 0x45) & 0x0c) == 0x08) { /* fan5 */
1735 data->has_fan |= (1 << 4);
1736 }
1737 if ((inb(addr + 0x46) & 0x0c) == 0x08) { /* pwm5 */
1738 data->has_pwm |= (1 << 4);
1739 }
1740
1741exit:
1742 dme1737_sio_exit(sio_cip);
1743
1744 return err;
1745}
1746
1747/* --------------------------------------------------------------------- 1700/* ---------------------------------------------------------------------
1748 * Device detection, registration and initialization 1701 * Device detection, registration and initialization
1749 * --------------------------------------------------------------------- */ 1702 * --------------------------------------------------------------------- */
1750 1703
1751static struct i2c_driver dme1737_i2c_driver; 1704static int dme1737_i2c_get_features(int, struct dme1737_data*);
1752 1705
1753static void dme1737_chmod_file(struct device *dev, 1706static void dme1737_chmod_file(struct device *dev,
1754 struct attribute *attr, mode_t mode) 1707 struct attribute *attr, mode_t mode)
@@ -1967,6 +1920,59 @@ static int dme1737_init_device(struct device *dev)
1967 return 0; 1920 return 0;
1968} 1921}
1969 1922
1923/* ---------------------------------------------------------------------
1924 * I2C device detection and registration
1925 * --------------------------------------------------------------------- */
1926
1927static struct i2c_driver dme1737_i2c_driver;
1928
1929static int dme1737_i2c_get_features(int sio_cip, struct dme1737_data *data)
1930{
1931 int err = 0, reg;
1932 u16 addr;
1933
1934 dme1737_sio_enter(sio_cip);
1935
1936 /* Check device ID
1937 * The DME1737 can return either 0x78 or 0x77 as its device ID. */
1938 reg = dme1737_sio_inb(sio_cip, 0x20);
1939 if (!(reg == 0x77 || reg == 0x78)) {
1940 err = -ENODEV;
1941 goto exit;
1942 }
1943
1944 /* Select logical device A (runtime registers) */
1945 dme1737_sio_outb(sio_cip, 0x07, 0x0a);
1946
1947 /* Get the base address of the runtime registers */
1948 if (!(addr = (dme1737_sio_inb(sio_cip, 0x60) << 8) |
1949 dme1737_sio_inb(sio_cip, 0x61))) {
1950 err = -ENODEV;
1951 goto exit;
1952 }
1953
1954 /* Read the runtime registers to determine which optional features
1955 * are enabled and available. Bits [3:2] of registers 0x43-0x46 are set
1956 * to '10' if the respective feature is enabled. */
1957 if ((inb(addr + 0x43) & 0x0c) == 0x08) { /* fan6 */
1958 data->has_fan |= (1 << 5);
1959 }
1960 if ((inb(addr + 0x44) & 0x0c) == 0x08) { /* pwm6 */
1961 data->has_pwm |= (1 << 5);
1962 }
1963 if ((inb(addr + 0x45) & 0x0c) == 0x08) { /* fan5 */
1964 data->has_fan |= (1 << 4);
1965 }
1966 if ((inb(addr + 0x46) & 0x0c) == 0x08) { /* pwm5 */
1967 data->has_pwm |= (1 << 4);
1968 }
1969
1970exit:
1971 dme1737_sio_exit(sio_cip);
1972
1973 return err;
1974}
1975
1970static int dme1737_i2c_detect(struct i2c_adapter *adapter, int address, 1976static int dme1737_i2c_detect(struct i2c_adapter *adapter, int address,
1971 int kind) 1977 int kind)
1972{ 1978{
@@ -2087,6 +2093,10 @@ static struct i2c_driver dme1737_i2c_driver = {
2087 .detach_client = dme1737_i2c_detach_client, 2093 .detach_client = dme1737_i2c_detach_client,
2088}; 2094};
2089 2095
2096/* ---------------------------------------------------------------------
2097 * Module initialization and cleanup
2098 * --------------------------------------------------------------------- */
2099
2090static int __init dme1737_init(void) 2100static int __init dme1737_init(void)
2091{ 2101{
2092 return i2c_add_driver(&dme1737_i2c_driver); 2102 return i2c_add_driver(&dme1737_i2c_driver);