Switched rockchip64 curent to kernel 5.8.y (#2175)
* Switched rockchip64 curent to kernel 5.8.y * Enforce CRLF in one of the wifi patches for rockchip64-current * Removed uneeded wifi patches for rtl8189fs from rockchip64-current
This commit is contained in:
parent
3dffdede89
commit
4d4c3f58ff
File diff suppressed because it is too large
Load Diff
@ -68,7 +68,7 @@ case $BRANCH in
|
||||
current)
|
||||
|
||||
KERNELPATCHDIR='rockchip64-'$BRANCH
|
||||
KERNELBRANCH="branch:linux-5.7.y"
|
||||
KERNELBRANCH="branch:linux-5.8.y"
|
||||
LINUXFAMILY=rockchip64
|
||||
LINUXCONFIG='linux-rockchip64-'$BRANCH
|
||||
|
||||
|
||||
@ -1,909 +0,0 @@
|
||||
From bafb1b58516e5794cfb4533309492dca2b56c522 Mon Sep 17 00:00:00 2001
|
||||
From: Dan Johansen <strit@manjaro.org>
|
||||
Date: Sat, 30 May 2020 10:53:56 +0200
|
||||
Subject: [PATCH] drivers/power/supply Add support for cw2015
|
||||
|
||||
---
|
||||
.../bindings/power/supply/cw2015_battery.yaml | 83 ++
|
||||
.../devicetree/bindings/vendor-prefixes.yaml | 2 +
|
||||
drivers/power/supply/Kconfig | 11 +
|
||||
drivers/power/supply/Makefile | 1 +
|
||||
drivers/power/supply/cw2015-battery.c | 749 ++++++++++++++++++
|
||||
5 files changed, 846 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/power/supply/cw2015_battery.yaml
|
||||
create mode 100644 drivers/power/supply/cw2015-battery.c
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/power/supply/cw2015_battery.yaml b/Documentation/devicetree/bindings/power/supply/cw2015_battery.yaml
|
||||
new file mode 100644
|
||||
index 000000000000..0c0181ae27c9
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/power/supply/cw2015_battery.yaml
|
||||
@@ -0,0 +1,83 @@
|
||||
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/power/supply/cw2015_battery.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: Battery driver for CW2015 shuntless fuel gauge by CellWise.
|
||||
+
|
||||
+maintainers:
|
||||
+ - Tobias Schramm <t.schramm@manjaro.org>
|
||||
+
|
||||
+description: |
|
||||
+ The driver can utilize information from a simple-battery linked via a
|
||||
+ phandle in monitored-battery. If specified the driver uses the
|
||||
+ charge-full-design-microamp-hours property of the battery.
|
||||
+
|
||||
+properties:
|
||||
+ compatible:
|
||||
+ const: cellwise,cw2015
|
||||
+
|
||||
+ reg:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+ cellwise,battery-profile:
|
||||
+ description: |
|
||||
+ This property specifies characteristics of the battery used. The format
|
||||
+ of this binary blob is kept secret by CellWise. The only way to obtain
|
||||
+ it is to mail two batteries to a test facility of CellWise and receive
|
||||
+ back a test report with the binary blob.
|
||||
+ allOf:
|
||||
+ - $ref: /schemas/types.yaml#definitions/uint8-array
|
||||
+ items:
|
||||
+ - minItems: 64
|
||||
+ maxItems: 64
|
||||
+
|
||||
+ cellwise,monitor-interval-ms:
|
||||
+ description:
|
||||
+ Specifies the interval in milliseconds gauge values are polled at
|
||||
+ minimum: 250
|
||||
+
|
||||
+ power-supplies:
|
||||
+ description:
|
||||
+ Specifies supplies used for charging the battery connected to this gauge
|
||||
+ allOf:
|
||||
+ - $ref: /schemas/types.yaml#/definitions/phandle-array
|
||||
+ - minItems: 1
|
||||
+ maxItems: 8 # Should be enough
|
||||
+
|
||||
+ monitored-battery:
|
||||
+ description:
|
||||
+ Specifies the phandle of a simple-battery connected to this gauge
|
||||
+ $ref: /schemas/types.yaml#/definitions/phandle
|
||||
+
|
||||
+required:
|
||||
+ - compatible
|
||||
+ - reg
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ i2c {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ cw2015@62 {
|
||||
+ compatible = "cellwise,cw201x";
|
||||
+ reg = <0x62>;
|
||||
+ cellwise,battery-profile = /bits/ 8 <
|
||||
+ 0x17 0x67 0x80 0x73 0x6E 0x6C 0x6B 0x63
|
||||
+ 0x77 0x51 0x5C 0x58 0x50 0x4C 0x48 0x36
|
||||
+ 0x15 0x0C 0x0C 0x19 0x5B 0x7D 0x6F 0x69
|
||||
+ 0x69 0x5B 0x0C 0x29 0x20 0x40 0x52 0x59
|
||||
+ 0x57 0x56 0x54 0x4F 0x3B 0x1F 0x7F 0x17
|
||||
+ 0x06 0x1A 0x30 0x5A 0x85 0x93 0x96 0x2D
|
||||
+ 0x48 0x77 0x9C 0xB3 0x80 0x52 0x94 0xCB
|
||||
+ 0x2F 0x00 0x64 0xA5 0xB5 0x11 0xF0 0x11
|
||||
+ >;
|
||||
+ cellwise,monitor-interval-ms = <5000>;
|
||||
+ monitored-battery = <&bat>;
|
||||
+ power-supplies = <&mains_charger>, <&usb_charger>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+
|
||||
diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Documentation/devicetree/bindings/vendor-prefixes.yaml
|
||||
index d3891386d671..58cf4e8b8d56 100644
|
||||
--- a/Documentation/devicetree/bindings/vendor-prefixes.yaml
|
||||
+++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml
|
||||
@@ -179,6 +179,8 @@ patternProperties:
|
||||
description: Cadence Design Systems Inc.
|
||||
"^cdtech,.*":
|
||||
description: CDTech(H.K.) Electronics Limited
|
||||
+ "^cellwise,.*":
|
||||
+ description: CellWise Microelectronics Co., Ltd
|
||||
"^ceva,.*":
|
||||
description: Ceva, Inc.
|
||||
"^chipidea,.*":
|
||||
diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig
|
||||
index f3424fdce341..7953e6c92521 100644
|
||||
--- a/drivers/power/supply/Kconfig
|
||||
+++ b/drivers/power/supply/Kconfig
|
||||
@@ -116,6 +116,17 @@ config BATTERY_CPCAP
|
||||
Say Y here to enable support for battery on Motorola
|
||||
phones and tablets such as droid 4.
|
||||
|
||||
+config BATTERY_CW2015
|
||||
+ tristate "CW2015 Battery driver"
|
||||
+ depends on I2C
|
||||
+ select REGMAP_I2C
|
||||
+ help
|
||||
+ Say Y here to enable support for the cellwise cw2015
|
||||
+ battery fuel gauge (used in the Pinebook Pro & others)
|
||||
+
|
||||
+ This driver can also be built as a module. If so, the module will be
|
||||
+ called cw2015_battery.
|
||||
+
|
||||
config BATTERY_DS2760
|
||||
tristate "DS2760 battery driver (HP iPAQ & others)"
|
||||
depends on W1
|
||||
diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makefile
|
||||
index 6c7da920ea83..69727a10e835 100644
|
||||
--- a/drivers/power/supply/Makefile
|
||||
+++ b/drivers/power/supply/Makefile
|
||||
@@ -24,6 +24,7 @@ obj-$(CONFIG_BATTERY_ACT8945A) += act8945a_charger.o
|
||||
obj-$(CONFIG_BATTERY_AXP20X) += axp20x_battery.o
|
||||
obj-$(CONFIG_CHARGER_AXP20X) += axp20x_ac_power.o
|
||||
obj-$(CONFIG_BATTERY_CPCAP) += cpcap-battery.o
|
||||
+obj-$(CONFIG_BATTERY_CW2015) += cw2015_battery.o
|
||||
obj-$(CONFIG_BATTERY_DS2760) += ds2760_battery.o
|
||||
obj-$(CONFIG_BATTERY_DS2780) += ds2780_battery.o
|
||||
obj-$(CONFIG_BATTERY_DS2781) += ds2781_battery.o
|
||||
diff --git a/drivers/power/supply/cw2015_battery.c b/drivers/power/supply/cw2015_battery.c
|
||||
new file mode 100644
|
||||
index 000000000000..19f62ea957ee
|
||||
--- /dev/null
|
||||
+++ b/drivers/power/supply/cw2015_battery.c
|
||||
@@ -0,0 +1,749 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+/*
|
||||
+ * Fuel gauge driver for CellWise 2013 / 2015
|
||||
+ *
|
||||
+ * Copyright (C) 2012, RockChip
|
||||
+ * Copyright (C) 2020, Tobias Schramm
|
||||
+ *
|
||||
+ * Authors: xuhuicong <xhc@rock-chips.com>
|
||||
+ * Authors: Tobias Schramm <t.schramm@manjaro.org>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/bits.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/i2c.h>
|
||||
+#include <linux/gfp.h>
|
||||
+#include <linux/gpio/consumer.h>
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/power_supply.h>
|
||||
+#include <linux/property.h>
|
||||
+#include <linux/regmap.h>
|
||||
+#include <linux/time.h>
|
||||
+#include <linux/workqueue.h>
|
||||
+
|
||||
+#define CW2015_SIZE_BATINFO 64
|
||||
+
|
||||
+#define CW2015_RESET_TRIES 5
|
||||
+
|
||||
+#define CW2015_REG_VERSION 0x00
|
||||
+#define CW2015_REG_VCELL 0x02
|
||||
+#define CW2015_REG_SOC 0x04
|
||||
+#define CW2015_REG_RRT_ALERT 0x06
|
||||
+#define CW2015_REG_CONFIG 0x08
|
||||
+#define CW2015_REG_MODE 0x0A
|
||||
+#define CW2015_REG_BATINFO 0x10
|
||||
+
|
||||
+#define CW2015_MODE_SLEEP_MASK GENMASK(7, 6)
|
||||
+#define CW2015_MODE_SLEEP (0x03 << 6)
|
||||
+#define CW2015_MODE_NORMAL (0x00 << 6)
|
||||
+#define CW2015_MODE_QUICK_START (0x03 << 4)
|
||||
+#define CW2015_MODE_RESTART (0x0f << 0)
|
||||
+
|
||||
+#define CW2015_CONFIG_UPDATE_FLG (0x01 << 1)
|
||||
+#define CW2015_ATHD(x) ((x) << 3)
|
||||
+#define CW2015_MASK_ATHD GENMASK(7, 3)
|
||||
+#define CW2015_MASK_SOC GENMASK(12, 0)
|
||||
+
|
||||
+/* reset gauge of no valid state of charge could be polled for 40s */
|
||||
+#define CW2015_BAT_SOC_ERROR_MS (40 * MSEC_PER_SEC)
|
||||
+/* reset gauge if state of charge stuck for half an hour during charging */
|
||||
+#define CW2015_BAT_CHARGING_STUCK_MS (1800 * MSEC_PER_SEC)
|
||||
+
|
||||
+/* poll interval from CellWise GPL Android driver example */
|
||||
+#define CW2015_DEFAULT_POLL_INTERVAL_MS 8000
|
||||
+
|
||||
+#define CW2015_AVERAGING_SAMPLES 3
|
||||
+
|
||||
+struct cw_battery {
|
||||
+ struct device *dev;
|
||||
+ struct workqueue_struct *battery_workqueue;
|
||||
+ struct delayed_work battery_delay_work;
|
||||
+ struct regmap *regmap;
|
||||
+ struct power_supply *rk_bat;
|
||||
+ struct power_supply_battery_info battery;
|
||||
+ u8 *bat_profile;
|
||||
+
|
||||
+ bool charger_attached;
|
||||
+ bool battery_changed;
|
||||
+
|
||||
+ int soc;
|
||||
+ int voltage_mv;
|
||||
+ int status;
|
||||
+ int time_to_empty;
|
||||
+ int charge_count;
|
||||
+
|
||||
+ u32 poll_interval_ms;
|
||||
+ u8 alert_level;
|
||||
+
|
||||
+ unsigned int read_errors;
|
||||
+ unsigned int charge_stuck_cnt;
|
||||
+};
|
||||
+
|
||||
+static int cw_read_word(struct cw_battery *cw_bat, u8 reg, u16 *val)
|
||||
+{
|
||||
+ __be16 value;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = regmap_bulk_read(cw_bat->regmap, reg, &value, sizeof(value));
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ *val = be16_to_cpu(value);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int cw_update_profile(struct cw_battery *cw_bat)
|
||||
+{
|
||||
+ int ret;
|
||||
+ unsigned int reg_val;
|
||||
+ u8 reset_val;
|
||||
+
|
||||
+ /* make sure gauge is not in sleep mode */
|
||||
+ ret = regmap_read(cw_bat->regmap, CW2015_REG_MODE, ®_val);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ reset_val = reg_val;
|
||||
+ if ((reg_val & CW2015_MODE_SLEEP_MASK) == CW2015_MODE_SLEEP) {
|
||||
+ dev_err(cw_bat->dev,
|
||||
+ "Gauge is in sleep mode, can't update battery info\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ /* write new battery info */
|
||||
+ ret = regmap_raw_write(cw_bat->regmap, CW2015_REG_BATINFO,
|
||||
+ cw_bat->bat_profile,
|
||||
+ CW2015_SIZE_BATINFO);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* set config update flag */
|
||||
+ reg_val |= CW2015_CONFIG_UPDATE_FLG;
|
||||
+ reg_val &= ~CW2015_MASK_ATHD;
|
||||
+ reg_val |= CW2015_ATHD(cw_bat->alert_level);
|
||||
+ ret = regmap_write(cw_bat->regmap, CW2015_REG_CONFIG, reg_val);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* reset gauge to apply new battery profile */
|
||||
+ reset_val &= ~CW2015_MODE_RESTART;
|
||||
+ reg_val = reset_val | CW2015_MODE_RESTART;
|
||||
+ ret = regmap_write(cw_bat->regmap, CW2015_REG_MODE, reg_val);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* wait for gauge to reset */
|
||||
+ msleep(20);
|
||||
+
|
||||
+ /* clear reset flag */
|
||||
+ ret = regmap_write(cw_bat->regmap, CW2015_REG_MODE, reset_val);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* wait for gauge to become ready */
|
||||
+ ret = regmap_read_poll_timeout(cw_bat->regmap, CW2015_REG_SOC,
|
||||
+ reg_val, reg_val <= 100,
|
||||
+ 10 * USEC_PER_MSEC, 10 * USEC_PER_SEC);
|
||||
+ if (ret)
|
||||
+ dev_err(cw_bat->dev,
|
||||
+ "Gauge did not become ready after profile upload\n");
|
||||
+ else
|
||||
+ dev_dbg(cw_bat->dev, "Battery profile updated\n");
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int cw_init(struct cw_battery *cw_bat)
|
||||
+{
|
||||
+ int ret;
|
||||
+ unsigned int reg_val = CW2015_MODE_SLEEP;
|
||||
+
|
||||
+ if ((reg_val & CW2015_MODE_SLEEP_MASK) == CW2015_MODE_SLEEP) {
|
||||
+ reg_val = CW2015_MODE_NORMAL;
|
||||
+ ret = regmap_write(cw_bat->regmap, CW2015_REG_MODE, reg_val);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ ret = regmap_read(cw_bat->regmap, CW2015_REG_CONFIG, ®_val);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ if ((reg_val & CW2015_MASK_ATHD) != CW2015_ATHD(cw_bat->alert_level)) {
|
||||
+ dev_dbg(cw_bat->dev, "Setting new alert level\n");
|
||||
+ reg_val &= ~CW2015_MASK_ATHD;
|
||||
+ reg_val |= ~CW2015_ATHD(cw_bat->alert_level);
|
||||
+ ret = regmap_write(cw_bat->regmap, CW2015_REG_CONFIG, reg_val);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ ret = regmap_read(cw_bat->regmap, CW2015_REG_CONFIG, ®_val);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ if (!(reg_val & CW2015_CONFIG_UPDATE_FLG)) {
|
||||
+ dev_dbg(cw_bat->dev,
|
||||
+ "Battery profile not present, uploading battery profile\n");
|
||||
+ if (cw_bat->bat_profile) {
|
||||
+ ret = cw_update_profile(cw_bat);
|
||||
+ if (ret) {
|
||||
+ dev_err(cw_bat->dev,
|
||||
+ "Failed to upload battery profile\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+ } else {
|
||||
+ dev_warn(cw_bat->dev,
|
||||
+ "No profile specified, continuing without profile\n");
|
||||
+ }
|
||||
+ } else if (cw_bat->bat_profile) {
|
||||
+ u8 bat_info[CW2015_SIZE_BATINFO];
|
||||
+
|
||||
+ ret = regmap_raw_read(cw_bat->regmap, CW2015_REG_BATINFO,
|
||||
+ bat_info, CW2015_SIZE_BATINFO);
|
||||
+ if (ret) {
|
||||
+ dev_err(cw_bat->dev,
|
||||
+ "Failed to read stored battery profile\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ if (memcmp(bat_info, cw_bat->bat_profile, CW2015_SIZE_BATINFO)) {
|
||||
+ dev_warn(cw_bat->dev, "Replacing stored battery profile\n");
|
||||
+ ret = cw_update_profile(cw_bat);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ }
|
||||
+ } else {
|
||||
+ dev_warn(cw_bat->dev,
|
||||
+ "Can't check current battery profile, no profile provided\n");
|
||||
+ }
|
||||
+
|
||||
+ dev_dbg(cw_bat->dev, "Battery profile configured\n");
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int cw_power_on_reset(struct cw_battery *cw_bat)
|
||||
+{
|
||||
+ int ret;
|
||||
+ unsigned char reset_val;
|
||||
+
|
||||
+ reset_val = CW2015_MODE_SLEEP;
|
||||
+ ret = regmap_write(cw_bat->regmap, CW2015_REG_MODE, reset_val);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* wait for gauge to enter sleep */
|
||||
+ msleep(20);
|
||||
+
|
||||
+ reset_val = CW2015_MODE_NORMAL;
|
||||
+ ret = regmap_write(cw_bat->regmap, CW2015_REG_MODE, reset_val);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ ret = cw_init(cw_bat);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#define HYSTERESIS(current, previous, up, down) \
|
||||
+ (((current) < (previous) + (up)) && ((current) > (previous) - (down)))
|
||||
+
|
||||
+static int cw_get_soc(struct cw_battery *cw_bat)
|
||||
+{
|
||||
+ unsigned int soc;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = regmap_read(cw_bat->regmap, CW2015_REG_SOC, &soc);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ if (soc > 100) {
|
||||
+ int max_error_cycles =
|
||||
+ CW2015_BAT_SOC_ERROR_MS / cw_bat->poll_interval_ms;
|
||||
+
|
||||
+ dev_err(cw_bat->dev, "Invalid SoC %d%%\n", soc);
|
||||
+ cw_bat->read_errors++;
|
||||
+ if (cw_bat->read_errors > max_error_cycles) {
|
||||
+ dev_warn(cw_bat->dev,
|
||||
+ "Too many invalid SoC reports, resetting gauge\n");
|
||||
+ cw_power_on_reset(cw_bat);
|
||||
+ cw_bat->read_errors = 0;
|
||||
+ }
|
||||
+ return cw_bat->soc;
|
||||
+ }
|
||||
+ cw_bat->read_errors = 0;
|
||||
+
|
||||
+ /* Reset gauge if stuck while charging */
|
||||
+ if (cw_bat->status == POWER_SUPPLY_STATUS_CHARGING && soc == cw_bat->soc) {
|
||||
+ int max_stuck_cycles =
|
||||
+ CW2015_BAT_CHARGING_STUCK_MS / cw_bat->poll_interval_ms;
|
||||
+
|
||||
+ cw_bat->charge_stuck_cnt++;
|
||||
+ if (cw_bat->charge_stuck_cnt > max_stuck_cycles) {
|
||||
+ dev_warn(cw_bat->dev,
|
||||
+ "SoC stuck @%u%%, resetting gauge\n", soc);
|
||||
+ cw_power_on_reset(cw_bat);
|
||||
+ cw_bat->charge_stuck_cnt = 0;
|
||||
+ }
|
||||
+ } else {
|
||||
+ cw_bat->charge_stuck_cnt = 0;
|
||||
+ }
|
||||
+
|
||||
+ /* Ignore voltage dips during charge */
|
||||
+ if (cw_bat->charger_attached && HYSTERESIS(soc, cw_bat->soc, 0, 3))
|
||||
+ soc = cw_bat->soc;
|
||||
+
|
||||
+ /* Ignore voltage spikes during discharge */
|
||||
+ if (!cw_bat->charger_attached && HYSTERESIS(soc, cw_bat->soc, 3, 0))
|
||||
+ soc = cw_bat->soc;
|
||||
+
|
||||
+ return soc;
|
||||
+}
|
||||
+
|
||||
+static int cw_get_voltage(struct cw_battery *cw_bat)
|
||||
+{
|
||||
+ int ret, i, voltage_mv;
|
||||
+ u16 reg_val;
|
||||
+ u32 avg = 0;
|
||||
+
|
||||
+ for (i = 0; i < CW2015_AVERAGING_SAMPLES; i++) {
|
||||
+ ret = cw_read_word(cw_bat, CW2015_REG_VCELL, ®_val);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ avg += reg_val;
|
||||
+ }
|
||||
+ avg /= CW2015_AVERAGING_SAMPLES;
|
||||
+
|
||||
+ /*
|
||||
+ * 305 uV per ADC step
|
||||
+ * Use 312 / 1024 as efficient approximation of 305 / 1000
|
||||
+ * Negligible error of 0.1%
|
||||
+ */
|
||||
+ voltage_mv = avg * 312 / 1024;
|
||||
+
|
||||
+ dev_dbg(cw_bat->dev, "Read voltage: %d mV, raw=0x%04x\n",
|
||||
+ voltage_mv, reg_val);
|
||||
+ return voltage_mv;
|
||||
+}
|
||||
+
|
||||
+static int cw_get_time_to_empty(struct cw_battery *cw_bat)
|
||||
+{
|
||||
+ int ret;
|
||||
+ u16 value16;
|
||||
+
|
||||
+ ret = cw_read_word(cw_bat, CW2015_REG_RRT_ALERT, &value16);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ return value16 & CW2015_MASK_SOC;
|
||||
+}
|
||||
+
|
||||
+static void cw_update_charge_status(struct cw_battery *cw_bat)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = power_supply_am_i_supplied(cw_bat->rk_bat);
|
||||
+ if (ret < 0) {
|
||||
+ dev_warn(cw_bat->dev, "Failed to get supply state: %d\n", ret);
|
||||
+ } else {
|
||||
+ bool charger_attached;
|
||||
+
|
||||
+ charger_attached = !!ret;
|
||||
+ if (cw_bat->charger_attached != charger_attached) {
|
||||
+ cw_bat->battery_changed = true;
|
||||
+ if (charger_attached)
|
||||
+ cw_bat->charge_count++;
|
||||
+ }
|
||||
+ cw_bat->charger_attached = charger_attached;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void cw_update_soc(struct cw_battery *cw_bat)
|
||||
+{
|
||||
+ int soc;
|
||||
+
|
||||
+ soc = cw_get_soc(cw_bat);
|
||||
+ if (soc < 0)
|
||||
+ dev_err(cw_bat->dev, "Failed to get SoC from gauge: %d\n", soc);
|
||||
+ else if (cw_bat->soc != soc) {
|
||||
+ cw_bat->soc = soc;
|
||||
+ cw_bat->battery_changed = true;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void cw_update_voltage(struct cw_battery *cw_bat)
|
||||
+{
|
||||
+ int voltage_mv;
|
||||
+
|
||||
+ voltage_mv = cw_get_voltage(cw_bat);
|
||||
+ if (voltage_mv < 0)
|
||||
+ dev_err(cw_bat->dev, "Failed to get voltage from gauge: %d\n",
|
||||
+ voltage_mv);
|
||||
+ else
|
||||
+ cw_bat->voltage_mv = voltage_mv;
|
||||
+}
|
||||
+
|
||||
+static void cw_update_status(struct cw_battery *cw_bat)
|
||||
+{
|
||||
+ int status = POWER_SUPPLY_STATUS_DISCHARGING;
|
||||
+
|
||||
+ if (cw_bat->charger_attached) {
|
||||
+ if (cw_bat->soc >= 100)
|
||||
+ status = POWER_SUPPLY_STATUS_FULL;
|
||||
+ else
|
||||
+ status = POWER_SUPPLY_STATUS_CHARGING;
|
||||
+ }
|
||||
+
|
||||
+ if (cw_bat->status != status)
|
||||
+ cw_bat->battery_changed = true;
|
||||
+ cw_bat->status = status;
|
||||
+}
|
||||
+
|
||||
+static void cw_update_time_to_empty(struct cw_battery *cw_bat)
|
||||
+{
|
||||
+ int time_to_empty;
|
||||
+
|
||||
+ time_to_empty = cw_get_time_to_empty(cw_bat);
|
||||
+ if (time_to_empty < 0)
|
||||
+ dev_err(cw_bat->dev, "Failed to get time to empty from gauge: %d\n",
|
||||
+ time_to_empty);
|
||||
+ else if (cw_bat->time_to_empty != time_to_empty) {
|
||||
+ cw_bat->time_to_empty = time_to_empty;
|
||||
+ cw_bat->battery_changed = true;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void cw_bat_work(struct work_struct *work)
|
||||
+{
|
||||
+ struct delayed_work *delay_work;
|
||||
+ struct cw_battery *cw_bat;
|
||||
+ int ret;
|
||||
+ unsigned int reg_val;
|
||||
+
|
||||
+ delay_work = to_delayed_work(work);
|
||||
+ cw_bat = container_of(delay_work, struct cw_battery, battery_delay_work);
|
||||
+ ret = regmap_read(cw_bat->regmap, CW2015_REG_MODE, ®_val);
|
||||
+ if (ret) {
|
||||
+ dev_err(cw_bat->dev, "Failed to read mode from gauge: %d\n", ret);
|
||||
+ } else {
|
||||
+ if ((reg_val & CW2015_MODE_SLEEP_MASK) == CW2015_MODE_SLEEP) {
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < CW2015_RESET_TRIES; i++) {
|
||||
+ if (!cw_power_on_reset(cw_bat))
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ cw_update_soc(cw_bat);
|
||||
+ cw_update_voltage(cw_bat);
|
||||
+ cw_update_charge_status(cw_bat);
|
||||
+ cw_update_status(cw_bat);
|
||||
+ cw_update_time_to_empty(cw_bat);
|
||||
+ }
|
||||
+ dev_dbg(cw_bat->dev, "charger_attached = %d\n", cw_bat->charger_attached);
|
||||
+ dev_dbg(cw_bat->dev, "status = %d\n", cw_bat->status);
|
||||
+ dev_dbg(cw_bat->dev, "soc = %d%%\n", cw_bat->soc);
|
||||
+ dev_dbg(cw_bat->dev, "voltage = %dmV\n", cw_bat->voltage_mv);
|
||||
+
|
||||
+ if (cw_bat->battery_changed)
|
||||
+ power_supply_changed(cw_bat->rk_bat);
|
||||
+ cw_bat->battery_changed = false;
|
||||
+
|
||||
+ queue_delayed_work(cw_bat->battery_workqueue,
|
||||
+ &cw_bat->battery_delay_work,
|
||||
+ msecs_to_jiffies(cw_bat->poll_interval_ms));
|
||||
+}
|
||||
+
|
||||
+static bool cw_battery_valid_time_to_empty(struct cw_battery *cw_bat)
|
||||
+{
|
||||
+ return cw_bat->time_to_empty > 0 &&
|
||||
+ cw_bat->time_to_empty < CW2015_MASK_SOC &&
|
||||
+ cw_bat->status == POWER_SUPPLY_STATUS_DISCHARGING;
|
||||
+}
|
||||
+
|
||||
+static int cw_battery_get_property(struct power_supply *psy,
|
||||
+ enum power_supply_property psp,
|
||||
+ union power_supply_propval *val)
|
||||
+{
|
||||
+ struct cw_battery *cw_bat;
|
||||
+
|
||||
+ cw_bat = power_supply_get_drvdata(psy);
|
||||
+ switch (psp) {
|
||||
+ case POWER_SUPPLY_PROP_CAPACITY:
|
||||
+ val->intval = cw_bat->soc;
|
||||
+ break;
|
||||
+
|
||||
+ case POWER_SUPPLY_PROP_STATUS:
|
||||
+ val->intval = cw_bat->status;
|
||||
+ break;
|
||||
+
|
||||
+ case POWER_SUPPLY_PROP_PRESENT:
|
||||
+ val->intval = !!cw_bat->voltage_mv;
|
||||
+ break;
|
||||
+
|
||||
+ case POWER_SUPPLY_PROP_VOLTAGE_NOW:
|
||||
+ val->intval = cw_bat->voltage_mv * 1000;
|
||||
+ break;
|
||||
+
|
||||
+ case POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW:
|
||||
+ if (cw_battery_valid_time_to_empty(cw_bat))
|
||||
+ val->intval = cw_bat->time_to_empty;
|
||||
+ else
|
||||
+ val->intval = 0;
|
||||
+ break;
|
||||
+
|
||||
+ case POWER_SUPPLY_PROP_TECHNOLOGY:
|
||||
+ val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
|
||||
+ break;
|
||||
+
|
||||
+ case POWER_SUPPLY_PROP_CHARGE_COUNTER:
|
||||
+ val->intval = cw_bat->charge_count;
|
||||
+ break;
|
||||
+
|
||||
+ case POWER_SUPPLY_PROP_CHARGE_FULL:
|
||||
+ case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
|
||||
+ if (cw_bat->battery.charge_full_design_uah > 0)
|
||||
+ val->intval = cw_bat->battery.charge_full_design_uah;
|
||||
+ else
|
||||
+ val->intval = 0;
|
||||
+ break;
|
||||
+
|
||||
+ case POWER_SUPPLY_PROP_CURRENT_NOW:
|
||||
+ if (cw_battery_valid_time_to_empty(cw_bat) &&
|
||||
+ cw_bat->battery.charge_full_design_uah > 0) {
|
||||
+ /* calculate remaining capacity */
|
||||
+ val->intval = cw_bat->battery.charge_full_design_uah;
|
||||
+ val->intval = val->intval * cw_bat->soc / 100;
|
||||
+
|
||||
+ /* estimate current based on time to empty */
|
||||
+ val->intval = 60 * val->intval / cw_bat->time_to_empty;
|
||||
+ } else {
|
||||
+ val->intval = 0;
|
||||
+ }
|
||||
+
|
||||
+ break;
|
||||
+
|
||||
+ default:
|
||||
+ break;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static enum power_supply_property cw_battery_properties[] = {
|
||||
+ POWER_SUPPLY_PROP_CAPACITY,
|
||||
+ POWER_SUPPLY_PROP_STATUS,
|
||||
+ POWER_SUPPLY_PROP_PRESENT,
|
||||
+ POWER_SUPPLY_PROP_VOLTAGE_NOW,
|
||||
+ POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
|
||||
+ POWER_SUPPLY_PROP_TECHNOLOGY,
|
||||
+ POWER_SUPPLY_PROP_CHARGE_COUNTER,
|
||||
+ POWER_SUPPLY_PROP_CHARGE_FULL,
|
||||
+ POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
|
||||
+ POWER_SUPPLY_PROP_CURRENT_NOW,
|
||||
+};
|
||||
+
|
||||
+static const struct power_supply_desc cw2015_bat_desc = {
|
||||
+ .name = "cw2015-battery",
|
||||
+ .type = POWER_SUPPLY_TYPE_BATTERY,
|
||||
+ .properties = cw_battery_properties,
|
||||
+ .num_properties = ARRAY_SIZE(cw_battery_properties),
|
||||
+ .get_property = cw_battery_get_property,
|
||||
+};
|
||||
+
|
||||
+static int cw2015_parse_properties(struct cw_battery *cw_bat)
|
||||
+{
|
||||
+ struct device *dev = cw_bat->dev;
|
||||
+ int length;
|
||||
+ int ret;
|
||||
+
|
||||
+ length = device_property_count_u8(dev, "cellwise,battery-profile");
|
||||
+ if (length < 0) {
|
||||
+ dev_warn(cw_bat->dev,
|
||||
+ "No battery-profile found, using current flash contents\n");
|
||||
+ } else if (length != CW2015_SIZE_BATINFO) {
|
||||
+ dev_err(cw_bat->dev, "battery-profile must be %d bytes\n",
|
||||
+ CW2015_SIZE_BATINFO);
|
||||
+ return -EINVAL;
|
||||
+ } else {
|
||||
+ cw_bat->bat_profile = devm_kzalloc(dev, length, GFP_KERNEL);
|
||||
+ if (!cw_bat->bat_profile)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ ret = device_property_read_u8_array(dev,
|
||||
+ "cellwise,battery-profile",
|
||||
+ cw_bat->bat_profile,
|
||||
+ length);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ ret = device_property_read_u32(dev, "cellwise,monitor-interval-ms",
|
||||
+ &cw_bat->poll_interval_ms);
|
||||
+ if (ret) {
|
||||
+ dev_dbg(cw_bat->dev, "Using default poll interval\n");
|
||||
+ cw_bat->poll_interval_ms = CW2015_DEFAULT_POLL_INTERVAL_MS;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct regmap_range regmap_ranges_rd_yes[] = {
|
||||
+ regmap_reg_range(CW2015_REG_VERSION, CW2015_REG_VERSION),
|
||||
+ regmap_reg_range(CW2015_REG_VCELL, CW2015_REG_CONFIG),
|
||||
+ regmap_reg_range(CW2015_REG_MODE, CW2015_REG_MODE),
|
||||
+ regmap_reg_range(CW2015_REG_BATINFO,
|
||||
+ CW2015_REG_BATINFO + CW2015_SIZE_BATINFO - 1),
|
||||
+};
|
||||
+
|
||||
+static const struct regmap_access_table regmap_rd_table = {
|
||||
+ .yes_ranges = regmap_ranges_rd_yes,
|
||||
+ .n_yes_ranges = 4,
|
||||
+};
|
||||
+
|
||||
+static const struct regmap_range regmap_ranges_wr_yes[] = {
|
||||
+ regmap_reg_range(CW2015_REG_RRT_ALERT, CW2015_REG_CONFIG),
|
||||
+ regmap_reg_range(CW2015_REG_MODE, CW2015_REG_MODE),
|
||||
+ regmap_reg_range(CW2015_REG_BATINFO,
|
||||
+ CW2015_REG_BATINFO + CW2015_SIZE_BATINFO - 1),
|
||||
+};
|
||||
+
|
||||
+static const struct regmap_access_table regmap_wr_table = {
|
||||
+ .yes_ranges = regmap_ranges_wr_yes,
|
||||
+ .n_yes_ranges = 3,
|
||||
+};
|
||||
+
|
||||
+static const struct regmap_range regmap_ranges_vol_yes[] = {
|
||||
+ regmap_reg_range(CW2015_REG_VCELL, CW2015_REG_SOC + 1),
|
||||
+};
|
||||
+
|
||||
+static const struct regmap_access_table regmap_vol_table = {
|
||||
+ .yes_ranges = regmap_ranges_vol_yes,
|
||||
+ .n_yes_ranges = 1,
|
||||
+};
|
||||
+
|
||||
+static const struct regmap_config cw2015_regmap_config = {
|
||||
+ .reg_bits = 8,
|
||||
+ .val_bits = 8,
|
||||
+ .rd_table = ®map_rd_table,
|
||||
+ .wr_table = ®map_wr_table,
|
||||
+ .volatile_table = ®map_vol_table,
|
||||
+ .max_register = CW2015_REG_BATINFO + CW2015_SIZE_BATINFO - 1,
|
||||
+};
|
||||
+
|
||||
+static int cw_bat_probe(struct i2c_client *client)
|
||||
+{
|
||||
+ int ret;
|
||||
+ struct cw_battery *cw_bat;
|
||||
+ struct power_supply_config psy_cfg = { 0 };
|
||||
+
|
||||
+ cw_bat = devm_kzalloc(&client->dev, sizeof(*cw_bat), GFP_KERNEL);
|
||||
+ if (!cw_bat)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ i2c_set_clientdata(client, cw_bat);
|
||||
+ cw_bat->dev = &client->dev;
|
||||
+ cw_bat->soc = 1;
|
||||
+
|
||||
+ ret = cw2015_parse_properties(cw_bat);
|
||||
+ if (ret) {
|
||||
+ dev_err(cw_bat->dev, "Failed to parse cw2015 properties\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ cw_bat->regmap = devm_regmap_init_i2c(client, &cw2015_regmap_config);
|
||||
+ if (IS_ERR(cw_bat->regmap)) {
|
||||
+ dev_err(cw_bat->dev, "Failed to allocate regmap: %ld\n",
|
||||
+ PTR_ERR(cw_bat->regmap));
|
||||
+ return PTR_ERR(cw_bat->regmap);
|
||||
+ }
|
||||
+
|
||||
+ ret = cw_init(cw_bat);
|
||||
+ if (ret) {
|
||||
+ dev_err(cw_bat->dev, "Init failed: %d\n", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ psy_cfg.drv_data = cw_bat;
|
||||
+ psy_cfg.fwnode = dev_fwnode(cw_bat->dev);
|
||||
+
|
||||
+ cw_bat->rk_bat = devm_power_supply_register(&client->dev,
|
||||
+ &cw2015_bat_desc,
|
||||
+ &psy_cfg);
|
||||
+ if (IS_ERR(cw_bat->rk_bat)) {
|
||||
+ dev_err(cw_bat->dev, "Failed to register power supply\n");
|
||||
+ return PTR_ERR(cw_bat->rk_bat);
|
||||
+ }
|
||||
+
|
||||
+ ret = power_supply_get_battery_info(cw_bat->rk_bat, &cw_bat->battery);
|
||||
+ if (ret) {
|
||||
+ dev_warn(cw_bat->dev,
|
||||
+ "No monitored battery, some properties will be missing\n");
|
||||
+ }
|
||||
+
|
||||
+ cw_bat->battery_workqueue = create_singlethread_workqueue("rk_battery");
|
||||
+ INIT_DELAYED_WORK(&cw_bat->battery_delay_work, cw_bat_work);
|
||||
+ queue_delayed_work(cw_bat->battery_workqueue,
|
||||
+ &cw_bat->battery_delay_work, msecs_to_jiffies(10));
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int __maybe_unused cw_bat_suspend(struct device *dev)
|
||||
+{
|
||||
+ struct i2c_client *client = to_i2c_client(dev);
|
||||
+ struct cw_battery *cw_bat = i2c_get_clientdata(client);
|
||||
+
|
||||
+ cancel_delayed_work_sync(&cw_bat->battery_delay_work);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int __maybe_unused cw_bat_resume(struct device *dev)
|
||||
+{
|
||||
+ struct i2c_client *client = to_i2c_client(dev);
|
||||
+ struct cw_battery *cw_bat = i2c_get_clientdata(client);
|
||||
+
|
||||
+ queue_delayed_work(cw_bat->battery_workqueue,
|
||||
+ &cw_bat->battery_delay_work, 0);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static SIMPLE_DEV_PM_OPS(cw_bat_pm_ops, cw_bat_suspend, cw_bat_resume);
|
||||
+
|
||||
+static int cw_bat_remove(struct i2c_client *client)
|
||||
+{
|
||||
+ struct cw_battery *cw_bat = i2c_get_clientdata(client);
|
||||
+
|
||||
+ cancel_delayed_work_sync(&cw_bat->battery_delay_work);
|
||||
+ power_supply_put_battery_info(cw_bat->rk_bat, &cw_bat->battery);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct i2c_device_id cw_bat_id_table[] = {
|
||||
+ { "cw2015", 0 },
|
||||
+ { }
|
||||
+};
|
||||
+
|
||||
+static const struct of_device_id cw2015_of_match[] = {
|
||||
+ { .compatible = "cellwise,cw2015" },
|
||||
+ { }
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, cw2015_of_match);
|
||||
+
|
||||
+static struct i2c_driver cw_bat_driver = {
|
||||
+ .driver = {
|
||||
+ .name = "cw2015",
|
||||
+ .pm = &cw_bat_pm_ops,
|
||||
+ },
|
||||
+ .probe_new = cw_bat_probe,
|
||||
+ .remove = cw_bat_remove,
|
||||
+ .id_table = cw_bat_id_table,
|
||||
+};
|
||||
+
|
||||
+module_i2c_driver(cw_bat_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("xhc<xhc@rock-chips.com>");
|
||||
+MODULE_AUTHOR("Tobias Schramm <t.schramm@manjaro.org>");
|
||||
+MODULE_DESCRIPTION("cw2015/cw2013 battery driver");
|
||||
+MODULE_LICENSE("GPL");
|
||||
--
|
||||
2.26.2
|
||||
|
||||
@ -177,9 +177,9 @@ diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig
|
||||
index 8007d4aa76dc..37f8039a5e27 100644
|
||||
--- a/drivers/firmware/Kconfig
|
||||
+++ b/drivers/firmware/Kconfig
|
||||
@@ -298,6 +298,13 @@ config TURRIS_MOX_RWTM
|
||||
config HAVE_ARM_SMCCC
|
||||
bool
|
||||
@@ -295,6 +295,13 @@ config TURRIS_MOX_RWTM
|
||||
other manufacturing data and also utilize the Entropy Bit Generator
|
||||
for hardware random number generation.
|
||||
|
||||
+config ROCKCHIP_SIP
|
||||
+ bool "Rockchip SIP interface"
|
||||
@ -188,9 +188,9 @@ index 8007d4aa76dc..37f8039a5e27 100644
|
||||
+ Say Y here if you want to enable SIP callbacks for Rockchip platforms
|
||||
+ This option enables support for communicating with the ATF.
|
||||
+
|
||||
source "drivers/firmware/psci/Kconfig"
|
||||
source "drivers/firmware/broadcom/Kconfig"
|
||||
source "drivers/firmware/google/Kconfig"
|
||||
source "drivers/firmware/efi/Kconfig"
|
||||
diff --git a/drivers/firmware/Makefile b/drivers/firmware/Makefile
|
||||
index e9fb838af4df..575f45d55939 100644
|
||||
--- a/drivers/firmware/Makefile
|
||||
|
||||
@ -908,7 +908,7 @@ index 000000000..342589131
|
||||
+
|
||||
+ sdmmc0_pwr_h: sdmmc0-pwr-h {
|
||||
+ rockchip,pins =
|
||||
+ <RK_GPIO0 RK_PA1 RK_FUNC_GPIO &pcfg_output_high>;
|
||||
+ <0 RK_PA1 RK_FUNC_GPIO &pcfg_output_high>;
|
||||
+ };
|
||||
+
|
||||
+ usb_lan_en: usb-lan-en {
|
||||
|
||||
@ -1001,7 +1001,7 @@ index 000000000..1e1747ceb
|
||||
+
|
||||
+ i2s1 {
|
||||
+ i2s_8ch_mclk: i2s-8ch-mclk {
|
||||
+ rockchip,pins = <4 RK_PA0 RK_FUNC_1 &pcfg_pull_none>;
|
||||
+ rockchip,pins = <4 RK_PA0 1 &pcfg_pull_none>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
@ -1073,7 +1073,7 @@ index 000000000..1e1747ceb
|
||||
+
|
||||
+ cam_pins {
|
||||
+ cif_clkout_a: cif-clkout-a {
|
||||
+ rockchip,pins = <2 11 RK_FUNC_3 &pcfg_pull_none>;
|
||||
+ rockchip,pins = <2 11 3 &pcfg_pull_none>;
|
||||
+ };
|
||||
+
|
||||
+ cif_clkout_a_sleep: cif-clkout-a-sleep {
|
||||
|
||||
@ -1,178 +0,0 @@
|
||||
From 4444a1c10069e2f371fa497ba22feafafed5aada Mon Sep 17 00:00:00 2001
|
||||
From: Markus Reichl <m.reichl@fivetechno.de>
|
||||
Date: Mon, 6 Jan 2020 22:16:24 +0100
|
||||
Subject: [PATCH] regulator: mp8859: add driver
|
||||
|
||||
The MP8859 from Monolithic Power Systems is a single output DC/DC
|
||||
converter. The voltage can be controlled via I2C.
|
||||
|
||||
Signed-off-by: Markus Reichl <m.reichl@fivetechno.de>
|
||||
Link: https://lore.kernel.org/r/20200106211633.2882-2-m.reichl@fivetechno.de
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
drivers/regulator/mp8859.c | 156 +++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 156 insertions(+)
|
||||
create mode 100644 drivers/regulator/mp8859.c
|
||||
|
||||
diff --git a/drivers/regulator/mp8859.c b/drivers/regulator/mp8859.c
|
||||
new file mode 100644
|
||||
index 0000000000000..e804a52673017
|
||||
--- /dev/null
|
||||
+++ b/drivers/regulator/mp8859.c
|
||||
@@ -0,0 +1,156 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+//
|
||||
+// Copyright (c) 2019 five technologies GmbH
|
||||
+// Author: Markus Reichl <m.reichl@fivetechno.de>
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/i2c.h>
|
||||
+#include <linux/of.h>
|
||||
+#include <linux/regulator/driver.h>
|
||||
+#include <linux/regmap.h>
|
||||
+
|
||||
+
|
||||
+#define VOL_MIN_IDX 0x00
|
||||
+#define VOL_MAX_IDX 0x7ff
|
||||
+
|
||||
+/* Register definitions */
|
||||
+#define MP8859_VOUT_L_REG 0 //3 lo Bits
|
||||
+#define MP8859_VOUT_H_REG 1 //8 hi Bits
|
||||
+#define MP8859_VOUT_GO_REG 2
|
||||
+#define MP8859_IOUT_LIM_REG 3
|
||||
+#define MP8859_CTL1_REG 4
|
||||
+#define MP8859_CTL2_REG 5
|
||||
+#define MP8859_RESERVED1_REG 6
|
||||
+#define MP8859_RESERVED2_REG 7
|
||||
+#define MP8859_RESERVED3_REG 8
|
||||
+#define MP8859_STATUS_REG 9
|
||||
+#define MP8859_INTERRUPT_REG 0x0A
|
||||
+#define MP8859_MASK_REG 0x0B
|
||||
+#define MP8859_ID1_REG 0x0C
|
||||
+#define MP8859_MFR_ID_REG 0x27
|
||||
+#define MP8859_DEV_ID_REG 0x28
|
||||
+#define MP8859_IC_REV_REG 0x29
|
||||
+
|
||||
+#define MP8859_MAX_REG 0x29
|
||||
+
|
||||
+#define MP8859_GO_BIT 0x01
|
||||
+
|
||||
+
|
||||
+static int mp8859_set_voltage_sel(struct regulator_dev *rdev, unsigned int sel)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = regmap_write(rdev->regmap, MP8859_VOUT_L_REG, sel & 0x7);
|
||||
+
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ ret = regmap_write(rdev->regmap, MP8859_VOUT_H_REG, sel >> 3);
|
||||
+
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ ret = regmap_update_bits(rdev->regmap, MP8859_VOUT_GO_REG,
|
||||
+ MP8859_GO_BIT, 1);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int mp8859_get_voltage_sel(struct regulator_dev *rdev)
|
||||
+{
|
||||
+ unsigned int val_tmp;
|
||||
+ unsigned int val;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = regmap_read(rdev->regmap, MP8859_VOUT_H_REG, &val_tmp);
|
||||
+
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ val = val_tmp << 3;
|
||||
+
|
||||
+ ret = regmap_read(rdev->regmap, MP8859_VOUT_L_REG, &val_tmp);
|
||||
+
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ val |= val_tmp & 0x07;
|
||||
+ return val;
|
||||
+}
|
||||
+
|
||||
+static const struct regulator_linear_range mp8859_dcdc_ranges[] = {
|
||||
+ REGULATOR_LINEAR_RANGE(0, VOL_MIN_IDX, VOL_MAX_IDX, 10000),
|
||||
+};
|
||||
+
|
||||
+static const struct regmap_config mp8859_regmap = {
|
||||
+ .reg_bits = 8,
|
||||
+ .val_bits = 8,
|
||||
+ .max_register = MP8859_MAX_REG,
|
||||
+ .cache_type = REGCACHE_RBTREE,
|
||||
+};
|
||||
+
|
||||
+static const struct regulator_ops mp8859_ops = {
|
||||
+ .set_voltage_sel = mp8859_set_voltage_sel,
|
||||
+ .get_voltage_sel = mp8859_get_voltage_sel,
|
||||
+ .list_voltage = regulator_list_voltage_linear_range,
|
||||
+};
|
||||
+
|
||||
+static const struct regulator_desc mp8859_regulators[] = {
|
||||
+ {
|
||||
+ .id = 0,
|
||||
+ .type = REGULATOR_VOLTAGE,
|
||||
+ .name = "mp8859_dcdc",
|
||||
+ .of_match = of_match_ptr("mp8859_dcdc"),
|
||||
+ .n_voltages = VOL_MAX_IDX + 1,
|
||||
+ .linear_ranges = mp8859_dcdc_ranges,
|
||||
+ .n_linear_ranges = 1,
|
||||
+ .ops = &mp8859_ops,
|
||||
+ .owner = THIS_MODULE,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static int mp8859_i2c_probe(struct i2c_client *i2c)
|
||||
+{
|
||||
+ int ret;
|
||||
+ struct regulator_config config = {.dev = &i2c->dev};
|
||||
+ struct regmap *regmap = devm_regmap_init_i2c(i2c, &mp8859_regmap);
|
||||
+ struct regulator_dev *rdev;
|
||||
+
|
||||
+ if (IS_ERR(regmap)) {
|
||||
+ ret = PTR_ERR(regmap);
|
||||
+ dev_err(&i2c->dev, "regmap init failed: %d\n", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+ rdev = devm_regulator_register(&i2c->dev, &mp8859_regulators[0],
|
||||
+ &config);
|
||||
+
|
||||
+ if (IS_ERR(rdev)) {
|
||||
+ ret = PTR_ERR(rdev);
|
||||
+ dev_err(&i2c->dev, "failed to register %s: %d\n",
|
||||
+ mp8859_regulators[0].name, ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id mp8859_dt_id[] = {
|
||||
+ {.compatible = "mps,mp8859"},
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, mp8859_dt_id);
|
||||
+
|
||||
+static const struct i2c_device_id mp8859_i2c_id[] = {
|
||||
+ { "mp8859", },
|
||||
+ { },
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(i2c, mp8859_i2c_id);
|
||||
+
|
||||
+static struct i2c_driver mp8859_regulator_driver = {
|
||||
+ .driver = {
|
||||
+ .name = "mp8859",
|
||||
+ .of_match_table = of_match_ptr(mp8859_dt_id),
|
||||
+ },
|
||||
+ .probe_new = mp8859_i2c_probe,
|
||||
+ .id_table = mp8859_i2c_id,
|
||||
+};
|
||||
+
|
||||
+module_i2c_driver(mp8859_regulator_driver);
|
||||
+
|
||||
+MODULE_DESCRIPTION("Monolithic Power Systems MP8859 voltage regulator driver");
|
||||
+MODULE_AUTHOR("Markus Reichl <m.reichl@fivetechno.de>");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
@ -1,5 +1,5 @@
|
||||
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi
|
||||
index 4750e366c..1c0ad2df7 100644
|
||||
index 274e72b37..311e5886f 100644
|
||||
--- a/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi
|
||||
+++ b/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi
|
||||
@@ -44,7 +44,7 @@
|
||||
|
||||
@ -1,13 +1,21 @@
|
||||
diff --git a/kernel/dma/remap.c b/kernel/dma/remap.c
|
||||
index 7a723194e..1a05e9e5b 100644
|
||||
--- a/kernel/dma/remap.c
|
||||
+++ b/kernel/dma/remap.c
|
||||
@@ -95,7 +95,7 @@ void dma_common_free_remap(void *cpu_addr, size_t size, unsigned long vm_flags)
|
||||
#ifdef CONFIG_DMA_DIRECT_REMAP
|
||||
static struct gen_pool *atomic_pool __ro_after_init;
|
||||
diff --git a/kernel/dma/pool.c b/kernel/dma/pool.c
|
||||
index 6bc74a2d5..e3827da51 100644
|
||||
--- a/kernel/dma/pool.c
|
||||
+++ b/kernel/dma/pool.c
|
||||
@@ -164,13 +164,11 @@ static int __init dma_atomic_pool_init(void)
|
||||
int ret = 0;
|
||||
|
||||
-#define DEFAULT_DMA_COHERENT_POOL_SIZE SZ_256K
|
||||
+#define DEFAULT_DMA_COHERENT_POOL_SIZE SZ_2M
|
||||
static size_t atomic_pool_size __initdata = DEFAULT_DMA_COHERENT_POOL_SIZE;
|
||||
/*
|
||||
- * If coherent_pool was not used on the command line, default the pool
|
||||
- * sizes to 128KB per 1GB of memory, min 128KB, max MAX_ORDER-1.
|
||||
+ * Always use 2MiB as default pool size.
|
||||
+ * See: https://forum.armbian.com/topic/4811-uas-mainline-kernel-coherent-pool-memory-size/
|
||||
*/
|
||||
if (!atomic_pool_size) {
|
||||
- unsigned long pages = totalram_pages() / (SZ_1G / SZ_128K);
|
||||
- pages = min_t(unsigned long, pages, MAX_ORDER_NR_PAGES);
|
||||
- atomic_pool_size = max_t(size_t, pages << PAGE_SHIFT, SZ_128K);
|
||||
+ atomic_pool_size = SZ_2M;
|
||||
}
|
||||
INIT_WORK(&atomic_pool_work, atomic_pool_work_fn);
|
||||
|
||||
static int __init early_coherent_pool(char *p)
|
||||
|
||||
@ -7,7 +7,7 @@ index 6eb9dda..d6fc676 100644
|
||||
sdmmc_bus1: sdmmc-bus1 {
|
||||
rockchip,pins =
|
||||
- <4 RK_PB0 1 &pcfg_pull_up>;
|
||||
+ <4 RK_PB0 RK_FUNC_1 &pcfg_pull_up_8ma>;
|
||||
+ <4 RK_PB0 1 &pcfg_pull_up_8ma>;
|
||||
};
|
||||
|
||||
sdmmc_bus4: sdmmc-bus4 {
|
||||
@ -16,34 +16,34 @@ index 6eb9dda..d6fc676 100644
|
||||
- <4 RK_PB1 1 &pcfg_pull_up>,
|
||||
- <4 RK_PB2 1 &pcfg_pull_up>,
|
||||
- <4 RK_PB3 1 &pcfg_pull_up>;
|
||||
+ <4 RK_PB0 RK_FUNC_1 &pcfg_pull_up_8ma>,
|
||||
+ <4 RK_PB1 RK_FUNC_1 &pcfg_pull_up_8ma>,
|
||||
+ <4 RK_PB2 RK_FUNC_1 &pcfg_pull_up_8ma>,
|
||||
+ <4 RK_PB3 RK_FUNC_1 &pcfg_pull_up_8ma>;
|
||||
+ <4 RK_PB0 1 &pcfg_pull_up_8ma>,
|
||||
+ <4 RK_PB1 1 &pcfg_pull_up_8ma>,
|
||||
+ <4 RK_PB2 1 &pcfg_pull_up_8ma>,
|
||||
+ <4 RK_PB3 1 &pcfg_pull_up_8ma>;
|
||||
};
|
||||
|
||||
sdmmc_clk: sdmmc-clk {
|
||||
rockchip,pins =
|
||||
- <4 RK_PB4 1 &pcfg_pull_none>;
|
||||
+ <4 RK_PB4 RK_FUNC_1 &pcfg_pull_none_12ma>;
|
||||
+ <4 RK_PB4 1 &pcfg_pull_none_12ma>;
|
||||
};
|
||||
|
||||
sdmmc_cmd: sdmmc-cmd {
|
||||
rockchip,pins =
|
||||
- <4 RK_PB5 1 &pcfg_pull_up>;
|
||||
+ <4 RK_PB5 RK_FUNC_1 &pcfg_pull_up_8ma>;
|
||||
+ <4 RK_PB5 1 &pcfg_pull_up_8ma>;
|
||||
};
|
||||
|
||||
sdmmc_cd: sdmmc-cd {
|
||||
rockchip,pins =
|
||||
- <0 RK_PA7 1 &pcfg_pull_up>;
|
||||
+ <0 RK_PA7 RK_FUNC_1 &pcfg_pull_up>;
|
||||
+ <0 RK_PA7 1 &pcfg_pull_up>;
|
||||
};
|
||||
|
||||
sdmmc_wp: sdmmc-wp {
|
||||
rockchip,pins =
|
||||
- <0 RK_PB0 1 &pcfg_pull_up>;
|
||||
+ <0 RK_PB0 RK_FUNC_1 &pcfg_pull_up_8ma>;
|
||||
+ <0 RK_PB0 1 &pcfg_pull_up_8ma>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
1602
patch/kernel/rockchip64-current/rkvdec_nv15.patch
Normal file
1602
patch/kernel/rockchip64-current/rkvdec_nv15.patch
Normal file
File diff suppressed because it is too large
Load Diff
@ -69,16 +69,16 @@
|
||||
+ i2s0 {
|
||||
+ i2s0_8ch_bus: i2s0-8ch-bus {
|
||||
+ rockchip,pins =
|
||||
+ <3 24 RK_FUNC_1 &pcfg_pull_none>,
|
||||
+ <3 25 RK_FUNC_1 &pcfg_pull_none>,
|
||||
+ <3 26 RK_FUNC_1 &pcfg_pull_none>,
|
||||
+ <3 27 RK_FUNC_1 &pcfg_pull_none>,
|
||||
+ <3 30 RK_FUNC_1 &pcfg_pull_none>,
|
||||
+ <3 31 RK_FUNC_1 &pcfg_pull_none>;
|
||||
+ <3 24 1 &pcfg_pull_none>,
|
||||
+ <3 25 1 &pcfg_pull_none>,
|
||||
+ <3 26 1 &pcfg_pull_none>,
|
||||
+ <3 27 1 &pcfg_pull_none>,
|
||||
+ <3 30 1 &pcfg_pull_none>,
|
||||
+ <3 31 1 &pcfg_pull_none>;
|
||||
+ };
|
||||
+
|
||||
+ i2s_8ch_mclk: i2s-8ch-mclk {
|
||||
+ rockchip,pins = <4 0 RK_FUNC_1 &pcfg_pull_none>;
|
||||
+ rockchip,pins = <4 0 1 &pcfg_pull_none>;
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
|
||||
@ -49,9 +49,9 @@ index 48fb631d5451..e56a5527bab4 100644
|
||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3308-evb.dtb
|
||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3308-roc-cc.dtb
|
||||
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3308-rock-pi-s.dtb
|
||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3326-odroid-go2.dtb
|
||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-a1.dtb
|
||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-evb.dtb
|
||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock64.dtb
|
||||
diff --git a/arch/arm64/boot/dts/rockchip/rk3308-rock-pi-s.dts b/arch/arm64/boot/dts/rockchip/rk3308-rock-pi-s.dts
|
||||
new file mode 100644
|
||||
index 000000000000..4fccae43f008
|
||||
|
||||
@ -1,37 +0,0 @@
|
||||
From 3f90a9ef2e8d7e647572b2f2f2f54dce20c654c5 Mon Sep 17 00:00:00 2001
|
||||
From: ashthespy <ashthespy@gmail.com>
|
||||
Date: Mon, 3 Feb 2020 21:29:44 +0100
|
||||
Subject: [PATCH 23/23] ASoC: rockchip: i2s: add compatible for rk3308
|
||||
|
||||
---
|
||||
Documentation/devicetree/bindings/sound/rockchip-i2s.yaml | 1 +
|
||||
sound/soc/rockchip/rockchip_i2s.c | 1 +
|
||||
2 files changed, 2 insertions(+)
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/sound/rockchip-i2s.yaml b/Documentation/devicetree/bindings/sound/rockchip-i2s.yaml
|
||||
index a3ba2186d..122c2e958 100644
|
||||
--- a/Documentation/devicetree/bindings/sound/rockchip-i2s.yaml
|
||||
+++ b/Documentation/devicetree/bindings/sound/rockchip-i2s.yaml
|
||||
@@ -24,6 +24,7 @@ properties:
|
||||
- rockchip,rk3188-i2s
|
||||
- rockchip,rk3228-i2s
|
||||
- rockchip,rk3288-i2s
|
||||
+ - rockchip,rk3308-i2s
|
||||
- rockchip,rk3328-i2s
|
||||
- rockchip,rk3366-i2s
|
||||
- rockchip,rk3368-i2s
|
||||
diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c
|
||||
index e6125ebfe5a9..dcee123b0939 100644
|
||||
--- a/sound/soc/rockchip/rockchip_i2s.c
|
||||
+++ b/sound/soc/rockchip/rockchip_i2s.c
|
||||
@@ -598,6 +598,7 @@ static const struct of_device_id rockchip_i2s_match[] = {
|
||||
{ .compatible = "rockchip,rk3066-i2s", },
|
||||
{ .compatible = "rockchip,rk3128-i2s", },
|
||||
{ .compatible = "rockchip,rk3188-i2s", },
|
||||
+ { .compatible = "rockchip,rk3308-i2s", },
|
||||
{ .compatible = "rockchip,rk3288-i2s", },
|
||||
{ .compatible = "rockchip,rk3308-i2s", },
|
||||
{ .compatible = "rockchip,rk3328-i2s", },
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@ -0,0 +1,310 @@
|
||||
diff --git a/drivers/net/wireless/rtl8189es/include/rtw_security.h b/drivers/net/wireless/rtl8189es/include/rtw_security.h
|
||||
index 5820a55..3e8e428 100644
|
||||
--- a/drivers/net/wireless/rtl8189es/include/rtw_security.h
|
||||
+++ b/drivers/net/wireless/rtl8189es/include/rtw_security.h
|
||||
@@ -238,7 +238,7 @@ struct security_priv
|
||||
#endif /* DBG_SW_SEC_CNT */
|
||||
};
|
||||
|
||||
-struct sha256_state {
|
||||
+struct rtl_sha256_state {
|
||||
u64 length;
|
||||
u32 state[8], curlen;
|
||||
u8 buf[64];
|
||||
diff --git a/drivers/net/wireless/rtl8189es/core/rtw_security.c b/drivers/net/wireless/rtl8189es/core/rtw_security.c
|
||||
index 8dac771..9b3a1f9 100644
|
||||
--- a/drivers/net/wireless/rtl8189es/core/rtw_security.c
|
||||
+++ b/drivers/net/wireless/rtl8189es/core/rtw_security.c
|
||||
@@ -2281,7 +2281,7 @@ BIP_exit:
|
||||
|
||||
#ifndef PLATFORM_FREEBSD
|
||||
/* compress 512-bits */
|
||||
-static int sha256_compress(struct sha256_state *md, unsigned char *buf)
|
||||
+static int sha256_compress(struct rtl_sha256_state *md, unsigned char *buf)
|
||||
{
|
||||
u32 S[8], W[64], t0, t1;
|
||||
u32 t;
|
||||
@@ -2323,7 +2323,7 @@ static int sha256_compress(struct sha256_state *md, unsigned char *buf)
|
||||
}
|
||||
|
||||
/* Initialize the hash state */
|
||||
-static void sha256_init(struct sha256_state *md)
|
||||
+static void sha256_init(struct rtl_sha256_state *md)
|
||||
{
|
||||
md->curlen = 0;
|
||||
md->length = 0;
|
||||
@@ -2344,7 +2344,7 @@ static void sha256_init(struct sha256_state *md)
|
||||
@param inlen The length of the data (octets)
|
||||
@return CRYPT_OK if successful
|
||||
*/
|
||||
-static int sha256_process(struct sha256_state *md, unsigned char *in,
|
||||
+static int sha256_process(struct rtl_sha256_state *md, unsigned char *in,
|
||||
unsigned long inlen)
|
||||
{
|
||||
unsigned long n;
|
||||
@@ -2385,7 +2385,7 @@ static int sha256_process(struct sha256_state *md, unsigned char *in,
|
||||
@param out [out] The destination of the hash (32 bytes)
|
||||
@return CRYPT_OK if successful
|
||||
*/
|
||||
-static int sha256_done(struct sha256_state *md, unsigned char *out)
|
||||
+static int sha256_done(struct rtl_sha256_state *md, unsigned char *out)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -2437,7 +2437,7 @@ static int sha256_done(struct sha256_state *md, unsigned char *out)
|
||||
static int sha256_vector(size_t num_elem, u8 *addr[], size_t *len,
|
||||
u8 *mac)
|
||||
{
|
||||
- struct sha256_state ctx;
|
||||
+ struct rtl_sha256_state ctx;
|
||||
size_t i;
|
||||
|
||||
sha256_init(&ctx);
|
||||
diff --git a/drivers/net/wireless/rtl8811cu/include/rtw_security.h b/drivers/net/wireless/rtl8811cu/include/rtw_security.h
|
||||
index ac8432e..5f74fb7 100755
|
||||
--- a/drivers/net/wireless/rtl8811cu/include/rtw_security.h
|
||||
+++ b/drivers/net/wireless/rtl8811cu/include/rtw_security.h
|
||||
@@ -249,7 +249,7 @@ struct security_priv {
|
||||
#define SEC_IS_BIP_KEY_INSTALLED(sec) _FALSE
|
||||
#endif
|
||||
|
||||
-struct sha256_state {
|
||||
+struct rtl_sha256_state {
|
||||
u64 length;
|
||||
u32 state[8], curlen;
|
||||
u8 buf[64];
|
||||
diff --git a/drivers/net/wireless/rtl8811cu/core/rtw_security.c b/drivers/net/wireless/rtl8811cu/core/rtw_security.c
|
||||
index b537a26..f8c42f4 100755
|
||||
--- a/drivers/net/wireless/rtl8811cu/core/rtw_security.c
|
||||
+++ b/drivers/net/wireless/rtl8811cu/core/rtw_security.c
|
||||
@@ -2133,7 +2133,7 @@ BIP_exit:
|
||||
#ifndef PLATFORM_FREEBSD
|
||||
#if defined(CONFIG_TDLS)
|
||||
/* compress 512-bits */
|
||||
-static int sha256_compress(struct sha256_state *md, unsigned char *buf)
|
||||
+static int sha256_compress(struct rtl_sha256_state *md, unsigned char *buf)
|
||||
{
|
||||
u32 S[8], W[64], t0, t1;
|
||||
u32 t;
|
||||
@@ -2181,7 +2181,7 @@ static int sha256_compress(struct sha256_state *md, unsigned char *buf)
|
||||
}
|
||||
|
||||
/* Initialize the hash state */
|
||||
-static void sha256_init(struct sha256_state *md)
|
||||
+static void sha256_init(struct rtl_sha256_state *md)
|
||||
{
|
||||
md->curlen = 0;
|
||||
md->length = 0;
|
||||
@@ -2202,7 +2202,7 @@ static void sha256_init(struct sha256_state *md)
|
||||
@param inlen The length of the data (octets)
|
||||
@return CRYPT_OK if successful
|
||||
*/
|
||||
-static int sha256_process(struct sha256_state *md, unsigned char *in,
|
||||
+static int sha256_process(struct rtl_sha256_state *md, unsigned char *in,
|
||||
unsigned long inlen)
|
||||
{
|
||||
unsigned long n;
|
||||
@@ -2243,7 +2243,7 @@ static int sha256_process(struct sha256_state *md, unsigned char *in,
|
||||
@param out [out] The destination of the hash (32 bytes)
|
||||
@return CRYPT_OK if successful
|
||||
*/
|
||||
-static int sha256_done(struct sha256_state *md, unsigned char *out)
|
||||
+static int sha256_done(struct rtl_sha256_state *md, unsigned char *out)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -2293,7 +2293,7 @@ static int sha256_done(struct sha256_state *md, unsigned char *out)
|
||||
static int sha256_vector(size_t num_elem, u8 *addr[], size_t *len,
|
||||
u8 *mac)
|
||||
{
|
||||
- struct sha256_state ctx;
|
||||
+ struct rtl_sha256_state ctx;
|
||||
size_t i;
|
||||
|
||||
sha256_init(&ctx);
|
||||
diff --git a/drivers/net/wireless/rtl8188eu/include/rtw_security.h b/drivers/net/wireless/rtl8188eu/include/rtw_security.h
|
||||
index 0adc700..2a9cf9d 100644
|
||||
--- a/drivers/net/wireless/rtl8188eu/include/rtw_security.h
|
||||
+++ b/drivers/net/wireless/rtl8188eu/include/rtw_security.h
|
||||
@@ -249,7 +249,7 @@ struct security_priv {
|
||||
#define SEC_IS_BIP_KEY_INSTALLED(sec) _FALSE
|
||||
#endif
|
||||
|
||||
-struct sha256_state {
|
||||
+struct rtl_sha256_state {
|
||||
u64 length;
|
||||
u32 state[8], curlen;
|
||||
u8 buf[64];
|
||||
diff --git a/drivers/net/wireless/rtl8188eu/core/rtw_security.c b/drivers/net/wireless/rtl8188eu/core/rtw_security.c
|
||||
index 5807521..0b3eed2 100644
|
||||
--- a/drivers/net/wireless/rtl8188eu/core/rtw_security.c
|
||||
+++ b/drivers/net/wireless/rtl8188eu/core/rtw_security.c
|
||||
@@ -2133,7 +2133,7 @@ BIP_exit:
|
||||
#ifndef PLATFORM_FREEBSD
|
||||
#if defined(CONFIG_TDLS)
|
||||
/* compress 512-bits */
|
||||
-static int sha256_compress(struct sha256_state *md, unsigned char *buf)
|
||||
+static int sha256_compress(struct rtl_sha256_state *md, unsigned char *buf)
|
||||
{
|
||||
u32 S[8], W[64], t0, t1;
|
||||
u32 t;
|
||||
@@ -2181,7 +2181,7 @@ static int sha256_compress(struct sha256_state *md, unsigned char *buf)
|
||||
}
|
||||
|
||||
/* Initialize the hash state */
|
||||
-static void sha256_init(struct sha256_state *md)
|
||||
+static void sha256_init(struct rtl_sha256_state *md)
|
||||
{
|
||||
md->curlen = 0;
|
||||
md->length = 0;
|
||||
@@ -2202,7 +2202,7 @@ static void sha256_init(struct sha256_state *md)
|
||||
@param inlen The length of the data (octets)
|
||||
@return CRYPT_OK if successful
|
||||
*/
|
||||
-static int sha256_process(struct sha256_state *md, unsigned char *in,
|
||||
+static int sha256_process(struct rtl_sha256_state *md, unsigned char *in,
|
||||
unsigned long inlen)
|
||||
{
|
||||
unsigned long n;
|
||||
@@ -2243,7 +2243,7 @@ static int sha256_process(struct sha256_state *md, unsigned char *in,
|
||||
@param out [out] The destination of the hash (32 bytes)
|
||||
@return CRYPT_OK if successful
|
||||
*/
|
||||
-static int sha256_done(struct sha256_state *md, unsigned char *out)
|
||||
+static int sha256_done(struct rtl_sha256_state *md, unsigned char *out)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -2293,7 +2293,7 @@ static int sha256_done(struct sha256_state *md, unsigned char *out)
|
||||
static int sha256_vector(size_t num_elem, u8 *addr[], size_t *len,
|
||||
u8 *mac)
|
||||
{
|
||||
- struct sha256_state ctx;
|
||||
+ struct rtl_sha256_state ctx;
|
||||
size_t i;
|
||||
|
||||
sha256_init(&ctx);
|
||||
diff --git a/drivers/net/wireless/rtl88x2bu/include/rtw_security.h b/drivers/net/wireless/rtl88x2bu/include/rtw_security.h
|
||||
index ac8432e..5f74fb7 100644
|
||||
--- a/drivers/net/wireless/rtl88x2bu/include/rtw_security.h
|
||||
+++ b/drivers/net/wireless/rtl88x2bu/include/rtw_security.h
|
||||
@@ -249,7 +249,7 @@ struct security_priv {
|
||||
#define SEC_IS_BIP_KEY_INSTALLED(sec) _FALSE
|
||||
#endif
|
||||
|
||||
-struct sha256_state {
|
||||
+struct rtl_sha256_state {
|
||||
u64 length;
|
||||
u32 state[8], curlen;
|
||||
u8 buf[64];
|
||||
diff --git a/drivers/net/wireless/rtl88x2bu/core/rtw_security.c b/drivers/net/wireless/rtl88x2bu/core/rtw_security.c
|
||||
index b537a26..f8c42f4 100644
|
||||
--- a/drivers/net/wireless/rtl88x2bu/core/rtw_security.c
|
||||
+++ b/drivers/net/wireless/rtl88x2bu/core/rtw_security.c
|
||||
@@ -2133,7 +2133,7 @@ BIP_exit:
|
||||
#ifndef PLATFORM_FREEBSD
|
||||
#if defined(CONFIG_TDLS)
|
||||
/* compress 512-bits */
|
||||
-static int sha256_compress(struct sha256_state *md, unsigned char *buf)
|
||||
+static int sha256_compress(struct rtl_sha256_state *md, unsigned char *buf)
|
||||
{
|
||||
u32 S[8], W[64], t0, t1;
|
||||
u32 t;
|
||||
@@ -2181,7 +2181,7 @@ static int sha256_compress(struct sha256_state *md, unsigned char *buf)
|
||||
}
|
||||
|
||||
/* Initialize the hash state */
|
||||
-static void sha256_init(struct sha256_state *md)
|
||||
+static void sha256_init(struct rtl_sha256_state *md)
|
||||
{
|
||||
md->curlen = 0;
|
||||
md->length = 0;
|
||||
@@ -2202,7 +2202,7 @@ static void sha256_init(struct sha256_state *md)
|
||||
@param inlen The length of the data (octets)
|
||||
@return CRYPT_OK if successful
|
||||
*/
|
||||
-static int sha256_process(struct sha256_state *md, unsigned char *in,
|
||||
+static int sha256_process(struct rtl_sha256_state *md, unsigned char *in,
|
||||
unsigned long inlen)
|
||||
{
|
||||
unsigned long n;
|
||||
@@ -2243,7 +2243,7 @@ static int sha256_process(struct sha256_state *md, unsigned char *in,
|
||||
@param out [out] The destination of the hash (32 bytes)
|
||||
@return CRYPT_OK if successful
|
||||
*/
|
||||
-static int sha256_done(struct sha256_state *md, unsigned char *out)
|
||||
+static int sha256_done(struct rtl_sha256_state *md, unsigned char *out)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -2293,7 +2293,7 @@ static int sha256_done(struct sha256_state *md, unsigned char *out)
|
||||
static int sha256_vector(size_t num_elem, u8 *addr[], size_t *len,
|
||||
u8 *mac)
|
||||
{
|
||||
- struct sha256_state ctx;
|
||||
+ struct rtl_sha256_state ctx;
|
||||
size_t i;
|
||||
|
||||
sha256_init(&ctx);
|
||||
diff --git a/drivers/net/wireless/rtl8723ds/include/rtw_security.h b/drivers/net/wireless/rtl8723ds/include/rtw_security.h
|
||||
index 83c06a5..bcea21a 100644
|
||||
--- a/drivers/net/wireless/rtl8723ds/include/rtw_security.h
|
||||
+++ b/drivers/net/wireless/rtl8723ds/include/rtw_security.h
|
||||
@@ -242,7 +242,7 @@ struct security_priv {
|
||||
#endif /* DBG_SW_SEC_CNT */
|
||||
};
|
||||
|
||||
-struct sha256_state {
|
||||
+struct rtl_sha256_state {
|
||||
u64 length;
|
||||
u32 state[8], curlen;
|
||||
u8 buf[64];
|
||||
diff --git a/drivers/net/wireless/rtl8723ds/core/rtw_security.c b/drivers/net/wireless/rtl8723ds/core/rtw_security.c
|
||||
index 88033df..11aa9a4 100644
|
||||
--- a/drivers/net/wireless/rtl8723ds/core/rtw_security.c
|
||||
+++ b/drivers/net/wireless/rtl8723ds/core/rtw_security.c
|
||||
@@ -2132,7 +2132,7 @@ BIP_exit:
|
||||
#endif /* CONFIG_IEEE80211W */
|
||||
|
||||
/* compress 512-bits */
|
||||
-static int sha256_compress(struct sha256_state *md, unsigned char *buf)
|
||||
+static int sha256_compress(struct rtl_sha256_state *md, unsigned char *buf)
|
||||
{
|
||||
u32 S[8], W[64], t0, t1;
|
||||
u32 t;
|
||||
@@ -2180,7 +2180,7 @@ static int sha256_compress(struct sha256_state *md, unsigned char *buf)
|
||||
}
|
||||
|
||||
/* Initialize the hash state */
|
||||
-static void sha256_init(struct sha256_state *md)
|
||||
+static void sha256_init(struct rtl_sha256_state *md)
|
||||
{
|
||||
md->curlen = 0;
|
||||
md->length = 0;
|
||||
@@ -2201,7 +2201,7 @@ static void sha256_init(struct sha256_state *md)
|
||||
@param inlen The length of the data (octets)
|
||||
@return CRYPT_OK if successful
|
||||
*/
|
||||
-static int sha256_process(struct sha256_state *md, unsigned char *in,
|
||||
+static int sha256_process(struct rtl_sha256_state *md, unsigned char *in,
|
||||
unsigned long inlen)
|
||||
{
|
||||
unsigned long n;
|
||||
@@ -2242,7 +2242,7 @@ static int sha256_process(struct sha256_state *md, unsigned char *in,
|
||||
@param out [out] The destination of the hash (32 bytes)
|
||||
@return CRYPT_OK if successful
|
||||
*/
|
||||
-static int sha256_done(struct sha256_state *md, unsigned char *out)
|
||||
+static int sha256_done(struct rtl_sha256_state *md, unsigned char *out)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -2292,7 +2292,7 @@ static int sha256_done(struct sha256_state *md, unsigned char *out)
|
||||
static int sha256_vector(size_t num_elem, u8 *addr[], size_t *len,
|
||||
u8 *mac)
|
||||
{
|
||||
- struct sha256_state ctx;
|
||||
+ struct rtl_sha256_state ctx;
|
||||
size_t i;
|
||||
|
||||
sha256_init(&ctx);
|
||||
@ -0,0 +1,295 @@
|
||||
diff --git a/drivers/net/wireless/rtl8189es/os_dep/linux/ioctl_cfg80211.c b/drivers/net/wireless/rtl8189es/os_dep/linux/ioctl_cfg80211.c
|
||||
index d77cc17..32cc240 100644
|
||||
--- a/drivers/net/wireless/rtl8189es/os_dep/linux/ioctl_cfg80211.c
|
||||
+++ b/drivers/net/wireless/rtl8189es/os_dep/linux/ioctl_cfg80211.c
|
||||
@@ -5567,6 +5567,33 @@ exit:
|
||||
return ret;
|
||||
}
|
||||
|
||||
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))
|
||||
+
|
||||
+static void
|
||||
+cfg80211_rtw_update_mgmt_frame_registrations(struct wiphy *wiphy,
|
||||
+ struct wireless_dev *wdev,
|
||||
+ struct mgmt_frame_regs *upd)
|
||||
+{
|
||||
+ struct net_device *ndev = wdev_to_ndev(wdev);
|
||||
+ struct rtw_wdev_priv *pwdev_priv;
|
||||
+ _adapter *adapter;
|
||||
+
|
||||
+ if (ndev == NULL)
|
||||
+ return;
|
||||
+
|
||||
+ adapter = (_adapter *)rtw_netdev_priv(ndev);
|
||||
+ pwdev_priv = adapter_wdev_data(adapter);
|
||||
+
|
||||
+#ifdef CONFIG_DEBUG_CFG80211
|
||||
+ RTW_INFO(FUNC_ADPT_FMT" stypes:%x\n", FUNC_ADPT_ARG(adapter),
|
||||
+ upd->interface_stypes);
|
||||
+#endif
|
||||
+
|
||||
+ /* not implemented, see bellow */
|
||||
+}
|
||||
+
|
||||
+#else
|
||||
+
|
||||
static void cfg80211_rtw_mgmt_frame_register(struct wiphy *wiphy,
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
|
||||
struct wireless_dev *wdev,
|
||||
@@ -5611,6 +5638,8 @@ exit:
|
||||
return;
|
||||
}
|
||||
|
||||
+#endif
|
||||
+
|
||||
#if defined(CONFIG_TDLS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0))
|
||||
static int cfg80211_rtw_tdls_mgmt(struct wiphy *wiphy,
|
||||
struct net_device *ndev,
|
||||
@@ -6505,7 +6534,11 @@ static struct cfg80211_ops rtw_cfg80211_ops = {
|
||||
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)
|
||||
.mgmt_tx = cfg80211_rtw_mgmt_tx,
|
||||
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))
|
||||
+ .update_mgmt_frame_registrations = cfg80211_rtw_update_mgmt_frame_registrations,
|
||||
+#else
|
||||
.mgmt_frame_register = cfg80211_rtw_mgmt_frame_register,
|
||||
+#endif
|
||||
#elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,34) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,35))
|
||||
.action = cfg80211_rtw_mgmt_tx,
|
||||
#endif
|
||||
diff --git a/drivers/net/wireless/rtl8811cu/os_dep/linux/ioctl_cfg80211.c b/drivers/net/wireless/rtl8811cu/os_dep/linux/ioctl_cfg80211.c
|
||||
index c0df148..9bff924 100755
|
||||
--- a/drivers/net/wireless/rtl8811cu/os_dep/linux/ioctl_cfg80211.c
|
||||
+++ b/drivers/net/wireless/rtl8811cu/os_dep/linux/ioctl_cfg80211.c
|
||||
@@ -7143,6 +7143,33 @@ exit:
|
||||
return ret;
|
||||
}
|
||||
|
||||
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))
|
||||
+
|
||||
+static void
|
||||
+cfg80211_rtw_update_mgmt_frame_registrations(struct wiphy *wiphy,
|
||||
+ struct wireless_dev *wdev,
|
||||
+ struct mgmt_frame_regs *upd)
|
||||
+{
|
||||
+ struct net_device *ndev = wdev_to_ndev(wdev);
|
||||
+ struct rtw_wdev_priv *pwdev_priv;
|
||||
+ _adapter *adapter;
|
||||
+
|
||||
+ if (ndev == NULL)
|
||||
+ return;
|
||||
+
|
||||
+ adapter = (_adapter *)rtw_netdev_priv(ndev);
|
||||
+ pwdev_priv = adapter_wdev_data(adapter);
|
||||
+
|
||||
+#ifdef CONFIG_DEBUG_CFG80211
|
||||
+ RTW_INFO(FUNC_ADPT_FMT" stypes:%x\n", FUNC_ADPT_ARG(adapter),
|
||||
+ upd->interface_stypes);
|
||||
+#endif
|
||||
+
|
||||
+ /* not implemented, see bellow */
|
||||
+}
|
||||
+
|
||||
+#else
|
||||
+
|
||||
static void cfg80211_rtw_mgmt_frame_register(struct wiphy *wiphy,
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
|
||||
struct wireless_dev *wdev,
|
||||
@@ -7187,6 +7214,8 @@ exit:
|
||||
return;
|
||||
}
|
||||
|
||||
+#endif
|
||||
+
|
||||
#if defined(CONFIG_TDLS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0))
|
||||
static int cfg80211_rtw_tdls_mgmt(struct wiphy *wiphy,
|
||||
struct net_device *ndev,
|
||||
@@ -9457,7 +9486,11 @@ static struct cfg80211_ops rtw_cfg80211_ops = {
|
||||
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE)
|
||||
.mgmt_tx = cfg80211_rtw_mgmt_tx,
|
||||
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))
|
||||
+ .update_mgmt_frame_registrations = cfg80211_rtw_update_mgmt_frame_registrations,
|
||||
+#else
|
||||
.mgmt_frame_register = cfg80211_rtw_mgmt_frame_register,
|
||||
+#endif
|
||||
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 34) && LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
|
||||
.action = cfg80211_rtw_mgmt_tx,
|
||||
#endif
|
||||
diff --git a/drivers/net/wireless/rtl8188eu/os_dep/linux/ioctl_cfg80211.c b/drivers/net/wireless/rtl8188eu/os_dep/linux/ioctl_cfg80211.c
|
||||
index 721723e..62fd530 100644
|
||||
--- a/drivers/net/wireless/rtl8188eu/os_dep/linux/ioctl_cfg80211.c
|
||||
+++ b/drivers/net/wireless/rtl8188eu/os_dep/linux/ioctl_cfg80211.c
|
||||
@@ -7470,6 +7470,33 @@ exit:
|
||||
return ret;
|
||||
}
|
||||
|
||||
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))
|
||||
+
|
||||
+static void
|
||||
+cfg80211_rtw_update_mgmt_frame_registrations(struct wiphy *wiphy,
|
||||
+ struct wireless_dev *wdev,
|
||||
+ struct mgmt_frame_regs *upd)
|
||||
+{
|
||||
+ struct net_device *ndev = wdev_to_ndev(wdev);
|
||||
+ struct rtw_wdev_priv *pwdev_priv;
|
||||
+ _adapter *adapter;
|
||||
+
|
||||
+ if (ndev == NULL)
|
||||
+ return;
|
||||
+
|
||||
+ adapter = (_adapter *)rtw_netdev_priv(ndev);
|
||||
+ pwdev_priv = adapter_wdev_data(adapter);
|
||||
+
|
||||
+#ifdef CONFIG_DEBUG_CFG80211
|
||||
+ RTW_INFO(FUNC_ADPT_FMT" stypes:%x\n", FUNC_ADPT_ARG(adapter),
|
||||
+ upd->interface_stypes);
|
||||
+#endif
|
||||
+
|
||||
+ /* not implemented, see bellow */
|
||||
+}
|
||||
+
|
||||
+#else
|
||||
+
|
||||
static void cfg80211_rtw_mgmt_frame_register(struct wiphy *wiphy,
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
|
||||
struct wireless_dev *wdev,
|
||||
@@ -7525,6 +7552,8 @@ exit:
|
||||
return;
|
||||
}
|
||||
|
||||
+#endif
|
||||
+
|
||||
#if defined(CONFIG_TDLS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0))
|
||||
static int cfg80211_rtw_tdls_mgmt(struct wiphy *wiphy,
|
||||
struct net_device *ndev,
|
||||
@@ -9903,7 +9932,11 @@ static struct cfg80211_ops rtw_cfg80211_ops = {
|
||||
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE)
|
||||
.mgmt_tx = cfg80211_rtw_mgmt_tx,
|
||||
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))
|
||||
+ .update_mgmt_frame_registrations = cfg80211_rtw_update_mgmt_frame_registrations,
|
||||
+#else
|
||||
.mgmt_frame_register = cfg80211_rtw_mgmt_frame_register,
|
||||
+#endif
|
||||
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 34) && LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
|
||||
.action = cfg80211_rtw_mgmt_tx,
|
||||
#endif
|
||||
diff --git a/drivers/net/wireless/rtl88x2bu/os_dep/linux/ioctl_cfg80211.c b/drivers/net/wireless/rtl88x2bu/os_dep/linux/ioctl_cfg80211.c
|
||||
index 2fd4e28..b463e55 100755
|
||||
--- a/drivers/net/wireless/rtl88x2bu/os_dep/linux/ioctl_cfg80211.c
|
||||
+++ b/drivers/net/wireless/rtl88x2bu/os_dep/linux/ioctl_cfg80211.c
|
||||
@@ -7325,6 +7325,33 @@ exit:
|
||||
return ret;
|
||||
}
|
||||
|
||||
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))
|
||||
+
|
||||
+static void
|
||||
+cfg80211_rtw_update_mgmt_frame_registrations(struct wiphy *wiphy,
|
||||
+ struct wireless_dev *wdev,
|
||||
+ struct mgmt_frame_regs *upd)
|
||||
+{
|
||||
+ struct net_device *ndev = wdev_to_ndev(wdev);
|
||||
+ struct rtw_wdev_priv *pwdev_priv;
|
||||
+ _adapter *adapter;
|
||||
+
|
||||
+ if (ndev == NULL)
|
||||
+ return;
|
||||
+
|
||||
+ adapter = (_adapter *)rtw_netdev_priv(ndev);
|
||||
+ pwdev_priv = adapter_wdev_data(adapter);
|
||||
+
|
||||
+#ifdef CONFIG_DEBUG_CFG80211
|
||||
+ RTW_INFO(FUNC_ADPT_FMT" stypes:%x\n", FUNC_ADPT_ARG(adapter),
|
||||
+ upd->interface_stypes);
|
||||
+#endif
|
||||
+
|
||||
+ /* not implemented, see bellow */
|
||||
+}
|
||||
+
|
||||
+#else
|
||||
+
|
||||
static void cfg80211_rtw_mgmt_frame_register(struct wiphy *wiphy,
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
|
||||
struct wireless_dev *wdev,
|
||||
@@ -7369,6 +7396,8 @@ exit:
|
||||
return;
|
||||
}
|
||||
|
||||
+#endif
|
||||
+
|
||||
#if defined(CONFIG_TDLS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0))
|
||||
static int cfg80211_rtw_tdls_mgmt(struct wiphy *wiphy,
|
||||
struct net_device *ndev,
|
||||
@@ -9652,7 +9681,11 @@ static struct cfg80211_ops rtw_cfg80211_ops = {
|
||||
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE)
|
||||
.mgmt_tx = cfg80211_rtw_mgmt_tx,
|
||||
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))
|
||||
+ .update_mgmt_frame_registrations = cfg80211_rtw_update_mgmt_frame_registrations,
|
||||
+#else
|
||||
.mgmt_frame_register = cfg80211_rtw_mgmt_frame_register,
|
||||
+#endif
|
||||
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 34) && LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
|
||||
.action = cfg80211_rtw_mgmt_tx,
|
||||
#endif
|
||||
diff --git a/drivers/net/wireless/rtl8723ds/os_dep/linux/ioctl_cfg80211.c b/drivers/net/wireless/rtl8723ds/os_dep/linux/ioctl_cfg80211.c
|
||||
index 564c2c5..921a452 100644
|
||||
--- a/drivers/net/wireless/rtl8723ds/os_dep/linux/ioctl_cfg80211.c
|
||||
+++ b/drivers/net/wireless/rtl8723ds/os_dep/linux/ioctl_cfg80211.c
|
||||
@@ -5872,6 +5872,33 @@ exit:
|
||||
return ret;
|
||||
}
|
||||
|
||||
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))
|
||||
+
|
||||
+static void
|
||||
+cfg80211_rtw_update_mgmt_frame_registrations(struct wiphy *wiphy,
|
||||
+ struct wireless_dev *wdev,
|
||||
+ struct mgmt_frame_regs *upd)
|
||||
+{
|
||||
+ struct net_device *ndev = wdev_to_ndev(wdev);
|
||||
+ struct rtw_wdev_priv *pwdev_priv;
|
||||
+ _adapter *adapter;
|
||||
+
|
||||
+ if (ndev == NULL)
|
||||
+ return;
|
||||
+
|
||||
+ adapter = (_adapter *)rtw_netdev_priv(ndev);
|
||||
+ pwdev_priv = adapter_wdev_data(adapter);
|
||||
+
|
||||
+#ifdef CONFIG_DEBUG_CFG80211
|
||||
+ RTW_INFO(FUNC_ADPT_FMT" stypes:%x\n", FUNC_ADPT_ARG(adapter),
|
||||
+ upd->interface_stypes);
|
||||
+#endif
|
||||
+
|
||||
+ /* not implemented, see bellow */
|
||||
+}
|
||||
+
|
||||
+#else
|
||||
+
|
||||
static void cfg80211_rtw_mgmt_frame_register(struct wiphy *wiphy,
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
|
||||
struct wireless_dev *wdev,
|
||||
@@ -5916,6 +5943,8 @@ exit:
|
||||
return;
|
||||
}
|
||||
|
||||
+#endif
|
||||
+
|
||||
#if defined(CONFIG_TDLS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0))
|
||||
static int cfg80211_rtw_tdls_mgmt(struct wiphy *wiphy,
|
||||
struct net_device *ndev,
|
||||
@@ -6866,7 +6895,11 @@ static struct cfg80211_ops rtw_cfg80211_ops = {
|
||||
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE)
|
||||
.mgmt_tx = cfg80211_rtw_mgmt_tx,
|
||||
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))
|
||||
+ .update_mgmt_frame_registrations = cfg80211_rtw_update_mgmt_frame_registrations,
|
||||
+#else
|
||||
.mgmt_frame_register = cfg80211_rtw_mgmt_frame_register,
|
||||
+#endif
|
||||
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 34) && LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
|
||||
.action = cfg80211_rtw_mgmt_tx,
|
||||
#endif
|
||||
Loading…
Reference in New Issue
Block a user