mirror of
https://github.com/team-infusion-developers/android_kernel_samsung_msm8976.git
synced 2024-11-07 04:09:21 +00:00
hwmon: (f75375s) Allow setting up fans with platform_data
Allow initializing fans on systems where BIOS does not do that by default. - define f75375s_platform_data in new file f75375s.h - if platform_data was provided, set fans accordingly in f75375_init() - split set_pwm_enable() to a sysfs callback and directly usable set_pwm_enable_direct() Signed-off-by: Riku Voipio <riku.voipio@movial.fi> Signed-off-by: Mark M. Hoffman <mhoffman@lightlink.com>
This commit is contained in:
parent
620c142db2
commit
ff312d07c2
2 changed files with 56 additions and 7 deletions
|
@ -34,6 +34,7 @@
|
|||
#include <linux/i2c.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/f75375s.h>
|
||||
|
||||
/* Addresses to scan */
|
||||
static unsigned short normal_i2c[] = { 0x2d, 0x2e, I2C_CLIENT_END };
|
||||
|
@ -286,19 +287,14 @@ static ssize_t show_pwm_enable(struct device *dev, struct device_attribute
|
|||
return sprintf(buf, "%d\n", data->pwm_enable[nr]);
|
||||
}
|
||||
|
||||
static ssize_t set_pwm_enable(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static int set_pwm_enable_direct(struct i2c_client *client, int nr, int val)
|
||||
{
|
||||
int nr = to_sensor_dev_attr(attr)->index;
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct f75375_data *data = i2c_get_clientdata(client);
|
||||
int val = simple_strtoul(buf, NULL, 10);
|
||||
u8 fanmode;
|
||||
|
||||
if (val < 0 || val > 4)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&data->update_lock);
|
||||
fanmode = f75375_read8(client, F75375_REG_FAN_TIMER);
|
||||
fanmode = ~(3 << FAN_CTRL_MODE(nr));
|
||||
|
||||
|
@ -320,8 +316,22 @@ static ssize_t set_pwm_enable(struct device *dev, struct device_attribute *attr,
|
|||
}
|
||||
f75375_write8(client, F75375_REG_FAN_TIMER, fanmode);
|
||||
data->pwm_enable[nr] = val;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t set_pwm_enable(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
int nr = to_sensor_dev_attr(attr)->index;
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct f75375_data *data = i2c_get_clientdata(client);
|
||||
int val = simple_strtoul(buf, NULL, 10);
|
||||
int err = 0;
|
||||
|
||||
mutex_lock(&data->update_lock);
|
||||
err = set_pwm_enable_direct(client, nr, val);
|
||||
mutex_unlock(&data->update_lock);
|
||||
return count;
|
||||
return err ? err : count;
|
||||
}
|
||||
|
||||
static ssize_t set_pwm_mode(struct device *dev, struct device_attribute *attr,
|
||||
|
@ -604,9 +614,24 @@ static int f75375_detach_client(struct i2c_client *client)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void f75375_init(struct i2c_client *client, struct f75375_data *data,
|
||||
struct f75375s_platform_data *f75375s_pdata)
|
||||
{
|
||||
int nr;
|
||||
set_pwm_enable_direct(client, 0, f75375s_pdata->pwm_enable[0]);
|
||||
set_pwm_enable_direct(client, 1, f75375s_pdata->pwm_enable[1]);
|
||||
for (nr = 0; nr < 2; nr++) {
|
||||
data->pwm[nr] = SENSORS_LIMIT(f75375s_pdata->pwm[nr], 0, 255);
|
||||
f75375_write8(client, F75375_REG_FAN_PWM_DUTY(nr),
|
||||
data->pwm[nr]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static int f75375_probe(struct i2c_client *client)
|
||||
{
|
||||
struct f75375_data *data = i2c_get_clientdata(client);
|
||||
struct f75375s_platform_data *f75375s_pdata = client->dev.platform_data;
|
||||
int err;
|
||||
|
||||
if (!i2c_check_functionality(client->adapter,
|
||||
|
@ -637,6 +662,9 @@ static int f75375_probe(struct i2c_client *client)
|
|||
goto exit_remove;
|
||||
}
|
||||
|
||||
if (f75375s_pdata != NULL)
|
||||
f75375_init(client, data, f75375s_pdata);
|
||||
|
||||
return 0;
|
||||
|
||||
exit_remove:
|
||||
|
|
21
include/linux/f75375s.h
Normal file
21
include/linux/f75375s.h
Normal file
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
* f75375s.h - platform data structure for f75375s sensor
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*
|
||||
* Copyright (C) 2007, Riku Voipio <riku.voipio@iki.fi>
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_F75375S_H
|
||||
#define __LINUX_F75375S_H
|
||||
|
||||
/* We want to set fans spinning on systems where there is no
|
||||
* BIOS to do that for us */
|
||||
struct f75375s_platform_data {
|
||||
u8 pwm[2];
|
||||
u8 pwm_enable[2];
|
||||
};
|
||||
|
||||
#endif /* __LINUX_F75375S_H */
|
Loading…
Reference in a new issue