0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 #include <linux/device.h>
0031 #include <linux/module.h>
0032 #include <linux/init.h>
0033 #include <linux/jiffies.h>
0034 #include <linux/i2c.h>
0035 #include <linux/hwmon.h>
0036 #include <linux/hwmon-sysfs.h>
0037 #include <linux/err.h>
0038 #include <linux/mutex.h>
0039 #include <linux/kernel.h>
0040 #include <linux/clk.h>
0041 #include <linux/of.h>
0042 #include <linux/of_device.h>
0043 #include <linux/platform_data/g762.h>
0044
0045 #define DRVNAME "g762"
0046
0047 static const struct i2c_device_id g762_id[] = {
0048 { "g762", 0 },
0049 { "g763", 0 },
0050 { }
0051 };
0052 MODULE_DEVICE_TABLE(i2c, g762_id);
0053
0054 enum g762_regs {
0055 G762_REG_SET_CNT = 0x00,
0056 G762_REG_ACT_CNT = 0x01,
0057 G762_REG_FAN_STA = 0x02,
0058 G762_REG_SET_OUT = 0x03,
0059 G762_REG_FAN_CMD1 = 0x04,
0060 G762_REG_FAN_CMD2 = 0x05,
0061 };
0062
0063
0064 #define G762_REG_FAN_CMD1_DET_FAN_FAIL 0x80
0065 #define G762_REG_FAN_CMD1_DET_FAN_OOC 0x40
0066 #define G762_REG_FAN_CMD1_OUT_MODE 0x20
0067 #define G762_REG_FAN_CMD1_FAN_MODE 0x10
0068 #define G762_REG_FAN_CMD1_CLK_DIV_ID1 0x08
0069 #define G762_REG_FAN_CMD1_CLK_DIV_ID0 0x04
0070 #define G762_REG_FAN_CMD1_PWM_POLARITY 0x02
0071 #define G762_REG_FAN_CMD1_PULSE_PER_REV 0x01
0072
0073 #define G762_REG_FAN_CMD2_GEAR_MODE_1 0x08
0074 #define G762_REG_FAN_CMD2_GEAR_MODE_0 0x04
0075 #define G762_REG_FAN_CMD2_FAN_STARTV_1 0x02
0076 #define G762_REG_FAN_CMD2_FAN_STARTV_0 0x01
0077
0078 #define G762_REG_FAN_STA_FAIL 0x02
0079 #define G762_REG_FAN_STA_OOC 0x01
0080
0081
0082 #define G762_OUT_MODE_PWM 1
0083 #define G762_OUT_MODE_DC 0
0084
0085 #define G762_FAN_MODE_CLOSED_LOOP 2
0086 #define G762_FAN_MODE_OPEN_LOOP 1
0087
0088 #define G762_PWM_POLARITY_NEGATIVE 1
0089 #define G762_PWM_POLARITY_POSITIVE 0
0090
0091
0092 #define G762_UPDATE_INTERVAL HZ
0093
0094
0095
0096
0097
0098 #define G762_PULSE_FROM_REG(reg) \
0099 ((((reg) & G762_REG_FAN_CMD1_PULSE_PER_REV) + 1) << 1)
0100
0101
0102
0103
0104
0105 #define G762_CLKDIV_FROM_REG(reg) \
0106 (1 << (((reg) & (G762_REG_FAN_CMD1_CLK_DIV_ID0 | \
0107 G762_REG_FAN_CMD1_CLK_DIV_ID1)) >> 2))
0108
0109
0110
0111
0112
0113 #define G762_GEARMULT_FROM_REG(reg) \
0114 (1 << (((reg) & (G762_REG_FAN_CMD2_GEAR_MODE_0 | \
0115 G762_REG_FAN_CMD2_GEAR_MODE_1)) >> 2))
0116
0117 struct g762_data {
0118 struct i2c_client *client;
0119 struct clk *clk;
0120
0121
0122 struct mutex update_lock;
0123
0124
0125 u32 clk_freq;
0126
0127
0128 bool valid;
0129 unsigned long last_updated;
0130
0131 u8 set_cnt;
0132 u8 act_cnt;
0133 u8 fan_sta;
0134
0135
0136
0137
0138 u8 set_out;
0139 u8 fan_cmd1;
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154 u8 fan_cmd2;
0155
0156
0157
0158
0159
0160
0161 };
0162
0163
0164
0165
0166
0167
0168
0169 static inline unsigned int rpm_from_cnt(u8 cnt, u32 clk_freq, u16 p,
0170 u8 clk_div, u8 gear_mult)
0171 {
0172 if (cnt == 0xff)
0173 return 0;
0174
0175 return (clk_freq * 30 * gear_mult) / ((cnt ? cnt : 1) * p * clk_div);
0176 }
0177
0178
0179
0180
0181
0182 static inline unsigned char cnt_from_rpm(unsigned long rpm, u32 clk_freq, u16 p,
0183 u8 clk_div, u8 gear_mult)
0184 {
0185 unsigned long f1 = clk_freq * 30 * gear_mult;
0186 unsigned long f2 = p * clk_div;
0187
0188 if (!rpm)
0189 return 0xff;
0190
0191 rpm = clamp_val(rpm, f1 / (255 * f2), ULONG_MAX / f2);
0192 return DIV_ROUND_CLOSEST(f1, rpm * f2);
0193 }
0194
0195
0196 static struct g762_data *g762_update_client(struct device *dev)
0197 {
0198 struct g762_data *data = dev_get_drvdata(dev);
0199 struct i2c_client *client = data->client;
0200 int ret = 0;
0201
0202 mutex_lock(&data->update_lock);
0203 if (time_before(jiffies, data->last_updated + G762_UPDATE_INTERVAL) &&
0204 likely(data->valid))
0205 goto out;
0206
0207 ret = i2c_smbus_read_byte_data(client, G762_REG_SET_CNT);
0208 if (ret < 0)
0209 goto out;
0210 data->set_cnt = ret;
0211
0212 ret = i2c_smbus_read_byte_data(client, G762_REG_ACT_CNT);
0213 if (ret < 0)
0214 goto out;
0215 data->act_cnt = ret;
0216
0217 ret = i2c_smbus_read_byte_data(client, G762_REG_FAN_STA);
0218 if (ret < 0)
0219 goto out;
0220 data->fan_sta = ret;
0221
0222 ret = i2c_smbus_read_byte_data(client, G762_REG_SET_OUT);
0223 if (ret < 0)
0224 goto out;
0225 data->set_out = ret;
0226
0227 ret = i2c_smbus_read_byte_data(client, G762_REG_FAN_CMD1);
0228 if (ret < 0)
0229 goto out;
0230 data->fan_cmd1 = ret;
0231
0232 ret = i2c_smbus_read_byte_data(client, G762_REG_FAN_CMD2);
0233 if (ret < 0)
0234 goto out;
0235 data->fan_cmd2 = ret;
0236
0237 data->last_updated = jiffies;
0238 data->valid = true;
0239 out:
0240 mutex_unlock(&data->update_lock);
0241
0242 if (ret < 0)
0243 data = ERR_PTR(ret);
0244
0245 return data;
0246 }
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256 static int do_set_clk_freq(struct device *dev, unsigned long val)
0257 {
0258 struct g762_data *data = dev_get_drvdata(dev);
0259
0260 if (val > 0xffffff)
0261 return -EINVAL;
0262 if (!val)
0263 val = 32768;
0264
0265 data->clk_freq = val;
0266
0267 return 0;
0268 }
0269
0270
0271 static int do_set_pwm_mode(struct device *dev, unsigned long val)
0272 {
0273 struct g762_data *data = g762_update_client(dev);
0274 int ret;
0275
0276 if (IS_ERR(data))
0277 return PTR_ERR(data);
0278
0279 mutex_lock(&data->update_lock);
0280 switch (val) {
0281 case G762_OUT_MODE_PWM:
0282 data->fan_cmd1 |= G762_REG_FAN_CMD1_OUT_MODE;
0283 break;
0284 case G762_OUT_MODE_DC:
0285 data->fan_cmd1 &= ~G762_REG_FAN_CMD1_OUT_MODE;
0286 break;
0287 default:
0288 ret = -EINVAL;
0289 goto out;
0290 }
0291 ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD1,
0292 data->fan_cmd1);
0293 data->valid = false;
0294 out:
0295 mutex_unlock(&data->update_lock);
0296
0297 return ret;
0298 }
0299
0300
0301 static int do_set_fan_div(struct device *dev, unsigned long val)
0302 {
0303 struct g762_data *data = g762_update_client(dev);
0304 int ret;
0305
0306 if (IS_ERR(data))
0307 return PTR_ERR(data);
0308
0309 mutex_lock(&data->update_lock);
0310 switch (val) {
0311 case 1:
0312 data->fan_cmd1 &= ~G762_REG_FAN_CMD1_CLK_DIV_ID0;
0313 data->fan_cmd1 &= ~G762_REG_FAN_CMD1_CLK_DIV_ID1;
0314 break;
0315 case 2:
0316 data->fan_cmd1 |= G762_REG_FAN_CMD1_CLK_DIV_ID0;
0317 data->fan_cmd1 &= ~G762_REG_FAN_CMD1_CLK_DIV_ID1;
0318 break;
0319 case 4:
0320 data->fan_cmd1 &= ~G762_REG_FAN_CMD1_CLK_DIV_ID0;
0321 data->fan_cmd1 |= G762_REG_FAN_CMD1_CLK_DIV_ID1;
0322 break;
0323 case 8:
0324 data->fan_cmd1 |= G762_REG_FAN_CMD1_CLK_DIV_ID0;
0325 data->fan_cmd1 |= G762_REG_FAN_CMD1_CLK_DIV_ID1;
0326 break;
0327 default:
0328 ret = -EINVAL;
0329 goto out;
0330 }
0331 ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD1,
0332 data->fan_cmd1);
0333 data->valid = false;
0334 out:
0335 mutex_unlock(&data->update_lock);
0336
0337 return ret;
0338 }
0339
0340
0341 static int do_set_fan_gear_mode(struct device *dev, unsigned long val)
0342 {
0343 struct g762_data *data = g762_update_client(dev);
0344 int ret;
0345
0346 if (IS_ERR(data))
0347 return PTR_ERR(data);
0348
0349 mutex_lock(&data->update_lock);
0350 switch (val) {
0351 case 0:
0352 data->fan_cmd2 &= ~G762_REG_FAN_CMD2_GEAR_MODE_0;
0353 data->fan_cmd2 &= ~G762_REG_FAN_CMD2_GEAR_MODE_1;
0354 break;
0355 case 1:
0356 data->fan_cmd2 |= G762_REG_FAN_CMD2_GEAR_MODE_0;
0357 data->fan_cmd2 &= ~G762_REG_FAN_CMD2_GEAR_MODE_1;
0358 break;
0359 case 2:
0360 data->fan_cmd2 &= ~G762_REG_FAN_CMD2_GEAR_MODE_0;
0361 data->fan_cmd2 |= G762_REG_FAN_CMD2_GEAR_MODE_1;
0362 break;
0363 default:
0364 ret = -EINVAL;
0365 goto out;
0366 }
0367 ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD2,
0368 data->fan_cmd2);
0369 data->valid = false;
0370 out:
0371 mutex_unlock(&data->update_lock);
0372
0373 return ret;
0374 }
0375
0376
0377 static int do_set_fan_pulses(struct device *dev, unsigned long val)
0378 {
0379 struct g762_data *data = g762_update_client(dev);
0380 int ret;
0381
0382 if (IS_ERR(data))
0383 return PTR_ERR(data);
0384
0385 mutex_lock(&data->update_lock);
0386 switch (val) {
0387 case 2:
0388 data->fan_cmd1 &= ~G762_REG_FAN_CMD1_PULSE_PER_REV;
0389 break;
0390 case 4:
0391 data->fan_cmd1 |= G762_REG_FAN_CMD1_PULSE_PER_REV;
0392 break;
0393 default:
0394 ret = -EINVAL;
0395 goto out;
0396 }
0397 ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD1,
0398 data->fan_cmd1);
0399 data->valid = false;
0400 out:
0401 mutex_unlock(&data->update_lock);
0402
0403 return ret;
0404 }
0405
0406
0407 static int do_set_pwm_enable(struct device *dev, unsigned long val)
0408 {
0409 struct g762_data *data = g762_update_client(dev);
0410 int ret;
0411
0412 if (IS_ERR(data))
0413 return PTR_ERR(data);
0414
0415 mutex_lock(&data->update_lock);
0416 switch (val) {
0417 case G762_FAN_MODE_CLOSED_LOOP:
0418 data->fan_cmd1 |= G762_REG_FAN_CMD1_FAN_MODE;
0419 break;
0420 case G762_FAN_MODE_OPEN_LOOP:
0421 data->fan_cmd1 &= ~G762_REG_FAN_CMD1_FAN_MODE;
0422
0423
0424
0425
0426
0427
0428
0429 if (data->set_cnt == 0xff)
0430 i2c_smbus_write_byte_data(data->client,
0431 G762_REG_SET_CNT, 254);
0432 break;
0433 default:
0434 ret = -EINVAL;
0435 goto out;
0436 }
0437
0438 ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD1,
0439 data->fan_cmd1);
0440 data->valid = false;
0441 out:
0442 mutex_unlock(&data->update_lock);
0443
0444 return ret;
0445 }
0446
0447
0448 static int do_set_pwm_polarity(struct device *dev, unsigned long val)
0449 {
0450 struct g762_data *data = g762_update_client(dev);
0451 int ret;
0452
0453 if (IS_ERR(data))
0454 return PTR_ERR(data);
0455
0456 mutex_lock(&data->update_lock);
0457 switch (val) {
0458 case G762_PWM_POLARITY_POSITIVE:
0459 data->fan_cmd1 &= ~G762_REG_FAN_CMD1_PWM_POLARITY;
0460 break;
0461 case G762_PWM_POLARITY_NEGATIVE:
0462 data->fan_cmd1 |= G762_REG_FAN_CMD1_PWM_POLARITY;
0463 break;
0464 default:
0465 ret = -EINVAL;
0466 goto out;
0467 }
0468 ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD1,
0469 data->fan_cmd1);
0470 data->valid = false;
0471 out:
0472 mutex_unlock(&data->update_lock);
0473
0474 return ret;
0475 }
0476
0477
0478
0479
0480
0481 static int do_set_pwm(struct device *dev, unsigned long val)
0482 {
0483 struct g762_data *data = dev_get_drvdata(dev);
0484 struct i2c_client *client = data->client;
0485 int ret;
0486
0487 if (val > 255)
0488 return -EINVAL;
0489
0490 mutex_lock(&data->update_lock);
0491 ret = i2c_smbus_write_byte_data(client, G762_REG_SET_OUT, val);
0492 data->valid = false;
0493 mutex_unlock(&data->update_lock);
0494
0495 return ret;
0496 }
0497
0498
0499
0500
0501
0502 static int do_set_fan_target(struct device *dev, unsigned long val)
0503 {
0504 struct g762_data *data = g762_update_client(dev);
0505 int ret;
0506
0507 if (IS_ERR(data))
0508 return PTR_ERR(data);
0509
0510 mutex_lock(&data->update_lock);
0511 data->set_cnt = cnt_from_rpm(val, data->clk_freq,
0512 G762_PULSE_FROM_REG(data->fan_cmd1),
0513 G762_CLKDIV_FROM_REG(data->fan_cmd1),
0514 G762_GEARMULT_FROM_REG(data->fan_cmd2));
0515 ret = i2c_smbus_write_byte_data(data->client, G762_REG_SET_CNT,
0516 data->set_cnt);
0517 data->valid = false;
0518 mutex_unlock(&data->update_lock);
0519
0520 return ret;
0521 }
0522
0523
0524 static int do_set_fan_startv(struct device *dev, unsigned long val)
0525 {
0526 struct g762_data *data = g762_update_client(dev);
0527 int ret;
0528
0529 if (IS_ERR(data))
0530 return PTR_ERR(data);
0531
0532 mutex_lock(&data->update_lock);
0533 switch (val) {
0534 case 0:
0535 data->fan_cmd2 &= ~G762_REG_FAN_CMD2_FAN_STARTV_0;
0536 data->fan_cmd2 &= ~G762_REG_FAN_CMD2_FAN_STARTV_1;
0537 break;
0538 case 1:
0539 data->fan_cmd2 |= G762_REG_FAN_CMD2_FAN_STARTV_0;
0540 data->fan_cmd2 &= ~G762_REG_FAN_CMD2_FAN_STARTV_1;
0541 break;
0542 case 2:
0543 data->fan_cmd2 &= ~G762_REG_FAN_CMD2_FAN_STARTV_0;
0544 data->fan_cmd2 |= G762_REG_FAN_CMD2_FAN_STARTV_1;
0545 break;
0546 case 3:
0547 data->fan_cmd2 |= G762_REG_FAN_CMD2_FAN_STARTV_0;
0548 data->fan_cmd2 |= G762_REG_FAN_CMD2_FAN_STARTV_1;
0549 break;
0550 default:
0551 ret = -EINVAL;
0552 goto out;
0553 }
0554 ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD2,
0555 data->fan_cmd2);
0556 data->valid = false;
0557 out:
0558 mutex_unlock(&data->update_lock);
0559
0560 return ret;
0561 }
0562
0563
0564
0565
0566
0567
0568 #ifdef CONFIG_OF
0569 static const struct of_device_id g762_dt_match[] = {
0570 { .compatible = "gmt,g762" },
0571 { .compatible = "gmt,g763" },
0572 { },
0573 };
0574 MODULE_DEVICE_TABLE(of, g762_dt_match);
0575
0576
0577
0578
0579
0580
0581
0582
0583 static void g762_of_clock_disable(void *data)
0584 {
0585 struct g762_data *g762 = data;
0586
0587 clk_disable_unprepare(g762->clk);
0588 clk_put(g762->clk);
0589 }
0590
0591 static int g762_of_clock_enable(struct i2c_client *client)
0592 {
0593 struct g762_data *data;
0594 unsigned long clk_freq;
0595 struct clk *clk;
0596 int ret;
0597
0598 if (!client->dev.of_node)
0599 return 0;
0600
0601 clk = of_clk_get(client->dev.of_node, 0);
0602 if (IS_ERR(clk)) {
0603 dev_err(&client->dev, "failed to get clock\n");
0604 return PTR_ERR(clk);
0605 }
0606
0607 ret = clk_prepare_enable(clk);
0608 if (ret) {
0609 dev_err(&client->dev, "failed to enable clock\n");
0610 goto clk_put;
0611 }
0612
0613 clk_freq = clk_get_rate(clk);
0614 ret = do_set_clk_freq(&client->dev, clk_freq);
0615 if (ret) {
0616 dev_err(&client->dev, "invalid clock freq %lu\n", clk_freq);
0617 goto clk_unprep;
0618 }
0619
0620 data = i2c_get_clientdata(client);
0621 data->clk = clk;
0622
0623 devm_add_action(&client->dev, g762_of_clock_disable, data);
0624 return 0;
0625
0626 clk_unprep:
0627 clk_disable_unprepare(clk);
0628
0629 clk_put:
0630 clk_put(clk);
0631
0632 return ret;
0633 }
0634
0635 static int g762_of_prop_import_one(struct i2c_client *client,
0636 const char *pname,
0637 int (*psetter)(struct device *dev,
0638 unsigned long val))
0639 {
0640 int ret;
0641 u32 pval;
0642
0643 if (of_property_read_u32(client->dev.of_node, pname, &pval))
0644 return 0;
0645
0646 dev_dbg(&client->dev, "found %s (%d)\n", pname, pval);
0647 ret = (*psetter)(&client->dev, pval);
0648 if (ret)
0649 dev_err(&client->dev, "unable to set %s (%d)\n", pname, pval);
0650
0651 return ret;
0652 }
0653
0654 static int g762_of_prop_import(struct i2c_client *client)
0655 {
0656 int ret;
0657
0658 if (!client->dev.of_node)
0659 return 0;
0660
0661 ret = g762_of_prop_import_one(client, "fan_gear_mode",
0662 do_set_fan_gear_mode);
0663 if (ret)
0664 return ret;
0665
0666 ret = g762_of_prop_import_one(client, "pwm_polarity",
0667 do_set_pwm_polarity);
0668 if (ret)
0669 return ret;
0670
0671 return g762_of_prop_import_one(client, "fan_startv",
0672 do_set_fan_startv);
0673 }
0674
0675 #else
0676 static int g762_of_prop_import(struct i2c_client *client)
0677 {
0678 return 0;
0679 }
0680
0681 static int g762_of_clock_enable(struct i2c_client *client)
0682 {
0683 return 0;
0684 }
0685 #endif
0686
0687
0688
0689
0690
0691
0692 static int g762_pdata_prop_import(struct i2c_client *client)
0693 {
0694 struct g762_platform_data *pdata = dev_get_platdata(&client->dev);
0695 int ret;
0696
0697 if (!pdata)
0698 return 0;
0699
0700 ret = do_set_fan_gear_mode(&client->dev, pdata->fan_gear_mode);
0701 if (ret)
0702 return ret;
0703
0704 ret = do_set_pwm_polarity(&client->dev, pdata->pwm_polarity);
0705 if (ret)
0706 return ret;
0707
0708 ret = do_set_fan_startv(&client->dev, pdata->fan_startv);
0709 if (ret)
0710 return ret;
0711
0712 return do_set_clk_freq(&client->dev, pdata->clk_freq);
0713 }
0714
0715
0716
0717
0718
0719
0720
0721
0722
0723 static ssize_t fan1_input_show(struct device *dev,
0724 struct device_attribute *da, char *buf)
0725 {
0726 struct g762_data *data = g762_update_client(dev);
0727 unsigned int rpm = 0;
0728
0729 if (IS_ERR(data))
0730 return PTR_ERR(data);
0731
0732 mutex_lock(&data->update_lock);
0733
0734 if (data->fan_sta & G762_REG_FAN_STA_OOC) {
0735 rpm = rpm_from_cnt(data->act_cnt, data->clk_freq,
0736 G762_PULSE_FROM_REG(data->fan_cmd1),
0737 G762_CLKDIV_FROM_REG(data->fan_cmd1),
0738 G762_GEARMULT_FROM_REG(data->fan_cmd2));
0739 }
0740 mutex_unlock(&data->update_lock);
0741
0742 return sprintf(buf, "%u\n", rpm);
0743 }
0744
0745
0746
0747
0748
0749 static ssize_t pwm1_mode_show(struct device *dev, struct device_attribute *da,
0750 char *buf)
0751 {
0752 struct g762_data *data = g762_update_client(dev);
0753
0754 if (IS_ERR(data))
0755 return PTR_ERR(data);
0756
0757 return sprintf(buf, "%d\n",
0758 !!(data->fan_cmd1 & G762_REG_FAN_CMD1_OUT_MODE));
0759 }
0760
0761 static ssize_t pwm1_mode_store(struct device *dev,
0762 struct device_attribute *da, const char *buf,
0763 size_t count)
0764 {
0765 unsigned long val;
0766 int ret;
0767
0768 if (kstrtoul(buf, 10, &val))
0769 return -EINVAL;
0770
0771 ret = do_set_pwm_mode(dev, val);
0772 if (ret < 0)
0773 return ret;
0774
0775 return count;
0776 }
0777
0778
0779
0780
0781
0782 static ssize_t fan1_div_show(struct device *dev, struct device_attribute *da,
0783 char *buf)
0784 {
0785 struct g762_data *data = g762_update_client(dev);
0786
0787 if (IS_ERR(data))
0788 return PTR_ERR(data);
0789
0790 return sprintf(buf, "%d\n", G762_CLKDIV_FROM_REG(data->fan_cmd1));
0791 }
0792
0793 static ssize_t fan1_div_store(struct device *dev, struct device_attribute *da,
0794 const char *buf, size_t count)
0795 {
0796 unsigned long val;
0797 int ret;
0798
0799 if (kstrtoul(buf, 10, &val))
0800 return -EINVAL;
0801
0802 ret = do_set_fan_div(dev, val);
0803 if (ret < 0)
0804 return ret;
0805
0806 return count;
0807 }
0808
0809
0810
0811
0812
0813 static ssize_t fan1_pulses_show(struct device *dev,
0814 struct device_attribute *da, char *buf)
0815 {
0816 struct g762_data *data = g762_update_client(dev);
0817
0818 if (IS_ERR(data))
0819 return PTR_ERR(data);
0820
0821 return sprintf(buf, "%d\n", G762_PULSE_FROM_REG(data->fan_cmd1));
0822 }
0823
0824 static ssize_t fan1_pulses_store(struct device *dev,
0825 struct device_attribute *da, const char *buf,
0826 size_t count)
0827 {
0828 unsigned long val;
0829 int ret;
0830
0831 if (kstrtoul(buf, 10, &val))
0832 return -EINVAL;
0833
0834 ret = do_set_fan_pulses(dev, val);
0835 if (ret < 0)
0836 return ret;
0837
0838 return count;
0839 }
0840
0841
0842
0843
0844
0845
0846
0847
0848
0849
0850
0851
0852
0853
0854
0855 static ssize_t pwm1_enable_show(struct device *dev,
0856 struct device_attribute *da, char *buf)
0857 {
0858 struct g762_data *data = g762_update_client(dev);
0859
0860 if (IS_ERR(data))
0861 return PTR_ERR(data);
0862
0863 return sprintf(buf, "%d\n",
0864 (!!(data->fan_cmd1 & G762_REG_FAN_CMD1_FAN_MODE)) + 1);
0865 }
0866
0867 static ssize_t pwm1_enable_store(struct device *dev,
0868 struct device_attribute *da, const char *buf,
0869 size_t count)
0870 {
0871 unsigned long val;
0872 int ret;
0873
0874 if (kstrtoul(buf, 10, &val))
0875 return -EINVAL;
0876
0877 ret = do_set_pwm_enable(dev, val);
0878 if (ret < 0)
0879 return ret;
0880
0881 return count;
0882 }
0883
0884
0885
0886
0887
0888
0889 static ssize_t pwm1_show(struct device *dev, struct device_attribute *da,
0890 char *buf)
0891 {
0892 struct g762_data *data = g762_update_client(dev);
0893
0894 if (IS_ERR(data))
0895 return PTR_ERR(data);
0896
0897 return sprintf(buf, "%d\n", data->set_out);
0898 }
0899
0900 static ssize_t pwm1_store(struct device *dev, struct device_attribute *da,
0901 const char *buf, size_t count)
0902 {
0903 unsigned long val;
0904 int ret;
0905
0906 if (kstrtoul(buf, 10, &val))
0907 return -EINVAL;
0908
0909 ret = do_set_pwm(dev, val);
0910 if (ret < 0)
0911 return ret;
0912
0913 return count;
0914 }
0915
0916
0917
0918
0919
0920
0921
0922
0923
0924
0925
0926
0927 static ssize_t fan1_target_show(struct device *dev,
0928 struct device_attribute *da, char *buf)
0929 {
0930 struct g762_data *data = g762_update_client(dev);
0931 unsigned int rpm;
0932
0933 if (IS_ERR(data))
0934 return PTR_ERR(data);
0935
0936 mutex_lock(&data->update_lock);
0937 rpm = rpm_from_cnt(data->set_cnt, data->clk_freq,
0938 G762_PULSE_FROM_REG(data->fan_cmd1),
0939 G762_CLKDIV_FROM_REG(data->fan_cmd1),
0940 G762_GEARMULT_FROM_REG(data->fan_cmd2));
0941 mutex_unlock(&data->update_lock);
0942
0943 return sprintf(buf, "%u\n", rpm);
0944 }
0945
0946 static ssize_t fan1_target_store(struct device *dev,
0947 struct device_attribute *da, const char *buf,
0948 size_t count)
0949 {
0950 unsigned long val;
0951 int ret;
0952
0953 if (kstrtoul(buf, 10, &val))
0954 return -EINVAL;
0955
0956 ret = do_set_fan_target(dev, val);
0957 if (ret < 0)
0958 return ret;
0959
0960 return count;
0961 }
0962
0963
0964 static ssize_t fan1_fault_show(struct device *dev, struct device_attribute *da,
0965 char *buf)
0966 {
0967 struct g762_data *data = g762_update_client(dev);
0968
0969 if (IS_ERR(data))
0970 return PTR_ERR(data);
0971
0972 return sprintf(buf, "%u\n", !!(data->fan_sta & G762_REG_FAN_STA_FAIL));
0973 }
0974
0975
0976
0977
0978
0979 static ssize_t fan1_alarm_show(struct device *dev,
0980 struct device_attribute *da, char *buf)
0981 {
0982 struct g762_data *data = g762_update_client(dev);
0983
0984 if (IS_ERR(data))
0985 return PTR_ERR(data);
0986
0987 return sprintf(buf, "%u\n", !(data->fan_sta & G762_REG_FAN_STA_OOC));
0988 }
0989
0990 static DEVICE_ATTR_RW(pwm1);
0991 static DEVICE_ATTR_RW(pwm1_mode);
0992 static DEVICE_ATTR_RW(pwm1_enable);
0993 static DEVICE_ATTR_RO(fan1_input);
0994 static DEVICE_ATTR_RO(fan1_alarm);
0995 static DEVICE_ATTR_RO(fan1_fault);
0996 static DEVICE_ATTR_RW(fan1_target);
0997 static DEVICE_ATTR_RW(fan1_div);
0998 static DEVICE_ATTR_RW(fan1_pulses);
0999
1000
1001 static struct attribute *g762_attrs[] = {
1002 &dev_attr_fan1_input.attr,
1003 &dev_attr_fan1_alarm.attr,
1004 &dev_attr_fan1_fault.attr,
1005 &dev_attr_fan1_target.attr,
1006 &dev_attr_fan1_div.attr,
1007 &dev_attr_fan1_pulses.attr,
1008 &dev_attr_pwm1.attr,
1009 &dev_attr_pwm1_mode.attr,
1010 &dev_attr_pwm1_enable.attr,
1011 NULL
1012 };
1013
1014 ATTRIBUTE_GROUPS(g762);
1015
1016
1017
1018
1019
1020
1021 static inline int g762_fan_init(struct device *dev)
1022 {
1023 struct g762_data *data = g762_update_client(dev);
1024
1025 if (IS_ERR(data))
1026 return PTR_ERR(data);
1027
1028 data->fan_cmd1 |= G762_REG_FAN_CMD1_DET_FAN_FAIL;
1029 data->fan_cmd1 |= G762_REG_FAN_CMD1_DET_FAN_OOC;
1030 data->valid = false;
1031
1032 return i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD1,
1033 data->fan_cmd1);
1034 }
1035
1036 static int g762_probe(struct i2c_client *client)
1037 {
1038 struct device *dev = &client->dev;
1039 struct device *hwmon_dev;
1040 struct g762_data *data;
1041 int ret;
1042
1043 if (!i2c_check_functionality(client->adapter,
1044 I2C_FUNC_SMBUS_BYTE_DATA))
1045 return -ENODEV;
1046
1047 data = devm_kzalloc(dev, sizeof(struct g762_data), GFP_KERNEL);
1048 if (!data)
1049 return -ENOMEM;
1050
1051 i2c_set_clientdata(client, data);
1052 data->client = client;
1053 mutex_init(&data->update_lock);
1054
1055
1056 ret = g762_fan_init(dev);
1057 if (ret)
1058 return ret;
1059
1060
1061 ret = g762_of_clock_enable(client);
1062 if (ret)
1063 return ret;
1064 ret = g762_of_prop_import(client);
1065 if (ret)
1066 return ret;
1067
1068 ret = g762_pdata_prop_import(client);
1069 if (ret)
1070 return ret;
1071
1072 hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
1073 data, g762_groups);
1074 return PTR_ERR_OR_ZERO(hwmon_dev);
1075 }
1076
1077 static struct i2c_driver g762_driver = {
1078 .driver = {
1079 .name = DRVNAME,
1080 .of_match_table = of_match_ptr(g762_dt_match),
1081 },
1082 .probe_new = g762_probe,
1083 .id_table = g762_id,
1084 };
1085
1086 module_i2c_driver(g762_driver);
1087
1088 MODULE_AUTHOR("Arnaud EBALARD <arno@natisbad.org>");
1089 MODULE_DESCRIPTION("GMT G762/G763 driver");
1090 MODULE_LICENSE("GPL");