hc
2024-01-05 071106ecf68c401173c58808b1cf5f68cc50d390
kernel/drivers/staging/pi433/rf69.c
....@@ -4,16 +4,6 @@
44 *
55 * Copyright (C) 2016 Wolf-Entwicklungen
66 * Marcus Wolf <linux@wolf-entwicklungen.de>
7
- *
8
- * This program is free software; you can redistribute it and/or modify
9
- * it under the terms of the GNU General Public License as published by
10
- * the Free Software Foundation; either version 2 of the License, or
11
- * (at your option) any later version.
12
- *
13
- * This program is distributed in the hope that it will be useful,
14
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
- * GNU General Public License for more details.
177 */
188
199 /* enable prosa debug info */
....@@ -359,18 +349,51 @@
359349
360350 int rf69_set_output_power_level(struct spi_device *spi, u8 power_level)
361351 {
362
- // TODO: Dependency to PA0,1,2 setting
363
- power_level += 18;
352
+ u8 pa_level, ocp, test_pa1, test_pa2;
353
+ bool pa0, pa1, pa2, high_power;
354
+ u8 min_power_level;
355
+
356
+ // check register pa_level
357
+ pa_level = rf69_read_reg(spi, REG_PALEVEL);
358
+ pa0 = pa_level & MASK_PALEVEL_PA0;
359
+ pa1 = pa_level & MASK_PALEVEL_PA1;
360
+ pa2 = pa_level & MASK_PALEVEL_PA2;
361
+
362
+ // check high power mode
363
+ ocp = rf69_read_reg(spi, REG_OCP);
364
+ test_pa1 = rf69_read_reg(spi, REG_TESTPA1);
365
+ test_pa2 = rf69_read_reg(spi, REG_TESTPA2);
366
+ high_power = (ocp == 0x0f) && (test_pa1 == 0x5d) && (test_pa2 == 0x7c);
367
+
368
+ if (pa0 && !pa1 && !pa2) {
369
+ power_level += 18;
370
+ min_power_level = 0;
371
+ } else if (!pa0 && pa1 && !pa2) {
372
+ power_level += 18;
373
+ min_power_level = 16;
374
+ } else if (!pa0 && pa1 && pa2) {
375
+ if (high_power)
376
+ power_level += 11;
377
+ else
378
+ power_level += 14;
379
+ min_power_level = 16;
380
+ } else {
381
+ goto failed;
382
+ }
364383
365384 // check input value
366
- if (power_level > 0x1f) {
367
- dev_dbg(&spi->dev, "set: illegal input param");
368
- return -EINVAL;
369
- }
385
+ if (power_level > 0x1f)
386
+ goto failed;
387
+
388
+ if (power_level < min_power_level)
389
+ goto failed;
370390
371391 // write value
372392 return rf69_read_mod_write(spi, REG_PALEVEL, MASK_PALEVEL_OUTPUT_POWER,
373393 power_level);
394
+failed:
395
+ dev_dbg(&spi->dev, "set: illegal input param");
396
+ return -EINVAL;
374397 }
375398
376399 int rf69_set_pa_ramp(struct spi_device *spi, enum pa_ramp pa_ramp)
....@@ -634,9 +657,7 @@
634657 retval = rf69_write_reg(spi, REG_PREAMBLE_MSB, msb);
635658 if (retval)
636659 return retval;
637
- retval = rf69_write_reg(spi, REG_PREAMBLE_LSB, lsb);
638
-
639
- return retval;
660
+ return rf69_write_reg(spi, REG_PREAMBLE_LSB, lsb);
640661 }
641662
642663 int rf69_enable_sync(struct spi_device *spi)
....@@ -701,10 +722,10 @@
701722 switch (packet_format) {
702723 case packet_length_var:
703724 return rf69_set_bit(spi, REG_PACKETCONFIG1,
704
- MASK_PACKETCONFIG1_PAKET_FORMAT_VARIABLE);
725
+ MASK_PACKETCONFIG1_PACKET_FORMAT_VARIABLE);
705726 case packet_length_fix:
706727 return rf69_clear_bit(spi, REG_PACKETCONFIG1,
707
- MASK_PACKETCONFIG1_PAKET_FORMAT_VARIABLE);
728
+ MASK_PACKETCONFIG1_PACKET_FORMAT_VARIABLE);
708729 default:
709730 dev_dbg(&spi->dev, "set: illegal input param");
710731 return -EINVAL;
....@@ -853,7 +874,6 @@
853874 #ifdef DEBUG_FIFO_ACCESS
854875 int i;
855876 #endif
856
- char spi_address = REG_FIFO | WRITE_BIT;
857877 u8 local_buffer[FIFO_SIZE + 1];
858878
859879 if (size > FIFO_SIZE) {
....@@ -862,7 +882,7 @@
862882 return -EMSGSIZE;
863883 }
864884
865
- local_buffer[0] = spi_address;
885
+ local_buffer[0] = REG_FIFO | WRITE_BIT;
866886 memcpy(&local_buffer[1], buffer, size);
867887
868888 #ifdef DEBUG_FIFO_ACCESS