0001
0002
0003
0004
0005
0006 #include <asm/io.h>
0007
0008 #include <linux/delay.h>
0009 #include <linux/moduleparam.h>
0010 #include <linux/module.h>
0011
0012 #include "w1_internal.h"
0013
0014 static int w1_delay_parm = 1;
0015 module_param_named(delay_coef, w1_delay_parm, int, 0);
0016
0017 static int w1_disable_irqs = 0;
0018 module_param_named(disable_irqs, w1_disable_irqs, int, 0);
0019
0020 static u8 w1_crc8_table[] = {
0021 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
0022 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
0023 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
0024 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
0025 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
0026 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
0027 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
0028 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
0029 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
0030 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
0031 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
0032 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
0033 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
0034 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
0035 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
0036 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53
0037 };
0038
0039 static void w1_delay(unsigned long tm)
0040 {
0041 udelay(tm * w1_delay_parm);
0042 }
0043
0044 static void w1_write_bit(struct w1_master *dev, int bit);
0045 static u8 w1_read_bit(struct w1_master *dev);
0046
0047
0048
0049
0050
0051
0052 u8 w1_touch_bit(struct w1_master *dev, int bit)
0053 {
0054 if (dev->bus_master->touch_bit)
0055 return dev->bus_master->touch_bit(dev->bus_master->data, bit);
0056 else if (bit)
0057 return w1_read_bit(dev);
0058 else {
0059 w1_write_bit(dev, 0);
0060 return 0;
0061 }
0062 }
0063 EXPORT_SYMBOL_GPL(w1_touch_bit);
0064
0065
0066
0067
0068
0069
0070
0071
0072 static void w1_write_bit(struct w1_master *dev, int bit)
0073 {
0074 unsigned long flags = 0;
0075
0076 if(w1_disable_irqs) local_irq_save(flags);
0077
0078 if (bit) {
0079 dev->bus_master->write_bit(dev->bus_master->data, 0);
0080 w1_delay(6);
0081 dev->bus_master->write_bit(dev->bus_master->data, 1);
0082 w1_delay(64);
0083 } else {
0084 dev->bus_master->write_bit(dev->bus_master->data, 0);
0085 w1_delay(60);
0086 dev->bus_master->write_bit(dev->bus_master->data, 1);
0087 w1_delay(10);
0088 }
0089
0090 if(w1_disable_irqs) local_irq_restore(flags);
0091 }
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101 static void w1_pre_write(struct w1_master *dev)
0102 {
0103 if (dev->pullup_duration &&
0104 dev->enable_pullup && dev->bus_master->set_pullup) {
0105 dev->bus_master->set_pullup(dev->bus_master->data,
0106 dev->pullup_duration);
0107 }
0108 }
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118 static void w1_post_write(struct w1_master *dev)
0119 {
0120 if (dev->pullup_duration) {
0121 if (dev->enable_pullup && dev->bus_master->set_pullup)
0122 dev->bus_master->set_pullup(dev->bus_master->data, 0);
0123 else
0124 msleep(dev->pullup_duration);
0125 dev->pullup_duration = 0;
0126 }
0127 }
0128
0129
0130
0131
0132
0133
0134 void w1_write_8(struct w1_master *dev, u8 byte)
0135 {
0136 int i;
0137
0138 if (dev->bus_master->write_byte) {
0139 w1_pre_write(dev);
0140 dev->bus_master->write_byte(dev->bus_master->data, byte);
0141 }
0142 else
0143 for (i = 0; i < 8; ++i) {
0144 if (i == 7)
0145 w1_pre_write(dev);
0146 w1_touch_bit(dev, (byte >> i) & 0x1);
0147 }
0148 w1_post_write(dev);
0149 }
0150 EXPORT_SYMBOL_GPL(w1_write_8);
0151
0152
0153
0154
0155
0156
0157
0158
0159 static u8 w1_read_bit(struct w1_master *dev)
0160 {
0161 int result;
0162 unsigned long flags = 0;
0163
0164
0165 local_irq_save(flags);
0166 dev->bus_master->write_bit(dev->bus_master->data, 0);
0167 w1_delay(6);
0168 dev->bus_master->write_bit(dev->bus_master->data, 1);
0169 w1_delay(9);
0170
0171 result = dev->bus_master->read_bit(dev->bus_master->data);
0172 local_irq_restore(flags);
0173
0174 w1_delay(55);
0175
0176 return result & 0x1;
0177 }
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193 u8 w1_triplet(struct w1_master *dev, int bdir)
0194 {
0195 if (dev->bus_master->triplet)
0196 return dev->bus_master->triplet(dev->bus_master->data, bdir);
0197 else {
0198 u8 id_bit = w1_touch_bit(dev, 1);
0199 u8 comp_bit = w1_touch_bit(dev, 1);
0200 u8 retval;
0201
0202 if (id_bit && comp_bit)
0203 return 0x03;
0204
0205 if (!id_bit && !comp_bit) {
0206
0207 retval = bdir ? 0x04 : 0;
0208 } else {
0209
0210 bdir = id_bit;
0211 retval = id_bit ? 0x05 : 0x02;
0212 }
0213
0214 if (dev->bus_master->touch_bit)
0215 w1_touch_bit(dev, bdir);
0216 else
0217 w1_write_bit(dev, bdir);
0218 return retval;
0219 }
0220 }
0221 EXPORT_SYMBOL_GPL(w1_triplet);
0222
0223
0224
0225
0226
0227
0228
0229 u8 w1_read_8(struct w1_master *dev)
0230 {
0231 int i;
0232 u8 res = 0;
0233
0234 if (dev->bus_master->read_byte)
0235 res = dev->bus_master->read_byte(dev->bus_master->data);
0236 else
0237 for (i = 0; i < 8; ++i)
0238 res |= (w1_touch_bit(dev,1) << i);
0239
0240 return res;
0241 }
0242 EXPORT_SYMBOL_GPL(w1_read_8);
0243
0244
0245
0246
0247
0248
0249
0250 void w1_write_block(struct w1_master *dev, const u8 *buf, int len)
0251 {
0252 int i;
0253
0254 if (dev->bus_master->write_block) {
0255 w1_pre_write(dev);
0256 dev->bus_master->write_block(dev->bus_master->data, buf, len);
0257 }
0258 else
0259 for (i = 0; i < len; ++i)
0260 w1_write_8(dev, buf[i]);
0261 w1_post_write(dev);
0262 }
0263 EXPORT_SYMBOL_GPL(w1_write_block);
0264
0265
0266
0267
0268
0269
0270
0271 void w1_touch_block(struct w1_master *dev, u8 *buf, int len)
0272 {
0273 int i, j;
0274 u8 tmp;
0275
0276 for (i = 0; i < len; ++i) {
0277 tmp = 0;
0278 for (j = 0; j < 8; ++j) {
0279 if (j == 7)
0280 w1_pre_write(dev);
0281 tmp |= w1_touch_bit(dev, (buf[i] >> j) & 0x1) << j;
0282 }
0283
0284 buf[i] = tmp;
0285 }
0286 }
0287 EXPORT_SYMBOL_GPL(w1_touch_block);
0288
0289
0290
0291
0292
0293
0294
0295
0296 u8 w1_read_block(struct w1_master *dev, u8 *buf, int len)
0297 {
0298 int i;
0299 u8 ret;
0300
0301 if (dev->bus_master->read_block)
0302 ret = dev->bus_master->read_block(dev->bus_master->data, buf, len);
0303 else {
0304 for (i = 0; i < len; ++i)
0305 buf[i] = w1_read_8(dev);
0306 ret = len;
0307 }
0308
0309 return ret;
0310 }
0311 EXPORT_SYMBOL_GPL(w1_read_block);
0312
0313
0314
0315
0316
0317
0318 int w1_reset_bus(struct w1_master *dev)
0319 {
0320 int result;
0321 unsigned long flags = 0;
0322
0323 if(w1_disable_irqs) local_irq_save(flags);
0324
0325 if (dev->bus_master->reset_bus)
0326 result = dev->bus_master->reset_bus(dev->bus_master->data) & 0x1;
0327 else {
0328 dev->bus_master->write_bit(dev->bus_master->data, 0);
0329
0330
0331
0332
0333
0334
0335
0336 w1_delay(500);
0337 dev->bus_master->write_bit(dev->bus_master->data, 1);
0338 w1_delay(70);
0339
0340 result = dev->bus_master->read_bit(dev->bus_master->data) & 0x1;
0341
0342
0343
0344
0345
0346 msleep(1);
0347 }
0348
0349 if(w1_disable_irqs) local_irq_restore(flags);
0350
0351 return result;
0352 }
0353 EXPORT_SYMBOL_GPL(w1_reset_bus);
0354
0355 u8 w1_calc_crc8(u8 * data, int len)
0356 {
0357 u8 crc = 0;
0358
0359 while (len--)
0360 crc = w1_crc8_table[crc ^ *data++];
0361
0362 return crc;
0363 }
0364 EXPORT_SYMBOL_GPL(w1_calc_crc8);
0365
0366 void w1_search_devices(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb)
0367 {
0368 dev->attempts++;
0369 if (dev->bus_master->search)
0370 dev->bus_master->search(dev->bus_master->data, dev,
0371 search_type, cb);
0372 else
0373 w1_search(dev, search_type, cb);
0374 }
0375
0376
0377
0378
0379
0380
0381
0382
0383
0384
0385
0386
0387 int w1_reset_select_slave(struct w1_slave *sl)
0388 {
0389 if (w1_reset_bus(sl->master))
0390 return -1;
0391
0392 if (sl->master->slave_count == 1)
0393 w1_write_8(sl->master, W1_SKIP_ROM);
0394 else {
0395 u8 match[9] = {W1_MATCH_ROM, };
0396 u64 rn = le64_to_cpu(*((u64*)&sl->reg_num));
0397
0398 memcpy(&match[1], &rn, 8);
0399 w1_write_block(sl->master, match, 9);
0400 }
0401 return 0;
0402 }
0403 EXPORT_SYMBOL_GPL(w1_reset_select_slave);
0404
0405
0406
0407
0408
0409
0410
0411
0412
0413
0414
0415
0416
0417
0418
0419
0420
0421 int w1_reset_resume_command(struct w1_master *dev)
0422 {
0423 if (w1_reset_bus(dev))
0424 return -1;
0425
0426 w1_write_8(dev, dev->slave_count > 1 ? W1_RESUME_CMD : W1_SKIP_ROM);
0427 return 0;
0428 }
0429 EXPORT_SYMBOL_GPL(w1_reset_resume_command);
0430
0431
0432
0433
0434
0435
0436
0437
0438
0439
0440
0441
0442
0443
0444
0445 void w1_next_pullup(struct w1_master *dev, int delay)
0446 {
0447 dev->pullup_duration = delay;
0448 }
0449 EXPORT_SYMBOL_GPL(w1_next_pullup);