Lines Matching full:fan

27  * FAN datasheet defines the formula for RPM calculations as RPM = 15/t-high.
79 * @fan: private data;
88 struct mlxreg_fan *fan; member
125 struct mlxreg_fan *fan = dev_get_drvdata(dev); in mlxreg_fan_read() local
133 tacho = &fan->tacho[channel]; in mlxreg_fan_read()
137 * Check FAN presence: FAN related bit in presence register is one, in mlxreg_fan_read()
138 * if FAN is physically connected, zero - otherwise. in mlxreg_fan_read()
140 if (tacho->prsnt && fan->tachos_per_drwr) { in mlxreg_fan_read()
141 err = regmap_read(fan->regmap, tacho->prsnt, &regval); in mlxreg_fan_read()
150 if (BIT(rol32(channel, tacho->shift) / fan->tachos_per_drwr) & in mlxreg_fan_read()
152 /* FAN is not connected - return zero for FAN speed. */ in mlxreg_fan_read()
158 err = regmap_read(fan->regmap, tacho->reg, &regval); in mlxreg_fan_read()
163 /* FAN is broken - return zero for FAN speed. */ in mlxreg_fan_read()
168 *val = MLXREG_FAN_GET_RPM(regval, fan->divider, in mlxreg_fan_read()
169 fan->samples); in mlxreg_fan_read()
173 err = regmap_read(fan->regmap, tacho->reg, &regval); in mlxreg_fan_read()
186 pwm = &fan->pwm[channel]; in mlxreg_fan_read()
189 err = regmap_read(fan->regmap, pwm->reg, &regval); in mlxreg_fan_read()
212 struct mlxreg_fan *fan = dev_get_drvdata(dev); in mlxreg_fan_write() local
222 pwm = &fan->pwm[channel]; in mlxreg_fan_write()
236 return regmap_write(fan->regmap, pwm->reg, val); in mlxreg_fan_write()
294 HWMON_CHANNEL_INFO(fan,
350 struct mlxreg_fan *fan = pwm->fan; in mlxreg_fan_get_cur_state() local
354 err = regmap_read(fan->regmap, pwm->reg, &regval); in mlxreg_fan_get_cur_state()
356 dev_err(fan->dev, "Failed to query PWM duty\n"); in mlxreg_fan_get_cur_state()
369 struct mlxreg_fan *fan = pwm->fan; in _mlxreg_fan_set_cur_state() local
380 err = regmap_write(fan->regmap, pwm->reg, in _mlxreg_fan_set_cur_state()
383 dev_err(fan->dev, "Failed to write PWM duty\n"); in _mlxreg_fan_set_cur_state()
402 static int mlxreg_fan_connect_verify(struct mlxreg_fan *fan, in mlxreg_fan_connect_verify() argument
408 err = regmap_read(fan->regmap, data->capability, &regval); in mlxreg_fan_connect_verify()
410 dev_err(fan->dev, "Failed to query capability register 0x%08x\n", in mlxreg_fan_connect_verify()
418 static int mlxreg_pwm_connect_verify(struct mlxreg_fan *fan, in mlxreg_pwm_connect_verify() argument
424 err = regmap_read(fan->regmap, data->reg, &regval); in mlxreg_pwm_connect_verify()
426 dev_err(fan->dev, "Failed to query pwm register 0x%08x\n", in mlxreg_pwm_connect_verify()
434 static int mlxreg_fan_speed_divider_get(struct mlxreg_fan *fan, in mlxreg_fan_speed_divider_get() argument
440 err = regmap_read(fan->regmap, data->capability, &regval); in mlxreg_fan_speed_divider_get()
442 dev_err(fan->dev, "Failed to query capability register 0x%08x\n", in mlxreg_fan_speed_divider_get()
454 fan->divider = regval * MLXREG_FAN_TACHO_DIV_MIN; in mlxreg_fan_speed_divider_get()
459 static int mlxreg_fan_config(struct mlxreg_fan *fan, in mlxreg_fan_config() argument
467 fan->samples = MLXREG_FAN_TACHO_SAMPLES_PER_PULSE_DEF; in mlxreg_fan_config()
468 fan->divider = MLXREG_FAN_TACHO_DIV_DEF; in mlxreg_fan_config()
472 dev_err(fan->dev, "too many tacho entries: %s\n", in mlxreg_fan_config()
478 err = mlxreg_fan_connect_verify(fan, data); in mlxreg_fan_config()
487 fan->tacho[tacho_num].reg = data->reg; in mlxreg_fan_config()
488 fan->tacho[tacho_num].mask = data->mask; in mlxreg_fan_config()
489 fan->tacho[tacho_num].prsnt = data->reg_prsnt; in mlxreg_fan_config()
490 fan->tacho[tacho_num++].connected = true; in mlxreg_fan_config()
494 dev_err(fan->dev, "too many pwm entries: %s\n", in mlxreg_fan_config()
501 err = mlxreg_pwm_connect_verify(fan, data); in mlxreg_fan_config()
508 fan->pwm[pwm_num].reg = data->reg; in mlxreg_fan_config()
509 fan->pwm[pwm_num].connected = true; in mlxreg_fan_config()
513 dev_err(fan->dev, "duplicate conf entry: %s\n", in mlxreg_fan_config()
519 dev_err(fan->dev, "invalid conf entry params: %s\n", in mlxreg_fan_config()
524 err = mlxreg_fan_speed_divider_get(fan, data); in mlxreg_fan_config()
529 fan->samples = data->mask; in mlxreg_fan_config()
531 fan->divider = data->bit; in mlxreg_fan_config()
535 dev_err(fan->dev, "invalid label: %s\n", data->label); in mlxreg_fan_config()
544 /* Obtain the number of FAN drawers, supported by system. */ in mlxreg_fan_config()
545 err = regmap_read(fan->regmap, pdata->capability, &regval); in mlxreg_fan_config()
547 dev_err(fan->dev, "Failed to query capability register 0x%08x\n", in mlxreg_fan_config()
562 dev_err(fan->dev, "Configuration is invalid: drawers num %d tachos num %d\n", in mlxreg_fan_config()
568 fan->tachos_per_drwr = tacho_avail / drwr_avail; in mlxreg_fan_config()
574 static int mlxreg_fan_cooling_config(struct device *dev, struct mlxreg_fan *fan) in mlxreg_fan_cooling_config() argument
579 struct mlxreg_fan_pwm *pwm = &fan->pwm[i]; in mlxreg_fan_cooling_config()
583 pwm->fan = fan; in mlxreg_fan_cooling_config()
601 struct mlxreg_fan *fan; in mlxreg_fan_probe() local
611 fan = devm_kzalloc(dev, sizeof(*fan), GFP_KERNEL); in mlxreg_fan_probe()
612 if (!fan) in mlxreg_fan_probe()
615 fan->dev = dev; in mlxreg_fan_probe()
616 fan->regmap = pdata->regmap; in mlxreg_fan_probe()
618 err = mlxreg_fan_config(fan, pdata); in mlxreg_fan_probe()
623 fan, in mlxreg_fan_probe()
632 err = mlxreg_fan_cooling_config(dev, fan); in mlxreg_fan_probe()
639 .name = "mlxreg-fan",
647 MODULE_DESCRIPTION("Mellanox FAN driver");
649 MODULE_ALIAS("platform:mlxreg-fan");