mirror of
https://github.com/hardkernel/linux.git
synced 2026-03-25 12:00:22 +09:00
Merge 5.15.131 into android14-5.15-lts
Changes in 5.15.131 erofs: ensure that the post-EOF tails are all zeroed ksmbd: fix wrong DataOffset validation of create context ksmbd: replace one-element array with flex-array member in struct smb2_ea_info ARM: pxa: remove use of symbol_get() mmc: au1xmmc: force non-modular build and remove symbol_get usage net: enetc: use EXPORT_SYMBOL_GPL for enetc_phc_index rtc: ds1685: use EXPORT_SYMBOL_GPL for ds1685_rtc_poweroff modules: only allow symbol_get of EXPORT_SYMBOL_GPL modules USB: serial: option: add Quectel EM05G variant (0x030e) USB: serial: option: add FOXCONN T99W368/T99W373 product ALSA: usb-audio: Fix init call orders for UAC1 usb: dwc3: meson-g12a: do post init to fix broken usb after resumption usb: chipidea: imx: improve logic if samsung,picophy-* parameter is 0 HID: wacom: remove the battery when the EKR is off staging: rtl8712: fix race condition Bluetooth: btsdio: fix use after free bug in btsdio_remove due to race condition wifi: mt76: mt7921: do not support one stream on secondary antenna only serial: qcom-geni: fix opp vote on shutdown serial: sc16is7xx: fix broken port 0 uart init serial: sc16is7xx: fix bug when first setting GPIO direction firmware: stratix10-svc: Fix an NULL vs IS_ERR() bug in probe fsi: master-ast-cf: Add MODULE_FIRMWARE macro tcpm: Avoid soft reset when partner does not support get_status nilfs2: fix general protection fault in nilfs_lookup_dirty_data_buffers() nilfs2: fix WARNING in mark_buffer_dirty due to discarded buffer reuse pinctrl: amd: Don't show `Invalid config param` errors usb: typec: tcpci: move tcpci.h to include/linux/usb/ usb: typec: tcpci: clear the fault status bit Linux 5.15.131 Change-Id: Ibc84babdb4271151877ddf78b9eb2b25c1a43d26 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 15
|
||||
SUBLEVEL = 130
|
||||
SUBLEVEL = 131
|
||||
EXTRAVERSION =
|
||||
NAME = Trick or Treat
|
||||
|
||||
|
||||
@@ -220,8 +220,6 @@ void sharpsl_battery_kick(void)
|
||||
{
|
||||
schedule_delayed_work(&sharpsl_bat, msecs_to_jiffies(125));
|
||||
}
|
||||
EXPORT_SYMBOL(sharpsl_battery_kick);
|
||||
|
||||
|
||||
static void sharpsl_battery_thread(struct work_struct *private_)
|
||||
{
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h> /* symbol_get ; symbol_put */
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
@@ -514,17 +513,6 @@ static struct pxa2xx_spi_chip spitz_ads7846_chip = {
|
||||
.gpio_cs = SPITZ_GPIO_ADS7846_CS,
|
||||
};
|
||||
|
||||
static void spitz_bl_kick_battery(void)
|
||||
{
|
||||
void (*kick_batt)(void);
|
||||
|
||||
kick_batt = symbol_get(sharpsl_battery_kick);
|
||||
if (kick_batt) {
|
||||
kick_batt();
|
||||
symbol_put(sharpsl_battery_kick);
|
||||
}
|
||||
}
|
||||
|
||||
static struct gpiod_lookup_table spitz_lcdcon_gpio_table = {
|
||||
.dev_id = "spi2.1",
|
||||
.table = {
|
||||
@@ -552,7 +540,7 @@ static struct corgi_lcd_platform_data spitz_lcdcon_info = {
|
||||
.max_intensity = 0x2f,
|
||||
.default_intensity = 0x1f,
|
||||
.limit_mask = 0x0b,
|
||||
.kick_battery = spitz_bl_kick_battery,
|
||||
.kick_battery = sharpsl_battery_kick,
|
||||
};
|
||||
|
||||
static struct pxa2xx_spi_chip spitz_lcdcon_chip = {
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/mmc/host.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/spi/spi.h>
|
||||
@@ -167,12 +166,7 @@ static struct platform_device db1x00_audio_dev = {
|
||||
|
||||
static irqreturn_t db1100_mmc_cd(int irq, void *ptr)
|
||||
{
|
||||
void (*mmc_cd)(struct mmc_host *, unsigned long);
|
||||
/* link against CONFIG_MMC=m */
|
||||
mmc_cd = symbol_get(mmc_detect_change);
|
||||
mmc_cd(ptr, msecs_to_jiffies(500));
|
||||
symbol_put(mmc_detect_change);
|
||||
|
||||
mmc_detect_change(ptr, msecs_to_jiffies(500));
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/leds.h>
|
||||
@@ -340,14 +339,7 @@ static irqreturn_t db1200_mmc_cd(int irq, void *ptr)
|
||||
|
||||
static irqreturn_t db1200_mmc_cdfn(int irq, void *ptr)
|
||||
{
|
||||
void (*mmc_cd)(struct mmc_host *, unsigned long);
|
||||
|
||||
/* link against CONFIG_MMC=m */
|
||||
mmc_cd = symbol_get(mmc_detect_change);
|
||||
if (mmc_cd) {
|
||||
mmc_cd(ptr, msecs_to_jiffies(200));
|
||||
symbol_put(mmc_detect_change);
|
||||
}
|
||||
mmc_detect_change(ptr, msecs_to_jiffies(200));
|
||||
|
||||
msleep(100); /* debounce */
|
||||
if (irq == DB1200_SD0_INSERT_INT)
|
||||
@@ -431,14 +423,7 @@ static irqreturn_t pb1200_mmc1_cd(int irq, void *ptr)
|
||||
|
||||
static irqreturn_t pb1200_mmc1_cdfn(int irq, void *ptr)
|
||||
{
|
||||
void (*mmc_cd)(struct mmc_host *, unsigned long);
|
||||
|
||||
/* link against CONFIG_MMC=m */
|
||||
mmc_cd = symbol_get(mmc_detect_change);
|
||||
if (mmc_cd) {
|
||||
mmc_cd(ptr, msecs_to_jiffies(200));
|
||||
symbol_put(mmc_detect_change);
|
||||
}
|
||||
mmc_detect_change(ptr, msecs_to_jiffies(200));
|
||||
|
||||
msleep(100); /* debounce */
|
||||
if (irq == PB1200_SD1_INSERT_INT)
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ata_platform.h>
|
||||
#include <linux/mmc/host.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/platnand.h>
|
||||
#include <linux/platform_device.h>
|
||||
@@ -459,14 +458,7 @@ static irqreturn_t db1300_mmc_cd(int irq, void *ptr)
|
||||
|
||||
static irqreturn_t db1300_mmc_cdfn(int irq, void *ptr)
|
||||
{
|
||||
void (*mmc_cd)(struct mmc_host *, unsigned long);
|
||||
|
||||
/* link against CONFIG_MMC=m. We can only be called once MMC core has
|
||||
* initialized the controller, so symbol_get() should always succeed.
|
||||
*/
|
||||
mmc_cd = symbol_get(mmc_detect_change);
|
||||
mmc_cd(ptr, msecs_to_jiffies(200));
|
||||
symbol_put(mmc_detect_change);
|
||||
mmc_detect_change(ptr, msecs_to_jiffies(200));
|
||||
|
||||
msleep(100); /* debounce */
|
||||
if (irq == DB1300_SD1_INSERT_INT)
|
||||
|
||||
@@ -355,6 +355,7 @@ static void btsdio_remove(struct sdio_func *func)
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
cancel_work_sync(&data->work);
|
||||
hdev = data->hdev;
|
||||
|
||||
sdio_set_drvdata(func, NULL);
|
||||
|
||||
@@ -623,7 +623,7 @@ svc_create_memory_pool(struct platform_device *pdev,
|
||||
paddr = begin;
|
||||
size = end - begin;
|
||||
va = devm_memremap(dev, paddr, size, MEMREMAP_WC);
|
||||
if (!va) {
|
||||
if (IS_ERR(va)) {
|
||||
dev_err(dev, "fail to remap shared memory\n");
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
@@ -1439,3 +1439,4 @@ static struct platform_driver fsi_master_acf = {
|
||||
|
||||
module_platform_driver(fsi_master_acf);
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_FIRMWARE(FW_FILE_NAME);
|
||||
|
||||
@@ -153,6 +153,7 @@ struct wacom_remote {
|
||||
struct input_dev *input;
|
||||
bool registered;
|
||||
struct wacom_battery battery;
|
||||
ktime_t active_time;
|
||||
} remotes[WACOM_MAX_REMOTES];
|
||||
};
|
||||
|
||||
|
||||
@@ -2535,6 +2535,18 @@ fail:
|
||||
return;
|
||||
}
|
||||
|
||||
static void wacom_remote_destroy_battery(struct wacom *wacom, int index)
|
||||
{
|
||||
struct wacom_remote *remote = wacom->remote;
|
||||
|
||||
if (remote->remotes[index].battery.battery) {
|
||||
devres_release_group(&wacom->hdev->dev,
|
||||
&remote->remotes[index].battery.bat_desc);
|
||||
remote->remotes[index].battery.battery = NULL;
|
||||
remote->remotes[index].active_time = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void wacom_remote_destroy_one(struct wacom *wacom, unsigned int index)
|
||||
{
|
||||
struct wacom_remote *remote = wacom->remote;
|
||||
@@ -2549,9 +2561,7 @@ static void wacom_remote_destroy_one(struct wacom *wacom, unsigned int index)
|
||||
remote->remotes[i].registered = false;
|
||||
spin_unlock_irqrestore(&remote->remote_lock, flags);
|
||||
|
||||
if (remote->remotes[i].battery.battery)
|
||||
devres_release_group(&wacom->hdev->dev,
|
||||
&remote->remotes[i].battery.bat_desc);
|
||||
wacom_remote_destroy_battery(wacom, i);
|
||||
|
||||
if (remote->remotes[i].group.name)
|
||||
devres_release_group(&wacom->hdev->dev,
|
||||
@@ -2559,7 +2569,6 @@ static void wacom_remote_destroy_one(struct wacom *wacom, unsigned int index)
|
||||
|
||||
remote->remotes[i].serial = 0;
|
||||
remote->remotes[i].group.name = NULL;
|
||||
remote->remotes[i].battery.battery = NULL;
|
||||
wacom->led.groups[i].select = WACOM_STATUS_UNKNOWN;
|
||||
}
|
||||
}
|
||||
@@ -2644,6 +2653,9 @@ static int wacom_remote_attach_battery(struct wacom *wacom, int index)
|
||||
if (remote->remotes[index].battery.battery)
|
||||
return 0;
|
||||
|
||||
if (!remote->remotes[index].active_time)
|
||||
return 0;
|
||||
|
||||
if (wacom->led.groups[index].select == WACOM_STATUS_UNKNOWN)
|
||||
return 0;
|
||||
|
||||
@@ -2659,6 +2671,7 @@ static void wacom_remote_work(struct work_struct *work)
|
||||
{
|
||||
struct wacom *wacom = container_of(work, struct wacom, remote_work);
|
||||
struct wacom_remote *remote = wacom->remote;
|
||||
ktime_t kt = ktime_get();
|
||||
struct wacom_remote_data data;
|
||||
unsigned long flags;
|
||||
unsigned int count;
|
||||
@@ -2685,6 +2698,10 @@ static void wacom_remote_work(struct work_struct *work)
|
||||
serial = data.remote[i].serial;
|
||||
if (data.remote[i].connected) {
|
||||
|
||||
if (kt - remote->remotes[i].active_time > WACOM_REMOTE_BATTERY_TIMEOUT
|
||||
&& remote->remotes[i].active_time != 0)
|
||||
wacom_remote_destroy_battery(wacom, i);
|
||||
|
||||
if (remote->remotes[i].serial == serial) {
|
||||
wacom_remote_attach_battery(wacom, i);
|
||||
continue;
|
||||
|
||||
@@ -1134,6 +1134,7 @@ static int wacom_remote_irq(struct wacom_wac *wacom_wac, size_t len)
|
||||
if (index < 0 || !remote->remotes[index].registered)
|
||||
goto out;
|
||||
|
||||
remote->remotes[i].active_time = ktime_get();
|
||||
input = remote->remotes[index].input;
|
||||
|
||||
input_report_key(input, BTN_0, (data[9] & 0x01));
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#define WACOM_NAME_MAX 64
|
||||
#define WACOM_MAX_REMOTES 5
|
||||
#define WACOM_STATUS_UNKNOWN 255
|
||||
#define WACOM_REMOTE_BATTERY_TIMEOUT 21000000000ll
|
||||
|
||||
/* packet length for individual models */
|
||||
#define WACOM_PKGLEN_BBFUN 9
|
||||
|
||||
@@ -523,11 +523,12 @@ config MMC_ALCOR
|
||||
of Alcor Micro PCI-E card reader
|
||||
|
||||
config MMC_AU1X
|
||||
tristate "Alchemy AU1XX0 MMC Card Interface support"
|
||||
bool "Alchemy AU1XX0 MMC Card Interface support"
|
||||
depends on MIPS_ALCHEMY
|
||||
depends on MMC=y
|
||||
help
|
||||
This selects the AMD Alchemy(R) Multimedia card interface.
|
||||
If you have a Alchemy platform with a MMC slot, say Y or M here.
|
||||
If you have a Alchemy platform with a MMC slot, say Y here.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#include "enetc.h"
|
||||
|
||||
int enetc_phc_index = -1;
|
||||
EXPORT_SYMBOL(enetc_phc_index);
|
||||
EXPORT_SYMBOL_GPL(enetc_phc_index);
|
||||
|
||||
static struct ptp_clock_info enetc_ptp_caps = {
|
||||
.owner = THIS_MODULE,
|
||||
|
||||
@@ -994,7 +994,7 @@ mt7921_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
|
||||
return -EINVAL;
|
||||
|
||||
if ((BIT(hweight8(tx_ant)) - 1) != tx_ant)
|
||||
tx_ant = BIT(ffs(tx_ant) - 1) - 1;
|
||||
return -EINVAL;
|
||||
|
||||
mt7921_mutex_acquire(dev);
|
||||
|
||||
|
||||
@@ -752,7 +752,7 @@ static int amd_pinconf_get(struct pinctrl_dev *pctldev,
|
||||
break;
|
||||
|
||||
default:
|
||||
dev_err(&gpio_dev->pdev->dev, "Invalid config param %04x\n",
|
||||
dev_dbg(&gpio_dev->pdev->dev, "Invalid config param %04x\n",
|
||||
param);
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
@@ -805,7 +805,7 @@ static int amd_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
|
||||
break;
|
||||
|
||||
default:
|
||||
dev_err(&gpio_dev->pdev->dev,
|
||||
dev_dbg(&gpio_dev->pdev->dev,
|
||||
"Invalid config param %04x\n", param);
|
||||
ret = -ENOTSUPP;
|
||||
}
|
||||
|
||||
@@ -1438,7 +1438,7 @@ ds1685_rtc_poweroff(struct platform_device *pdev)
|
||||
unreachable();
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(ds1685_rtc_poweroff);
|
||||
EXPORT_SYMBOL_GPL(ds1685_rtc_poweroff);
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
|
||||
|
||||
@@ -323,6 +323,7 @@ int r8712_init_drv_sw(struct _adapter *padapter)
|
||||
mp871xinit(padapter);
|
||||
init_default_value(padapter);
|
||||
r8712_InitSwLeds(padapter);
|
||||
mutex_init(&padapter->mutex_start);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -567,7 +567,6 @@ static int r871xu_drv_init(struct usb_interface *pusb_intf,
|
||||
if (rtl871x_load_fw(padapter))
|
||||
goto deinit_drv_sw;
|
||||
spin_lock_init(&padapter->lock_rx_ff0_filter);
|
||||
mutex_init(&padapter->mutex_start);
|
||||
return 0;
|
||||
|
||||
deinit_drv_sw:
|
||||
|
||||
@@ -136,6 +136,7 @@ struct qcom_geni_serial_port {
|
||||
u32 tx_fifo_width;
|
||||
u32 rx_fifo_depth;
|
||||
bool setup;
|
||||
unsigned long clk_rate;
|
||||
int (*handle_rx)(struct uart_port *uport, u32 bytes, bool drop);
|
||||
unsigned int baud;
|
||||
void *rx_fifo;
|
||||
@@ -1034,6 +1035,7 @@ static void qcom_geni_serial_set_termios(struct uart_port *uport,
|
||||
goto out_restart_rx;
|
||||
|
||||
uport->uartclk = clk_rate;
|
||||
port->clk_rate = clk_rate;
|
||||
dev_pm_opp_set_rate(uport->dev, clk_rate);
|
||||
ser_clk_cfg = SER_CLK_EN;
|
||||
ser_clk_cfg |= clk_div << CLK_DIV_SHFT;
|
||||
@@ -1303,10 +1305,13 @@ static void qcom_geni_serial_pm(struct uart_port *uport,
|
||||
|
||||
if (new_state == UART_PM_STATE_ON && old_state == UART_PM_STATE_OFF) {
|
||||
geni_icc_enable(&port->se);
|
||||
if (port->clk_rate)
|
||||
dev_pm_opp_set_rate(uport->dev, port->clk_rate);
|
||||
geni_se_resources_on(&port->se);
|
||||
} else if (new_state == UART_PM_STATE_OFF &&
|
||||
old_state == UART_PM_STATE_ON) {
|
||||
geni_se_resources_off(&port->se);
|
||||
dev_pm_opp_set_rate(uport->dev, 0);
|
||||
geni_icc_disable(&port->se);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1170,9 +1170,18 @@ static int sc16is7xx_gpio_direction_output(struct gpio_chip *chip,
|
||||
state |= BIT(offset);
|
||||
else
|
||||
state &= ~BIT(offset);
|
||||
sc16is7xx_port_write(port, SC16IS7XX_IOSTATE_REG, state);
|
||||
|
||||
/*
|
||||
* If we write IOSTATE first, and then IODIR, the output value is not
|
||||
* transferred to the corresponding I/O pin.
|
||||
* The datasheet states that each register bit will be transferred to
|
||||
* the corresponding I/O pin programmed as output when writing to
|
||||
* IOSTATE. Therefore, configure direction first with IODIR, and then
|
||||
* set value after with IOSTATE.
|
||||
*/
|
||||
sc16is7xx_port_update(port, SC16IS7XX_IODIR_REG, BIT(offset),
|
||||
BIT(offset));
|
||||
sc16is7xx_port_write(port, SC16IS7XX_IOSTATE_REG, state);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1258,6 +1267,12 @@ static int sc16is7xx_probe(struct device *dev,
|
||||
s->p[i].port.fifosize = SC16IS7XX_FIFO_SIZE;
|
||||
s->p[i].port.flags = UPF_FIXED_TYPE | UPF_LOW_LATENCY;
|
||||
s->p[i].port.iobase = i;
|
||||
/*
|
||||
* Use all ones as membase to make sure uart_configure_port() in
|
||||
* serial_core.c does not abort for SPI/I2C devices where the
|
||||
* membase address is not applicable.
|
||||
*/
|
||||
s->p[i].port.membase = (void __iomem *)~0;
|
||||
s->p[i].port.iotype = UPIO_PORT;
|
||||
s->p[i].port.uartclk = freq;
|
||||
s->p[i].port.rs485_config = sc16is7xx_config_rs485;
|
||||
|
||||
@@ -175,10 +175,12 @@ static struct imx_usbmisc_data *usbmisc_get_init_data(struct device *dev)
|
||||
if (of_usb_get_phy_mode(np) == USBPHY_INTERFACE_MODE_ULPI)
|
||||
data->ulpi = 1;
|
||||
|
||||
of_property_read_u32(np, "samsung,picophy-pre-emp-curr-control",
|
||||
&data->emp_curr_control);
|
||||
of_property_read_u32(np, "samsung,picophy-dc-vol-level-adjust",
|
||||
&data->dc_vol_level_adjust);
|
||||
if (of_property_read_u32(np, "samsung,picophy-pre-emp-curr-control",
|
||||
&data->emp_curr_control))
|
||||
data->emp_curr_control = -1;
|
||||
if (of_property_read_u32(np, "samsung,picophy-dc-vol-level-adjust",
|
||||
&data->dc_vol_level_adjust))
|
||||
data->dc_vol_level_adjust = -1;
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
@@ -657,13 +657,15 @@ static int usbmisc_imx7d_init(struct imx_usbmisc_data *data)
|
||||
usbmisc->base + MX7D_USBNC_USB_CTRL2);
|
||||
/* PHY tuning for signal quality */
|
||||
reg = readl(usbmisc->base + MX7D_USB_OTG_PHY_CFG1);
|
||||
if (data->emp_curr_control && data->emp_curr_control <=
|
||||
if (data->emp_curr_control >= 0 &&
|
||||
data->emp_curr_control <=
|
||||
(TXPREEMPAMPTUNE0_MASK >> TXPREEMPAMPTUNE0_BIT)) {
|
||||
reg &= ~TXPREEMPAMPTUNE0_MASK;
|
||||
reg |= (data->emp_curr_control << TXPREEMPAMPTUNE0_BIT);
|
||||
}
|
||||
|
||||
if (data->dc_vol_level_adjust && data->dc_vol_level_adjust <=
|
||||
if (data->dc_vol_level_adjust >= 0 &&
|
||||
data->dc_vol_level_adjust <=
|
||||
(TXVREFTUNE0_MASK >> TXVREFTUNE0_BIT)) {
|
||||
reg &= ~TXVREFTUNE0_MASK;
|
||||
reg |= (data->dc_vol_level_adjust << TXVREFTUNE0_BIT);
|
||||
|
||||
@@ -938,6 +938,12 @@ static int __maybe_unused dwc3_meson_g12a_resume(struct device *dev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (priv->drvdata->usb_post_init) {
|
||||
ret = priv->drvdata->usb_post_init(priv);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -259,6 +259,7 @@ static void option_instat_callback(struct urb *urb);
|
||||
#define QUECTEL_PRODUCT_EM05G 0x030a
|
||||
#define QUECTEL_PRODUCT_EM060K 0x030b
|
||||
#define QUECTEL_PRODUCT_EM05G_CS 0x030c
|
||||
#define QUECTEL_PRODUCT_EM05GV2 0x030e
|
||||
#define QUECTEL_PRODUCT_EM05CN_SG 0x0310
|
||||
#define QUECTEL_PRODUCT_EM05G_SG 0x0311
|
||||
#define QUECTEL_PRODUCT_EM05CN 0x0312
|
||||
@@ -1190,6 +1191,8 @@ static const struct usb_device_id option_ids[] = {
|
||||
.driver_info = RSVD(6) | ZLP },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM05G_GR, 0xff),
|
||||
.driver_info = RSVD(6) | ZLP },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM05GV2, 0xff),
|
||||
.driver_info = RSVD(4) | ZLP },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM05G_CS, 0xff),
|
||||
.driver_info = RSVD(6) | ZLP },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM05G_RS, 0xff),
|
||||
@@ -2232,6 +2235,10 @@ static const struct usb_device_id option_ids[] = {
|
||||
.driver_info = RSVD(0) | RSVD(1) | RSVD(6) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe0db, 0xff), /* Foxconn T99W265 MBIM */
|
||||
.driver_info = RSVD(3) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe0ee, 0xff), /* Foxconn T99W368 MBIM */
|
||||
.driver_info = RSVD(3) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe0f0, 0xff), /* Foxconn T99W373 MBIM */
|
||||
.driver_info = RSVD(3) },
|
||||
{ USB_DEVICE(0x1508, 0x1001), /* Fibocom NL668 (IOT version) */
|
||||
.driver_info = RSVD(4) | RSVD(5) | RSVD(6) },
|
||||
{ USB_DEVICE(0x1782, 0x4d10) }, /* Fibocom L610 (AT mode) */
|
||||
|
||||
@@ -13,12 +13,11 @@
|
||||
#include <linux/property.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/usb/pd.h>
|
||||
#include <linux/usb/tcpci.h>
|
||||
#include <linux/usb/tcpm.h>
|
||||
#include <linux/usb/typec.h>
|
||||
#include <trace/hooks/typec.h>
|
||||
|
||||
#include "tcpci.h"
|
||||
|
||||
#define PD_RETRY_COUNT_DEFAULT 3
|
||||
#define PD_RETRY_COUNT_3_0_OR_HIGHER 2
|
||||
#define AUTO_DISCHARGE_DEFAULT_THRESHOLD_MV 3500
|
||||
@@ -633,6 +632,10 @@ static int tcpci_init(struct tcpc_dev *tcpc)
|
||||
if (time_after(jiffies, timeout))
|
||||
return -ETIMEDOUT;
|
||||
|
||||
ret = tcpci_write16(tcpci, TCPC_FAULT_STATUS, TCPC_FAULT_STATUS_ALL_REG_RST_TO_DEFAULT);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* Handle vendor init */
|
||||
if (tcpci->data->init) {
|
||||
ret = tcpci->data->init(tcpci, tcpci->data);
|
||||
|
||||
@@ -11,11 +11,10 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/usb/pd.h>
|
||||
#include <linux/usb/tcpci.h>
|
||||
#include <linux/usb/tcpm.h>
|
||||
#include <linux/usb/typec.h>
|
||||
|
||||
#include "tcpci.h"
|
||||
|
||||
#define PD_ACTIVITY_TIMEOUT_MS 10000
|
||||
|
||||
#define TCPC_VENDOR_ALERT 0x80
|
||||
|
||||
@@ -11,10 +11,9 @@
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/usb/tcpci.h>
|
||||
#include <linux/usb/tcpm.h>
|
||||
|
||||
#include "tcpci.h"
|
||||
|
||||
#define MT6360_REG_PHYCTRL1 0x80
|
||||
#define MT6360_REG_PHYCTRL3 0x82
|
||||
#define MT6360_REG_PHYCTRL7 0x86
|
||||
|
||||
@@ -10,9 +10,9 @@
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/usb/tcpci.h>
|
||||
#include <linux/usb/tcpm.h>
|
||||
#include <linux/regmap.h>
|
||||
#include "tcpci.h"
|
||||
|
||||
#define RT1711H_VID 0x29CF
|
||||
#define RT1711H_PID 0x1711
|
||||
|
||||
@@ -2705,6 +2705,13 @@ static void tcpm_pd_ctrl_request(struct tcpm_port *port,
|
||||
port->sink_cap_done = true;
|
||||
tcpm_set_state(port, ready_state(port), 0);
|
||||
break;
|
||||
/*
|
||||
* Some port partners do not support GET_STATUS, avoid soft reset the link to
|
||||
* prevent redundant power re-negotiation
|
||||
*/
|
||||
case GET_STATUS_SEND:
|
||||
tcpm_set_state(port, ready_state(port), 0);
|
||||
break;
|
||||
case SRC_READY:
|
||||
case SNK_READY:
|
||||
if (port->vdm_state > VDM_STATE_READY) {
|
||||
|
||||
@@ -828,6 +828,8 @@ hitted:
|
||||
cur = end - min_t(erofs_off_t, offset + end - map->m_la, end);
|
||||
if (!(map->m_flags & EROFS_MAP_MAPPED)) {
|
||||
zero_user_segment(page, cur, end);
|
||||
++spiltted;
|
||||
tight = false;
|
||||
goto next_part;
|
||||
}
|
||||
|
||||
|
||||
@@ -1485,7 +1485,7 @@ struct create_context *smb2_find_context_vals(void *open_req, const char *tag, i
|
||||
name_len < 4 ||
|
||||
name_off + name_len > cc_len ||
|
||||
(value_off & 0x7) != 0 ||
|
||||
(value_off && (value_off < name_off + name_len)) ||
|
||||
(value_len && value_off < name_off + (name_len < 8 ? 8 : name_len)) ||
|
||||
((u64)value_off + value_len > cc_len))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
|
||||
@@ -4289,7 +4289,7 @@ static int smb2_get_ea(struct ksmbd_work *work, struct ksmbd_file *fp,
|
||||
if (!strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN))
|
||||
name_len -= XATTR_USER_PREFIX_LEN;
|
||||
|
||||
ptr = (char *)(&eainfo->name + name_len + 1);
|
||||
ptr = eainfo->name + name_len + 1;
|
||||
buf_free_len -= (offsetof(struct smb2_ea_info, name) +
|
||||
name_len + 1);
|
||||
/* bailout if xattr can't fit in buf_free_len */
|
||||
|
||||
@@ -1567,7 +1567,7 @@ struct smb2_ea_info {
|
||||
__u8 Flags;
|
||||
__u8 EaNameLength;
|
||||
__le16 EaValueLength;
|
||||
char name[1];
|
||||
char name[];
|
||||
/* optionally followed by value */
|
||||
} __packed; /* level 15 Query */
|
||||
|
||||
|
||||
@@ -205,7 +205,8 @@ static int nilfs_palloc_get_block(struct inode *inode, unsigned long blkoff,
|
||||
int ret;
|
||||
|
||||
spin_lock(lock);
|
||||
if (prev->bh && blkoff == prev->blkoff) {
|
||||
if (prev->bh && blkoff == prev->blkoff &&
|
||||
likely(buffer_uptodate(prev->bh))) {
|
||||
get_bh(prev->bh);
|
||||
*bhp = prev->bh;
|
||||
spin_unlock(lock);
|
||||
|
||||
@@ -1029,7 +1029,7 @@ int nilfs_load_inode_block(struct inode *inode, struct buffer_head **pbh)
|
||||
int err;
|
||||
|
||||
spin_lock(&nilfs->ns_inode_lock);
|
||||
if (ii->i_bh == NULL) {
|
||||
if (ii->i_bh == NULL || unlikely(!buffer_uptodate(ii->i_bh))) {
|
||||
spin_unlock(&nilfs->ns_inode_lock);
|
||||
err = nilfs_ifile_get_inode_block(ii->i_root->ifile,
|
||||
inode->i_ino, pbh);
|
||||
@@ -1038,7 +1038,10 @@ int nilfs_load_inode_block(struct inode *inode, struct buffer_head **pbh)
|
||||
spin_lock(&nilfs->ns_inode_lock);
|
||||
if (ii->i_bh == NULL)
|
||||
ii->i_bh = *pbh;
|
||||
else {
|
||||
else if (unlikely(!buffer_uptodate(ii->i_bh))) {
|
||||
__brelse(ii->i_bh);
|
||||
ii->i_bh = *pbh;
|
||||
} else {
|
||||
brelse(*pbh);
|
||||
*pbh = ii->i_bh;
|
||||
}
|
||||
|
||||
@@ -725,6 +725,11 @@ static size_t nilfs_lookup_dirty_data_buffers(struct inode *inode,
|
||||
struct page *page = pvec.pages[i];
|
||||
|
||||
lock_page(page);
|
||||
if (unlikely(page->mapping != mapping)) {
|
||||
/* Exclude pages removed from the address space */
|
||||
unlock_page(page);
|
||||
continue;
|
||||
}
|
||||
if (!page_has_buffers(page))
|
||||
create_empty_buffers(page, i_blocksize(inode), 0);
|
||||
unlock_page(page);
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#define __LINUX_USB_TCPCI_H
|
||||
|
||||
#include <linux/usb/typec.h>
|
||||
#include <linux/usb/tcpm.h>
|
||||
|
||||
#define TCPC_VENDOR_ID 0x0
|
||||
#define TCPC_PRODUCT_ID 0x2
|
||||
@@ -102,6 +103,7 @@
|
||||
#define TCPC_POWER_STATUS_SINKING_VBUS BIT(0)
|
||||
|
||||
#define TCPC_FAULT_STATUS 0x1f
|
||||
#define TCPC_FAULT_STATUS_ALL_REG_RST_TO_DEFAULT BIT(7)
|
||||
|
||||
#define TCPC_ALERT_EXTENDED 0x21
|
||||
|
||||
@@ -2249,12 +2249,20 @@ void *__symbol_get(const char *symbol)
|
||||
};
|
||||
|
||||
preempt_disable();
|
||||
if (!find_symbol(&fsa) || strong_try_module_get(fsa.owner)) {
|
||||
preempt_enable();
|
||||
return NULL;
|
||||
if (!find_symbol(&fsa))
|
||||
goto fail;
|
||||
if (fsa.license != GPL_ONLY) {
|
||||
pr_warn("failing symbol_get of non-GPLONLY symbol %s.\n",
|
||||
symbol);
|
||||
goto fail;
|
||||
}
|
||||
if (strong_try_module_get(fsa.owner))
|
||||
goto fail;
|
||||
preempt_enable();
|
||||
return (void *)kernel_symbol_value(fsa.sym);
|
||||
fail:
|
||||
preempt_enable();
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__symbol_get);
|
||||
|
||||
|
||||
@@ -1093,6 +1093,7 @@ static int __snd_usb_parse_audio_interface(struct snd_usb_audio *chip,
|
||||
int i, altno, err, stream;
|
||||
struct audioformat *fp = NULL;
|
||||
struct snd_usb_power_domain *pd = NULL;
|
||||
bool set_iface_first;
|
||||
int num, protocol;
|
||||
|
||||
dev = chip->dev;
|
||||
@@ -1223,11 +1224,19 @@ static int __snd_usb_parse_audio_interface(struct snd_usb_audio *chip,
|
||||
return err;
|
||||
}
|
||||
|
||||
set_iface_first = false;
|
||||
if (protocol == UAC_VERSION_1 ||
|
||||
(chip->quirk_flags & QUIRK_FLAG_SET_IFACE_FIRST))
|
||||
set_iface_first = true;
|
||||
|
||||
/* try to set the interface... */
|
||||
usb_set_interface(chip->dev, iface_no, 0);
|
||||
if (set_iface_first)
|
||||
usb_set_interface(chip->dev, iface_no, altno);
|
||||
snd_usb_init_pitch(chip, fp);
|
||||
snd_usb_init_sample_rate(chip, fp, fp->rate_max);
|
||||
usb_set_interface(chip->dev, iface_no, altno);
|
||||
if (!set_iface_first)
|
||||
usb_set_interface(chip->dev, iface_no, altno);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user