Merge tag 'leds-5.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/pavel...
[linux-2.6-microblaze.git] / drivers / staging / pi433 / rf69.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * abstraction of the spi interface of HopeRf rf69 radio module
4  *
5  * Copyright (C) 2016 Wolf-Entwicklungen
6  *      Marcus Wolf <linux@wolf-entwicklungen.de>
7  */
8
9 /* enable prosa debug info */
10 #undef DEBUG
11 /* enable print of values on reg access */
12 #undef DEBUG_VALUES
13 /* enable print of values on fifo access */
14 #undef DEBUG_FIFO_ACCESS
15
16 #include <linux/types.h>
17 #include <linux/spi/spi.h>
18
19 #include "rf69.h"
20 #include "rf69_registers.h"
21
22 #define F_OSC     32000000 /* in Hz */
23 #define FIFO_SIZE 66       /* in byte */
24
25 /*-------------------------------------------------------------------------*/
26
27 static u8 rf69_read_reg(struct spi_device *spi, u8 addr)
28 {
29         int retval;
30
31         retval = spi_w8r8(spi, addr);
32
33 #ifdef DEBUG_VALUES
34         if (retval < 0)
35                 /*
36                  * should never happen, since we already checked,
37                  * that module is connected. Therefore no error
38                  * handling, just an optional error message...
39                  */
40                 dev_dbg(&spi->dev, "read 0x%x FAILED\n", addr);
41         else
42                 dev_dbg(&spi->dev, "read 0x%x from reg 0x%x\n", retval, addr);
43 #endif
44
45         return retval;
46 }
47
48 static int rf69_write_reg(struct spi_device *spi, u8 addr, u8 value)
49 {
50         int retval;
51         char buffer[2];
52
53         buffer[0] = addr | WRITE_BIT;
54         buffer[1] = value;
55
56         retval = spi_write(spi, &buffer, 2);
57
58 #ifdef DEBUG_VALUES
59         if (retval < 0)
60                 /*
61                  * should never happen, since we already checked,
62                  * that module is connected. Therefore no error
63                  * handling, just an optional error message...
64                  */
65                 dev_dbg(&spi->dev, "write 0x%x to 0x%x FAILED\n", value, addr);
66         else
67                 dev_dbg(&spi->dev, "wrote 0x%x to reg 0x%x\n", value, addr);
68 #endif
69
70         return retval;
71 }
72
73 /*-------------------------------------------------------------------------*/
74
75 static int rf69_set_bit(struct spi_device *spi, u8 reg, u8 mask)
76 {
77         u8 tmp;
78
79         tmp = rf69_read_reg(spi, reg);
80         tmp = tmp | mask;
81         return rf69_write_reg(spi, reg, tmp);
82 }
83
84 static int rf69_clear_bit(struct spi_device *spi, u8 reg, u8 mask)
85 {
86         u8 tmp;
87
88         tmp = rf69_read_reg(spi, reg);
89         tmp = tmp & ~mask;
90         return rf69_write_reg(spi, reg, tmp);
91 }
92
93 static inline int rf69_read_mod_write(struct spi_device *spi, u8 reg,
94                                       u8 mask, u8 value)
95 {
96         u8 tmp;
97
98         tmp = rf69_read_reg(spi, reg);
99         tmp = (tmp & ~mask) | value;
100         return rf69_write_reg(spi, reg, tmp);
101 }
102
103 /*-------------------------------------------------------------------------*/
104
105 int rf69_set_mode(struct spi_device *spi, enum mode mode)
106 {
107         static const u8 mode_map[] = {
108                 [transmit] = OPMODE_MODE_TRANSMIT,
109                 [receive] = OPMODE_MODE_RECEIVE,
110                 [synthesizer] = OPMODE_MODE_SYNTHESIZER,
111                 [standby] = OPMODE_MODE_STANDBY,
112                 [mode_sleep] = OPMODE_MODE_SLEEP,
113         };
114
115         if (unlikely(mode >= ARRAY_SIZE(mode_map))) {
116                 dev_dbg(&spi->dev, "set: illegal mode %u", mode);
117                 return -EINVAL;
118         }
119
120         return rf69_read_mod_write(spi, REG_OPMODE, MASK_OPMODE_MODE,
121                                    mode_map[mode]);
122
123         /*
124          * we are using packet mode, so this check is not really needed
125          * but waiting for mode ready is necessary when going from sleep
126          * because the FIFO may not be immediately available from previous mode
127          * while (_mode == RF69_MODE_SLEEP && (READ_REG(REG_IRQFLAGS1) &
128                   RF_IRQFLAGS1_MODEREADY) == 0x00); // Wait for ModeReady
129          */
130 }
131
132 int rf69_set_data_mode(struct spi_device *spi, u8 data_mode)
133 {
134         return rf69_read_mod_write(spi, REG_DATAMODUL, MASK_DATAMODUL_MODE,
135                                    data_mode);
136 }
137
138 int rf69_set_modulation(struct spi_device *spi, enum modulation modulation)
139 {
140         static const u8 modulation_map[] = {
141                 [OOK] = DATAMODUL_MODULATION_TYPE_OOK,
142                 [FSK] = DATAMODUL_MODULATION_TYPE_FSK,
143         };
144
145         if (unlikely(modulation >= ARRAY_SIZE(modulation_map))) {
146                 dev_dbg(&spi->dev, "set: illegal modulation %u", modulation);
147                 return -EINVAL;
148         }
149
150         return rf69_read_mod_write(spi, REG_DATAMODUL,
151                                    MASK_DATAMODUL_MODULATION_TYPE,
152                                    modulation_map[modulation]);
153 }
154
155 static enum modulation rf69_get_modulation(struct spi_device *spi)
156 {
157         u8 modulation_reg;
158
159         modulation_reg = rf69_read_reg(spi, REG_DATAMODUL);
160
161         switch (modulation_reg & MASK_DATAMODUL_MODULATION_TYPE) {
162         case DATAMODUL_MODULATION_TYPE_OOK:
163                 return OOK;
164         case DATAMODUL_MODULATION_TYPE_FSK:
165                 return FSK;
166         default:
167                 return UNDEF;
168         }
169 }
170
171 int rf69_set_modulation_shaping(struct spi_device *spi,
172                                 enum mod_shaping mod_shaping)
173 {
174         switch (rf69_get_modulation(spi)) {
175         case FSK:
176                 switch (mod_shaping) {
177                 case SHAPING_OFF:
178                         return rf69_read_mod_write(spi, REG_DATAMODUL,
179                                                    MASK_DATAMODUL_MODULATION_SHAPE,
180                                                    DATAMODUL_MODULATION_SHAPE_NONE);
181                 case SHAPING_1_0:
182                         return rf69_read_mod_write(spi, REG_DATAMODUL,
183                                                    MASK_DATAMODUL_MODULATION_SHAPE,
184                                                    DATAMODUL_MODULATION_SHAPE_1_0);
185                 case SHAPING_0_5:
186                         return rf69_read_mod_write(spi, REG_DATAMODUL,
187                                                    MASK_DATAMODUL_MODULATION_SHAPE,
188                                                    DATAMODUL_MODULATION_SHAPE_0_5);
189                 case SHAPING_0_3:
190                         return rf69_read_mod_write(spi, REG_DATAMODUL,
191                                                    MASK_DATAMODUL_MODULATION_SHAPE,
192                                                    DATAMODUL_MODULATION_SHAPE_0_3);
193                 default:
194                         dev_dbg(&spi->dev, "set: illegal mod shaping for FSK %u", mod_shaping);
195                         return -EINVAL;
196                 }
197         case OOK:
198                 switch (mod_shaping) {
199                 case SHAPING_OFF:
200                         return rf69_read_mod_write(spi, REG_DATAMODUL,
201                                                    MASK_DATAMODUL_MODULATION_SHAPE,
202                                                    DATAMODUL_MODULATION_SHAPE_NONE);
203                 case SHAPING_BR:
204                         return rf69_read_mod_write(spi, REG_DATAMODUL,
205                                                    MASK_DATAMODUL_MODULATION_SHAPE,
206                                                    DATAMODUL_MODULATION_SHAPE_BR);
207                 case SHAPING_2BR:
208                         return rf69_read_mod_write(spi, REG_DATAMODUL,
209                                                    MASK_DATAMODUL_MODULATION_SHAPE,
210                                                    DATAMODUL_MODULATION_SHAPE_2BR);
211                 default:
212                         dev_dbg(&spi->dev, "set: illegal mod shaping for OOK %u", mod_shaping);
213                         return -EINVAL;
214                 }
215         default:
216                 dev_dbg(&spi->dev, "set: modulation undefined");
217                 return -EINVAL;
218         }
219 }
220
221 int rf69_set_bit_rate(struct spi_device *spi, u16 bit_rate)
222 {
223         int retval;
224         u32 bit_rate_min;
225         u32 bit_rate_reg;
226         u8 msb;
227         u8 lsb;
228
229         // check input value
230         bit_rate_min = F_OSC / 8388608; // 8388608 = 2^23;
231         if (bit_rate < bit_rate_min) {
232                 dev_dbg(&spi->dev, "setBitRate: illegal input param");
233                 return -EINVAL;
234         }
235
236         // calculate reg settings
237         bit_rate_reg = (F_OSC / bit_rate);
238
239         msb = (bit_rate_reg & 0xff00) >> 8;
240         lsb = (bit_rate_reg & 0xff);
241
242         // transmit to RF 69
243         retval = rf69_write_reg(spi, REG_BITRATE_MSB, msb);
244         if (retval)
245                 return retval;
246         retval = rf69_write_reg(spi, REG_BITRATE_LSB, lsb);
247         if (retval)
248                 return retval;
249
250         return 0;
251 }
252
253 int rf69_set_deviation(struct spi_device *spi, u32 deviation)
254 {
255         int retval;
256         u64 f_reg;
257         u64 f_step;
258         u32 bit_rate_reg;
259         u32 bit_rate;
260         u8 msb;
261         u8 lsb;
262         u64 factor = 1000000; // to improve precision of calculation
263
264         // calculate bit rate
265         bit_rate_reg = rf69_read_reg(spi, REG_BITRATE_MSB) << 8;
266         bit_rate_reg |= rf69_read_reg(spi, REG_BITRATE_LSB);
267         bit_rate = F_OSC / bit_rate_reg;
268
269         /*
270          * frequency deviation must exceed 600 Hz but not exceed
271          * 500kHz when taking bitrate dependency into consideration
272          * to ensure proper modulation
273          */
274         if (deviation < 600 || (deviation + (bit_rate / 2)) > 500000) {
275                 dev_dbg(&spi->dev,
276                         "set_deviation: illegal input param: %u", deviation);
277                 return -EINVAL;
278         }
279
280         // calculat f step
281         f_step = F_OSC * factor;
282         do_div(f_step, 524288); //  524288 = 2^19
283
284         // calculate register settings
285         f_reg = deviation * factor;
286         do_div(f_reg, f_step);
287
288         msb = (f_reg & 0xff00) >> 8;
289         lsb = (f_reg & 0xff);
290
291         // check msb
292         if (msb & ~FDEVMASB_MASK) {
293                 dev_dbg(&spi->dev, "set_deviation: err in calc of msb");
294                 return -EINVAL;
295         }
296
297         // write to chip
298         retval = rf69_write_reg(spi, REG_FDEV_MSB, msb);
299         if (retval)
300                 return retval;
301         retval = rf69_write_reg(spi, REG_FDEV_LSB, lsb);
302         if (retval)
303                 return retval;
304
305         return 0;
306 }
307
308 int rf69_set_frequency(struct spi_device *spi, u32 frequency)
309 {
310         int retval;
311         u32 f_max;
312         u64 f_reg;
313         u64 f_step;
314         u8 msb;
315         u8 mid;
316         u8 lsb;
317         u64 factor = 1000000; // to improve precision of calculation
318
319         // calculat f step
320         f_step = F_OSC * factor;
321         do_div(f_step, 524288); //  524288 = 2^19
322
323         // check input value
324         f_max = div_u64(f_step * 8388608, factor);
325         if (frequency > f_max) {
326                 dev_dbg(&spi->dev, "setFrequency: illegal input param");
327                 return -EINVAL;
328         }
329
330         // calculate reg settings
331         f_reg = frequency * factor;
332         do_div(f_reg, f_step);
333
334         msb = (f_reg & 0xff0000) >> 16;
335         mid = (f_reg & 0xff00)   >>  8;
336         lsb = (f_reg & 0xff);
337
338         // write to chip
339         retval = rf69_write_reg(spi, REG_FRF_MSB, msb);
340         if (retval)
341                 return retval;
342         retval = rf69_write_reg(spi, REG_FRF_MID, mid);
343         if (retval)
344                 return retval;
345         retval = rf69_write_reg(spi, REG_FRF_LSB, lsb);
346         if (retval)
347                 return retval;
348
349         return 0;
350 }
351
352 int rf69_enable_amplifier(struct spi_device *spi, u8 amplifier_mask)
353 {
354         return rf69_set_bit(spi, REG_PALEVEL, amplifier_mask);
355 }
356
357 int rf69_disable_amplifier(struct spi_device *spi, u8 amplifier_mask)
358 {
359         return rf69_clear_bit(spi, REG_PALEVEL, amplifier_mask);
360 }
361
362 int rf69_set_output_power_level(struct spi_device *spi, u8 power_level)
363 {
364         u8 pa_level, ocp, test_pa1, test_pa2;
365         bool pa0, pa1, pa2, high_power;
366         u8 min_power_level;
367
368         // check register pa_level
369         pa_level = rf69_read_reg(spi, REG_PALEVEL);
370         pa0 = pa_level & MASK_PALEVEL_PA0;
371         pa1 = pa_level & MASK_PALEVEL_PA1;
372         pa2 = pa_level & MASK_PALEVEL_PA2;
373
374         // check high power mode
375         ocp = rf69_read_reg(spi, REG_OCP);
376         test_pa1 = rf69_read_reg(spi, REG_TESTPA1);
377         test_pa2 = rf69_read_reg(spi, REG_TESTPA2);
378         high_power = (ocp == 0x0f) && (test_pa1 == 0x5d) && (test_pa2 == 0x7c);
379
380         if (pa0 && !pa1 && !pa2) {
381                 power_level += 18;
382                 min_power_level = 0;
383         } else if (!pa0 && pa1 && !pa2) {
384                 power_level += 18;
385                 min_power_level = 16;
386         } else if (!pa0 && pa1 && pa2) {
387                 if (high_power)
388                         power_level += 11;
389                 else
390                         power_level += 14;
391                 min_power_level = 16;
392         } else {
393                 goto failed;
394         }
395
396         // check input value
397         if (power_level > 0x1f)
398                 goto failed;
399
400         if (power_level < min_power_level)
401                 goto failed;
402
403         // write value
404         return rf69_read_mod_write(spi, REG_PALEVEL, MASK_PALEVEL_OUTPUT_POWER,
405                                    power_level);
406 failed:
407         dev_dbg(&spi->dev, "set: illegal power level %u", power_level);
408         return -EINVAL;
409 }
410
411 int rf69_set_pa_ramp(struct spi_device *spi, enum pa_ramp pa_ramp)
412 {
413         static const u8 pa_ramp_map[] = {
414                 [ramp3400] = PARAMP_3400,
415                 [ramp2000] = PARAMP_2000,
416                 [ramp1000] = PARAMP_1000,
417                 [ramp500] = PARAMP_500,
418                 [ramp250] = PARAMP_250,
419                 [ramp125] = PARAMP_125,
420                 [ramp100] = PARAMP_100,
421                 [ramp62] = PARAMP_62,
422                 [ramp50] = PARAMP_50,
423                 [ramp40] = PARAMP_40,
424                 [ramp31] = PARAMP_31,
425                 [ramp25] = PARAMP_25,
426                 [ramp20] = PARAMP_20,
427                 [ramp15] = PARAMP_15,
428                 [ramp10] = PARAMP_10,
429         };
430
431         if (unlikely(pa_ramp >= ARRAY_SIZE(pa_ramp_map))) {
432                 dev_dbg(&spi->dev, "set: illegal pa_ramp %u", pa_ramp);
433                 return -EINVAL;
434         }
435
436         return rf69_write_reg(spi, REG_PARAMP, pa_ramp_map[pa_ramp]);
437 }
438
439 int rf69_set_antenna_impedance(struct spi_device *spi,
440                                enum antenna_impedance antenna_impedance)
441 {
442         switch (antenna_impedance) {
443         case fifty_ohm:
444                 return rf69_clear_bit(spi, REG_LNA, MASK_LNA_ZIN);
445         case two_hundred_ohm:
446                 return rf69_set_bit(spi, REG_LNA, MASK_LNA_ZIN);
447         default:
448                 dev_dbg(&spi->dev, "set: illegal antenna impedance %u", antenna_impedance);
449                 return -EINVAL;
450         }
451 }
452
453 int rf69_set_lna_gain(struct spi_device *spi, enum lna_gain lna_gain)
454 {
455         static const u8 lna_gain_map[] = {
456                 [automatic] = LNA_GAIN_AUTO,
457                 [max] = LNA_GAIN_MAX,
458                 [max_minus_6] = LNA_GAIN_MAX_MINUS_6,
459                 [max_minus_12] = LNA_GAIN_MAX_MINUS_12,
460                 [max_minus_24] = LNA_GAIN_MAX_MINUS_24,
461                 [max_minus_36] = LNA_GAIN_MAX_MINUS_36,
462                 [max_minus_48] = LNA_GAIN_MAX_MINUS_48,
463         };
464
465         if (unlikely(lna_gain >= ARRAY_SIZE(lna_gain_map))) {
466                 dev_dbg(&spi->dev, "set: illegal lna gain %u", lna_gain);
467                 return -EINVAL;
468         }
469
470         return rf69_read_mod_write(spi, REG_LNA, MASK_LNA_GAIN,
471                                    lna_gain_map[lna_gain]);
472 }
473
474 static int rf69_set_bandwidth_intern(struct spi_device *spi, u8 reg,
475                                      enum mantisse mantisse, u8 exponent)
476 {
477         u8 bandwidth;
478
479         // check value for mantisse and exponent
480         if (exponent > 7) {
481                 dev_dbg(&spi->dev, "set: illegal bandwidth exponent %u", exponent);
482                 return -EINVAL;
483         }
484
485         if (mantisse != mantisse16 &&
486             mantisse != mantisse20 &&
487             mantisse != mantisse24) {
488                 dev_dbg(&spi->dev, "set: illegal bandwidth mantisse %u", mantisse);
489                 return -EINVAL;
490         }
491
492         // read old value
493         bandwidth = rf69_read_reg(spi, reg);
494
495         // "delete" mantisse and exponent = just keep the DCC setting
496         bandwidth = bandwidth & MASK_BW_DCC_FREQ;
497
498         // add new mantisse
499         switch (mantisse) {
500         case mantisse16:
501                 bandwidth = bandwidth | BW_MANT_16;
502                 break;
503         case mantisse20:
504                 bandwidth = bandwidth | BW_MANT_20;
505                 break;
506         case mantisse24:
507                 bandwidth = bandwidth | BW_MANT_24;
508                 break;
509         }
510
511         // add new exponent
512         bandwidth = bandwidth | exponent;
513
514         // write back
515         return rf69_write_reg(spi, reg, bandwidth);
516 }
517
518 int rf69_set_bandwidth(struct spi_device *spi, enum mantisse mantisse,
519                        u8 exponent)
520 {
521         return rf69_set_bandwidth_intern(spi, REG_RXBW, mantisse, exponent);
522 }
523
524 int rf69_set_bandwidth_during_afc(struct spi_device *spi,
525                                   enum mantisse mantisse,
526                                   u8 exponent)
527 {
528         return rf69_set_bandwidth_intern(spi, REG_AFCBW, mantisse, exponent);
529 }
530
531 int rf69_set_ook_threshold_dec(struct spi_device *spi,
532                                enum threshold_decrement threshold_decrement)
533 {
534         static const u8 td_map[] = {
535                 [dec_every8th] = OOKPEAK_THRESHDEC_EVERY_8TH,
536                 [dec_every4th] = OOKPEAK_THRESHDEC_EVERY_4TH,
537                 [dec_every2nd] = OOKPEAK_THRESHDEC_EVERY_2ND,
538                 [dec_once] = OOKPEAK_THRESHDEC_ONCE,
539                 [dec_twice] = OOKPEAK_THRESHDEC_TWICE,
540                 [dec_4times] = OOKPEAK_THRESHDEC_4_TIMES,
541                 [dec_8times] = OOKPEAK_THRESHDEC_8_TIMES,
542                 [dec_16times] = OOKPEAK_THRESHDEC_16_TIMES,
543         };
544
545         if (unlikely(threshold_decrement >= ARRAY_SIZE(td_map))) {
546                 dev_dbg(&spi->dev, "set: illegal OOK threshold decrement %u", threshold_decrement);
547                 return -EINVAL;
548         }
549
550         return rf69_read_mod_write(spi, REG_OOKPEAK, MASK_OOKPEAK_THRESDEC,
551                                    td_map[threshold_decrement]);
552 }
553
554 int rf69_set_dio_mapping(struct spi_device *spi, u8 dio_number, u8 value)
555 {
556         u8 mask;
557         u8 shift;
558         u8 dio_addr;
559         u8 dio_value;
560
561         switch (dio_number) {
562         case 0:
563                 mask = MASK_DIO0;
564                 shift = SHIFT_DIO0;
565                 dio_addr = REG_DIOMAPPING1;
566                 break;
567         case 1:
568                 mask = MASK_DIO1;
569                 shift = SHIFT_DIO1;
570                 dio_addr = REG_DIOMAPPING1;
571                 break;
572         case 2:
573                 mask = MASK_DIO2;
574                 shift = SHIFT_DIO2;
575                 dio_addr = REG_DIOMAPPING1;
576                 break;
577         case 3:
578                 mask = MASK_DIO3;
579                 shift = SHIFT_DIO3;
580                 dio_addr = REG_DIOMAPPING1;
581                 break;
582         case 4:
583                 mask = MASK_DIO4;
584                 shift = SHIFT_DIO4;
585                 dio_addr = REG_DIOMAPPING2;
586                 break;
587         case 5:
588                 mask = MASK_DIO5;
589                 shift = SHIFT_DIO5;
590                 dio_addr = REG_DIOMAPPING2;
591                 break;
592         default:
593                 dev_dbg(&spi->dev, "set: illegal dio number %u", dio_number);
594                 return -EINVAL;
595         }
596
597         // read reg
598         dio_value = rf69_read_reg(spi, dio_addr);
599         // delete old value
600         dio_value = dio_value & ~mask;
601         // add new value
602         dio_value = dio_value | value << shift;
603         // write back
604         return rf69_write_reg(spi, dio_addr, dio_value);
605 }
606
607 bool rf69_get_flag(struct spi_device *spi, enum flag flag)
608 {
609         switch (flag) {
610         case mode_switch_completed:
611                 return (rf69_read_reg(spi, REG_IRQFLAGS1) & MASK_IRQFLAGS1_MODE_READY);
612         case ready_to_receive:
613                 return (rf69_read_reg(spi, REG_IRQFLAGS1) & MASK_IRQFLAGS1_RX_READY);
614         case ready_to_send:
615                 return (rf69_read_reg(spi, REG_IRQFLAGS1) & MASK_IRQFLAGS1_TX_READY);
616         case pll_locked:
617                 return (rf69_read_reg(spi, REG_IRQFLAGS1) & MASK_IRQFLAGS1_PLL_LOCK);
618         case rssi_exceeded_threshold:
619                 return (rf69_read_reg(spi, REG_IRQFLAGS1) & MASK_IRQFLAGS1_RSSI);
620         case timeout:
621                 return (rf69_read_reg(spi, REG_IRQFLAGS1) & MASK_IRQFLAGS1_TIMEOUT);
622         case automode:
623                 return (rf69_read_reg(spi, REG_IRQFLAGS1) & MASK_IRQFLAGS1_AUTOMODE);
624         case sync_address_match:
625                 return (rf69_read_reg(spi, REG_IRQFLAGS1) & MASK_IRQFLAGS1_SYNC_ADDRESS_MATCH);
626         case fifo_full:
627                 return (rf69_read_reg(spi, REG_IRQFLAGS2) & MASK_IRQFLAGS2_FIFO_FULL);
628 /*
629  *      case fifo_not_empty:
630  *              return (rf69_read_reg(spi, REG_IRQFLAGS2) & MASK_IRQFLAGS2_FIFO_NOT_EMPTY);
631  */
632         case fifo_empty:
633                 return !(rf69_read_reg(spi, REG_IRQFLAGS2) & MASK_IRQFLAGS2_FIFO_NOT_EMPTY);
634         case fifo_level_below_threshold:
635                 return (rf69_read_reg(spi, REG_IRQFLAGS2) & MASK_IRQFLAGS2_FIFO_LEVEL);
636         case fifo_overrun:
637                 return (rf69_read_reg(spi, REG_IRQFLAGS2) & MASK_IRQFLAGS2_FIFO_OVERRUN);
638         case packet_sent:
639                 return (rf69_read_reg(spi, REG_IRQFLAGS2) & MASK_IRQFLAGS2_PACKET_SENT);
640         case payload_ready:
641                 return (rf69_read_reg(spi, REG_IRQFLAGS2) & MASK_IRQFLAGS2_PAYLOAD_READY);
642         case crc_ok:
643                 return (rf69_read_reg(spi, REG_IRQFLAGS2) & MASK_IRQFLAGS2_CRC_OK);
644         case battery_low:
645                 return (rf69_read_reg(spi, REG_IRQFLAGS2) & MASK_IRQFLAGS2_LOW_BAT);
646         default:                         return false;
647         }
648 }
649
650 int rf69_set_rssi_threshold(struct spi_device *spi, u8 threshold)
651 {
652         /* no value check needed - u8 exactly matches register size */
653
654         return rf69_write_reg(spi, REG_RSSITHRESH, threshold);
655 }
656
657 int rf69_set_preamble_length(struct spi_device *spi, u16 preamble_length)
658 {
659         int retval;
660         u8 msb, lsb;
661
662         /* no value check needed - u16 exactly matches register size */
663
664         /* calculate reg settings */
665         msb = (preamble_length & 0xff00) >> 8;
666         lsb = (preamble_length & 0xff);
667
668         /* transmit to chip */
669         retval = rf69_write_reg(spi, REG_PREAMBLE_MSB, msb);
670         if (retval)
671                 return retval;
672         return rf69_write_reg(spi, REG_PREAMBLE_LSB, lsb);
673 }
674
675 int rf69_enable_sync(struct spi_device *spi)
676 {
677         return rf69_set_bit(spi, REG_SYNC_CONFIG, MASK_SYNC_CONFIG_SYNC_ON);
678 }
679
680 int rf69_disable_sync(struct spi_device *spi)
681 {
682         return rf69_clear_bit(spi, REG_SYNC_CONFIG, MASK_SYNC_CONFIG_SYNC_ON);
683 }
684
685 int rf69_set_fifo_fill_condition(struct spi_device *spi,
686                                  enum fifo_fill_condition fifo_fill_condition)
687 {
688         switch (fifo_fill_condition) {
689         case always:
690                 return rf69_set_bit(spi, REG_SYNC_CONFIG,
691                                     MASK_SYNC_CONFIG_FIFO_FILL_CONDITION);
692         case after_sync_interrupt:
693                 return rf69_clear_bit(spi, REG_SYNC_CONFIG,
694                                       MASK_SYNC_CONFIG_FIFO_FILL_CONDITION);
695         default:
696                 dev_dbg(&spi->dev, "set: illegal fifo fill condition %u", fifo_fill_condition);
697                 return -EINVAL;
698         }
699 }
700
701 int rf69_set_sync_size(struct spi_device *spi, u8 sync_size)
702 {
703         // check input value
704         if (sync_size > 0x07) {
705                 dev_dbg(&spi->dev, "set: illegal sync size %u", sync_size);
706                 return -EINVAL;
707         }
708
709         // write value
710         return rf69_read_mod_write(spi, REG_SYNC_CONFIG,
711                                    MASK_SYNC_CONFIG_SYNC_SIZE,
712                                    (sync_size << 3));
713 }
714
715 int rf69_set_sync_values(struct spi_device *spi, u8 sync_values[8])
716 {
717         int retval = 0;
718
719         retval += rf69_write_reg(spi, REG_SYNCVALUE1, sync_values[0]);
720         retval += rf69_write_reg(spi, REG_SYNCVALUE2, sync_values[1]);
721         retval += rf69_write_reg(spi, REG_SYNCVALUE3, sync_values[2]);
722         retval += rf69_write_reg(spi, REG_SYNCVALUE4, sync_values[3]);
723         retval += rf69_write_reg(spi, REG_SYNCVALUE5, sync_values[4]);
724         retval += rf69_write_reg(spi, REG_SYNCVALUE6, sync_values[5]);
725         retval += rf69_write_reg(spi, REG_SYNCVALUE7, sync_values[6]);
726         retval += rf69_write_reg(spi, REG_SYNCVALUE8, sync_values[7]);
727
728         return retval;
729 }
730
731 int rf69_set_packet_format(struct spi_device *spi,
732                            enum packet_format packet_format)
733 {
734         switch (packet_format) {
735         case packet_length_var:
736                 return rf69_set_bit(spi, REG_PACKETCONFIG1,
737                                     MASK_PACKETCONFIG1_PACKET_FORMAT_VARIABLE);
738         case packet_length_fix:
739                 return rf69_clear_bit(spi, REG_PACKETCONFIG1,
740                                       MASK_PACKETCONFIG1_PACKET_FORMAT_VARIABLE);
741         default:
742                 dev_dbg(&spi->dev, "set: illegal packet format %u", packet_format);
743                 return -EINVAL;
744         }
745 }
746
747 int rf69_enable_crc(struct spi_device *spi)
748 {
749         return rf69_set_bit(spi, REG_PACKETCONFIG1, MASK_PACKETCONFIG1_CRC_ON);
750 }
751
752 int rf69_disable_crc(struct spi_device *spi)
753 {
754         return rf69_clear_bit(spi, REG_PACKETCONFIG1, MASK_PACKETCONFIG1_CRC_ON);
755 }
756
757 int rf69_set_address_filtering(struct spi_device *spi,
758                                enum address_filtering address_filtering)
759 {
760         static const u8 af_map[] = {
761                 [filtering_off] = PACKETCONFIG1_ADDRESSFILTERING_OFF,
762                 [node_address] = PACKETCONFIG1_ADDRESSFILTERING_NODE,
763                 [node_or_broadcast_address] =
764                         PACKETCONFIG1_ADDRESSFILTERING_NODEBROADCAST,
765         };
766
767         if (unlikely(address_filtering >= ARRAY_SIZE(af_map))) {
768                 dev_dbg(&spi->dev, "set: illegal address filtering %u", address_filtering);
769                 return -EINVAL;
770         }
771
772         return rf69_read_mod_write(spi, REG_PACKETCONFIG1,
773                                    MASK_PACKETCONFIG1_ADDRESSFILTERING,
774                                    af_map[address_filtering]);
775 }
776
777 int rf69_set_payload_length(struct spi_device *spi, u8 payload_length)
778 {
779         return rf69_write_reg(spi, REG_PAYLOAD_LENGTH, payload_length);
780 }
781
782 int rf69_set_node_address(struct spi_device *spi, u8 node_address)
783 {
784         return rf69_write_reg(spi, REG_NODEADRS, node_address);
785 }
786
787 int rf69_set_broadcast_address(struct spi_device *spi, u8 broadcast_address)
788 {
789         return rf69_write_reg(spi, REG_BROADCASTADRS, broadcast_address);
790 }
791
792 int rf69_set_tx_start_condition(struct spi_device *spi,
793                                 enum tx_start_condition tx_start_condition)
794 {
795         switch (tx_start_condition) {
796         case fifo_level:
797                 return rf69_clear_bit(spi, REG_FIFO_THRESH,
798                                       MASK_FIFO_THRESH_TXSTART);
799         case fifo_not_empty:
800                 return rf69_set_bit(spi, REG_FIFO_THRESH,
801                                     MASK_FIFO_THRESH_TXSTART);
802         default:
803                 dev_dbg(&spi->dev, "set: illegal tx start condition %u", tx_start_condition);
804                 return -EINVAL;
805         }
806 }
807
808 int rf69_set_fifo_threshold(struct spi_device *spi, u8 threshold)
809 {
810         int retval;
811
812         /* check input value */
813         if (threshold & 0x80) {
814                 dev_dbg(&spi->dev, "set: illegal fifo threshold %u", threshold);
815                 return -EINVAL;
816         }
817
818         /* write value */
819         retval = rf69_read_mod_write(spi, REG_FIFO_THRESH,
820                                      MASK_FIFO_THRESH_VALUE,
821                                      threshold);
822         if (retval)
823                 return retval;
824
825         /*
826          * access the fifo to activate new threshold
827          * retval (mis-) used as buffer here
828          */
829         return rf69_read_fifo(spi, (u8 *)&retval, 1);
830 }
831
832 int rf69_set_dagc(struct spi_device *spi, enum dagc dagc)
833 {
834         static const u8 dagc_map[] = {
835                 [normal_mode] = DAGC_NORMAL,
836                 [improve] = DAGC_IMPROVED_LOWBETA0,
837                 [improve_for_low_modulation_index] = DAGC_IMPROVED_LOWBETA1,
838         };
839
840         if (unlikely(dagc >= ARRAY_SIZE(dagc_map))) {
841                 dev_dbg(&spi->dev, "set: illegal dagc %u", dagc);
842                 return -EINVAL;
843         }
844
845         return rf69_write_reg(spi, REG_TESTDAGC, dagc_map[dagc]);
846 }
847
848 /*-------------------------------------------------------------------------*/
849
850 int rf69_read_fifo(struct spi_device *spi, u8 *buffer, unsigned int size)
851 {
852 #ifdef DEBUG_FIFO_ACCESS
853         int i;
854 #endif
855         struct spi_transfer transfer;
856         u8 local_buffer[FIFO_SIZE + 1];
857         int retval;
858
859         if (size > FIFO_SIZE) {
860                 dev_dbg(&spi->dev,
861                         "read fifo: passed in buffer bigger then internal buffer\n");
862                 return -EMSGSIZE;
863         }
864
865         /* prepare a bidirectional transfer */
866         local_buffer[0] = REG_FIFO;
867         memset(&transfer, 0, sizeof(transfer));
868         transfer.tx_buf = local_buffer;
869         transfer.rx_buf = local_buffer;
870         transfer.len    = size + 1;
871
872         retval = spi_sync_transfer(spi, &transfer, 1);
873
874 #ifdef DEBUG_FIFO_ACCESS
875         for (i = 0; i < size; i++)
876                 dev_dbg(&spi->dev, "%d - 0x%x\n", i, local_buffer[i + 1]);
877 #endif
878
879         memcpy(buffer, &local_buffer[1], size);
880
881         return retval;
882 }
883
884 int rf69_write_fifo(struct spi_device *spi, u8 *buffer, unsigned int size)
885 {
886 #ifdef DEBUG_FIFO_ACCESS
887         int i;
888 #endif
889         u8 local_buffer[FIFO_SIZE + 1];
890
891         if (size > FIFO_SIZE) {
892                 dev_dbg(&spi->dev,
893                         "read fifo: passed in buffer bigger then internal buffer\n");
894                 return -EMSGSIZE;
895         }
896
897         local_buffer[0] = REG_FIFO | WRITE_BIT;
898         memcpy(&local_buffer[1], buffer, size);
899
900 #ifdef DEBUG_FIFO_ACCESS
901         for (i = 0; i < size; i++)
902                 dev_dbg(&spi->dev, "0x%x\n", buffer[i]);
903 #endif
904
905         return spi_write(spi, local_buffer, size + 1);
906 }
907