• Home
  • Raw
  • Download

Lines Matching +full:pulses +full:- +full:per +full:- +full:revolution

2  * g762 - Driver for the Global Mixed-mode Technology Inc. fan speed
14 * http://natisbad.org/NAS/refs/GMT_EDS-762_763-080710-0.2.pdf
26 * http://www.gmt.com.tw/product/datasheet/EDS-762_3.pdf
49 #include <linux/hwmon-sysfs.h>
80 #define G762_REG_FAN_CMD1_FAN_MODE 0x10 /* fan mode: closed/open-loop */
84 #define G762_REG_FAN_CMD1_PULSE_PER_REV 0x01 /* pulse per fan revolution */
104 /* Register data is read (and cached) at most once per second. */
108 * Extract pulse count per fan revolution value (2 or 4) from given
144 u8 set_cnt; /* controls fan rotation speed in closed-loop mode */
151 u8 set_out; /* controls fan rotation speed in open-loop mode */
152 u8 fan_cmd1; /* 0: FG_PLS_ID0 FG pulses count per revolution
153 * 0: 2 counts per revolution
154 * 1: 4 counts per revolution
162 * 4: FAN_MODE 1:closed-loop, 0:open-loop
167 u8 fan_cmd2; /* 0,1: FAN_STARTV 0,1,2,3 -> 0,32,64,96 dac_code
208 /* helper to grab and cache data, at most one time per second */
212 struct i2c_client *client = data->client; in g762_update_client()
215 mutex_lock(&data->update_lock); in g762_update_client()
216 if (time_before(jiffies, data->last_updated + G762_UPDATE_INTERVAL) && in g762_update_client()
217 likely(data->valid)) in g762_update_client()
223 data->set_cnt = ret; in g762_update_client()
228 data->act_cnt = ret; in g762_update_client()
233 data->fan_sta = ret; in g762_update_client()
238 data->set_out = ret; in g762_update_client()
243 data->fan_cmd1 = ret; in g762_update_client()
248 data->fan_cmd2 = ret; in g762_update_client()
250 data->last_updated = jiffies; in g762_update_client()
251 data->valid = true; in g762_update_client()
253 mutex_unlock(&data->update_lock); in g762_update_client()
274 return -EINVAL; in do_set_clk_freq()
278 data->clk_freq = val; in do_set_clk_freq()
292 mutex_lock(&data->update_lock); in do_set_pwm_mode()
295 data->fan_cmd1 |= G762_REG_FAN_CMD1_OUT_MODE; in do_set_pwm_mode()
298 data->fan_cmd1 &= ~G762_REG_FAN_CMD1_OUT_MODE; in do_set_pwm_mode()
301 ret = -EINVAL; in do_set_pwm_mode()
304 ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD1, in do_set_pwm_mode()
305 data->fan_cmd1); in do_set_pwm_mode()
306 data->valid = false; in do_set_pwm_mode()
308 mutex_unlock(&data->update_lock); in do_set_pwm_mode()
322 mutex_lock(&data->update_lock); in do_set_fan_div()
325 data->fan_cmd1 &= ~G762_REG_FAN_CMD1_CLK_DIV_ID0; in do_set_fan_div()
326 data->fan_cmd1 &= ~G762_REG_FAN_CMD1_CLK_DIV_ID1; in do_set_fan_div()
329 data->fan_cmd1 |= G762_REG_FAN_CMD1_CLK_DIV_ID0; in do_set_fan_div()
330 data->fan_cmd1 &= ~G762_REG_FAN_CMD1_CLK_DIV_ID1; in do_set_fan_div()
333 data->fan_cmd1 &= ~G762_REG_FAN_CMD1_CLK_DIV_ID0; in do_set_fan_div()
334 data->fan_cmd1 |= G762_REG_FAN_CMD1_CLK_DIV_ID1; in do_set_fan_div()
337 data->fan_cmd1 |= G762_REG_FAN_CMD1_CLK_DIV_ID0; in do_set_fan_div()
338 data->fan_cmd1 |= G762_REG_FAN_CMD1_CLK_DIV_ID1; in do_set_fan_div()
341 ret = -EINVAL; in do_set_fan_div()
344 ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD1, in do_set_fan_div()
345 data->fan_cmd1); in do_set_fan_div()
346 data->valid = false; in do_set_fan_div()
348 mutex_unlock(&data->update_lock); in do_set_fan_div()
362 mutex_lock(&data->update_lock); in do_set_fan_gear_mode()
365 data->fan_cmd2 &= ~G762_REG_FAN_CMD2_GEAR_MODE_0; in do_set_fan_gear_mode()
366 data->fan_cmd2 &= ~G762_REG_FAN_CMD2_GEAR_MODE_1; in do_set_fan_gear_mode()
369 data->fan_cmd2 |= G762_REG_FAN_CMD2_GEAR_MODE_0; in do_set_fan_gear_mode()
370 data->fan_cmd2 &= ~G762_REG_FAN_CMD2_GEAR_MODE_1; in do_set_fan_gear_mode()
373 data->fan_cmd2 &= ~G762_REG_FAN_CMD2_GEAR_MODE_0; in do_set_fan_gear_mode()
374 data->fan_cmd2 |= G762_REG_FAN_CMD2_GEAR_MODE_1; in do_set_fan_gear_mode()
377 ret = -EINVAL; in do_set_fan_gear_mode()
380 ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD2, in do_set_fan_gear_mode()
381 data->fan_cmd2); in do_set_fan_gear_mode()
382 data->valid = false; in do_set_fan_gear_mode()
384 mutex_unlock(&data->update_lock); in do_set_fan_gear_mode()
389 /* Set number of fan pulses per revolution. Accepts either 2 or 4. */
398 mutex_lock(&data->update_lock); in do_set_fan_pulses()
401 data->fan_cmd1 &= ~G762_REG_FAN_CMD1_PULSE_PER_REV; in do_set_fan_pulses()
404 data->fan_cmd1 |= G762_REG_FAN_CMD1_PULSE_PER_REV; in do_set_fan_pulses()
407 ret = -EINVAL; in do_set_fan_pulses()
410 ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD1, in do_set_fan_pulses()
411 data->fan_cmd1); in do_set_fan_pulses()
412 data->valid = false; in do_set_fan_pulses()
414 mutex_unlock(&data->update_lock); in do_set_fan_pulses()
419 /* Set fan mode. Accepts either 1 (open-loop) or 2 (closed-loop). */
428 mutex_lock(&data->update_lock); in do_set_pwm_enable()
431 data->fan_cmd1 |= G762_REG_FAN_CMD1_FAN_MODE; in do_set_pwm_enable()
434 data->fan_cmd1 &= ~G762_REG_FAN_CMD1_FAN_MODE; in do_set_pwm_enable()
440 * value of 254 if it is 255 when switching to open-loop. in do_set_pwm_enable()
442 if (data->set_cnt == 0xff) in do_set_pwm_enable()
443 i2c_smbus_write_byte_data(data->client, in do_set_pwm_enable()
447 ret = -EINVAL; in do_set_pwm_enable()
451 ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD1, in do_set_pwm_enable()
452 data->fan_cmd1); in do_set_pwm_enable()
453 data->valid = false; in do_set_pwm_enable()
455 mutex_unlock(&data->update_lock); in do_set_pwm_enable()
469 mutex_lock(&data->update_lock); in do_set_pwm_polarity()
472 data->fan_cmd1 &= ~G762_REG_FAN_CMD1_PWM_POLARITY; in do_set_pwm_polarity()
475 data->fan_cmd1 |= G762_REG_FAN_CMD1_PWM_POLARITY; in do_set_pwm_polarity()
478 ret = -EINVAL; in do_set_pwm_polarity()
481 ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD1, in do_set_pwm_polarity()
482 data->fan_cmd1); in do_set_pwm_polarity()
483 data->valid = false; in do_set_pwm_polarity()
485 mutex_unlock(&data->update_lock); in do_set_pwm_polarity()
492 * 255 (full speed). This only makes sense in open-loop mode.
497 struct i2c_client *client = data->client; in do_set_pwm()
501 return -EINVAL; in do_set_pwm()
503 mutex_lock(&data->update_lock); in do_set_pwm()
505 data->valid = false; in do_set_pwm()
506 mutex_unlock(&data->update_lock); in do_set_pwm()
512 * Set fan RPM value. Can be called both in closed and open-loop mode
513 * but effect will only be seen after closed-loop mode is configured.
523 mutex_lock(&data->update_lock); in do_set_fan_target()
524 data->set_cnt = cnt_from_rpm(val, data->clk_freq, in do_set_fan_target()
525 G762_PULSE_FROM_REG(data->fan_cmd1), in do_set_fan_target()
526 G762_CLKDIV_FROM_REG(data->fan_cmd1), in do_set_fan_target()
527 G762_GEARMULT_FROM_REG(data->fan_cmd2)); in do_set_fan_target()
528 ret = i2c_smbus_write_byte_data(data->client, G762_REG_SET_CNT, in do_set_fan_target()
529 data->set_cnt); in do_set_fan_target()
530 data->valid = false; in do_set_fan_target()
531 mutex_unlock(&data->update_lock); in do_set_fan_target()
545 mutex_lock(&data->update_lock); in do_set_fan_startv()
548 data->fan_cmd2 &= ~G762_REG_FAN_CMD2_FAN_STARTV_0; in do_set_fan_startv()
549 data->fan_cmd2 &= ~G762_REG_FAN_CMD2_FAN_STARTV_1; in do_set_fan_startv()
552 data->fan_cmd2 |= G762_REG_FAN_CMD2_FAN_STARTV_0; in do_set_fan_startv()
553 data->fan_cmd2 &= ~G762_REG_FAN_CMD2_FAN_STARTV_1; in do_set_fan_startv()
556 data->fan_cmd2 &= ~G762_REG_FAN_CMD2_FAN_STARTV_0; in do_set_fan_startv()
557 data->fan_cmd2 |= G762_REG_FAN_CMD2_FAN_STARTV_1; in do_set_fan_startv()
560 data->fan_cmd2 |= G762_REG_FAN_CMD2_FAN_STARTV_0; in do_set_fan_startv()
561 data->fan_cmd2 |= G762_REG_FAN_CMD2_FAN_STARTV_1; in do_set_fan_startv()
564 ret = -EINVAL; in do_set_fan_startv()
567 ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD2, in do_set_fan_startv()
568 data->fan_cmd2); in do_set_fan_startv()
569 data->valid = false; in do_set_fan_startv()
571 mutex_unlock(&data->update_lock); in do_set_fan_startv()
600 clk_disable_unprepare(g762->clk); in g762_of_clock_disable()
601 clk_put(g762->clk); in g762_of_clock_disable()
611 if (!client->dev.of_node) in g762_of_clock_enable()
614 clk = of_clk_get(client->dev.of_node, 0); in g762_of_clock_enable()
616 dev_err(&client->dev, "failed to get clock\n"); in g762_of_clock_enable()
622 dev_err(&client->dev, "failed to enable clock\n"); in g762_of_clock_enable()
627 ret = do_set_clk_freq(&client->dev, clk_freq); in g762_of_clock_enable()
629 dev_err(&client->dev, "invalid clock freq %lu\n", clk_freq); in g762_of_clock_enable()
634 data->clk = clk; in g762_of_clock_enable()
636 devm_add_action(&client->dev, g762_of_clock_disable, data); in g762_of_clock_enable()
656 if (of_property_read_u32(client->dev.of_node, pname, &pval)) in g762_of_prop_import_one()
659 dev_dbg(&client->dev, "found %s (%d)\n", pname, pval); in g762_of_prop_import_one()
660 ret = (*psetter)(&client->dev, pval); in g762_of_prop_import_one()
662 dev_err(&client->dev, "unable to set %s (%d)\n", pname, pval); in g762_of_prop_import_one()
671 if (!client->dev.of_node) in g762_of_prop_import()
707 struct g762_platform_data *pdata = dev_get_platdata(&client->dev); in g762_pdata_prop_import()
713 ret = do_set_fan_gear_mode(&client->dev, pdata->fan_gear_mode); in g762_pdata_prop_import()
717 ret = do_set_pwm_polarity(&client->dev, pdata->pwm_polarity); in g762_pdata_prop_import()
721 ret = do_set_fan_startv(&client->dev, pdata->fan_startv); in g762_pdata_prop_import()
725 return do_set_clk_freq(&client->dev, pdata->clk_freq); in g762_pdata_prop_import()
745 mutex_lock(&data->update_lock); in fan1_input_show()
747 if (data->fan_sta & G762_REG_FAN_STA_OOC) { in fan1_input_show()
748 rpm = rpm_from_cnt(data->act_cnt, data->clk_freq, in fan1_input_show()
749 G762_PULSE_FROM_REG(data->fan_cmd1), in fan1_input_show()
750 G762_CLKDIV_FROM_REG(data->fan_cmd1), in fan1_input_show()
751 G762_GEARMULT_FROM_REG(data->fan_cmd2)); in fan1_input_show()
753 mutex_unlock(&data->update_lock); in fan1_input_show()
771 !!(data->fan_cmd1 & G762_REG_FAN_CMD1_OUT_MODE)); in pwm1_mode_show()
782 return -EINVAL; in pwm1_mode_store()
803 return sprintf(buf, "%d\n", G762_CLKDIV_FROM_REG(data->fan_cmd1)); in fan1_div_show()
813 return -EINVAL; in fan1_div_store()
824 * of tachometer pulses per fan revolution.
834 return sprintf(buf, "%d\n", G762_PULSE_FROM_REG(data->fan_cmd1)); in fan1_pulses_show()
845 return -EINVAL; in fan1_pulses_store()
856 * (i.e. closed or open-loop).
862 * 1 : manual fan speed control enabled (use pwm[1-*]) (open-loop)
863 * 2+: automatic fan speed control enabled (use fan[1-*]_target) (closed-loop)
866 * and it is not emulated by g762 driver. -EINVAL is returned in this case.
877 (!!(data->fan_cmd1 & G762_REG_FAN_CMD1_FAN_MODE)) + 1); in pwm1_enable_show()
888 return -EINVAL; in pwm1_enable_store()
899 * (which affects fan speed) in open-loop mode. 0 stops the fan and 255
910 return sprintf(buf, "%d\n", data->set_out); in pwm1_show()
920 return -EINVAL; in pwm1_store()
931 * closed-loop mode. Speed is given as a RPM value; then the chip will regulate
932 * the fan speed using pulses from fan tachometer.
949 mutex_lock(&data->update_lock); in fan1_target_show()
950 rpm = rpm_from_cnt(data->set_cnt, data->clk_freq, in fan1_target_show()
951 G762_PULSE_FROM_REG(data->fan_cmd1), in fan1_target_show()
952 G762_CLKDIV_FROM_REG(data->fan_cmd1), in fan1_target_show()
953 G762_GEARMULT_FROM_REG(data->fan_cmd2)); in fan1_target_show()
954 mutex_unlock(&data->update_lock); in fan1_target_show()
967 return -EINVAL; in fan1_target_store()
985 return sprintf(buf, "%u\n", !!(data->fan_sta & G762_REG_FAN_STA_FAIL)); in fan1_fault_show()
1000 return sprintf(buf, "%u\n", !(data->fan_sta & G762_REG_FAN_STA_OOC)); in fan1_alarm_show()
1041 data->fan_cmd1 |= G762_REG_FAN_CMD1_DET_FAN_FAIL; in g762_fan_init()
1042 data->fan_cmd1 |= G762_REG_FAN_CMD1_DET_FAN_OOC; in g762_fan_init()
1043 data->valid = false; in g762_fan_init()
1045 return i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD1, in g762_fan_init()
1046 data->fan_cmd1); in g762_fan_init()
1051 struct device *dev = &client->dev; in g762_probe()
1056 if (!i2c_check_functionality(client->adapter, in g762_probe()
1058 return -ENODEV; in g762_probe()
1062 return -ENOMEM; in g762_probe()
1065 data->client = client; in g762_probe()
1066 mutex_init(&data->update_lock); in g762_probe()
1085 hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, in g762_probe()