Merge tag 'v6.12-rc3' into android-mainline
Linux 6.12-rc3 Change-Id: I0de0d98513f7cacf9630e2d5a59f6697ca6b9f2a Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -210,6 +210,9 @@ Felix Moeller <felix@derklecks.de>
|
||||
Fenglin Wu <quic_fenglinw@quicinc.com> <fenglinw@codeaurora.org>
|
||||
Filipe Lautert <filipe@icewall.org>
|
||||
Finn Thain <fthain@linux-m68k.org> <fthain@telegraphics.com.au>
|
||||
Fiona Behrens <me@kloenk.dev>
|
||||
Fiona Behrens <me@kloenk.dev> <me@kloenk.de>
|
||||
Fiona Behrens <me@kloenk.dev> <fin@nyantec.com>
|
||||
Franck Bui-Huu <vagabon.xyz@gmail.com>
|
||||
Frank Rowand <frowand.list@gmail.com> <frank.rowand@am.sony.com>
|
||||
Frank Rowand <frowand.list@gmail.com> <frank.rowand@sony.com>
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/display/elgin,jg10309-01.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Elgin JG10309-01 SPI-controlled display
|
||||
|
||||
maintainers:
|
||||
- Fabio Estevam <festevam@gmail.com>
|
||||
|
||||
description: |
|
||||
The Elgin JG10309-01 SPI-controlled display is used on the RV1108-Elgin-r1
|
||||
board and is a custom display.
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/spi/spi-peripheral-props.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: elgin,jg10309-01
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
spi-max-frequency:
|
||||
maximum: 24000000
|
||||
|
||||
spi-cpha: true
|
||||
|
||||
spi-cpol: true
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- spi-cpha
|
||||
- spi-cpol
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
spi {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
display@0 {
|
||||
compatible = "elgin,jg10309-01";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <24000000>;
|
||||
spi-cpha;
|
||||
spi-cpol;
|
||||
};
|
||||
};
|
||||
@@ -82,9 +82,6 @@ allOf:
|
||||
enum:
|
||||
- fsl,ls1043a-extirq
|
||||
- fsl,ls1046a-extirq
|
||||
- fsl,ls1088a-extirq
|
||||
- fsl,ls2080a-extirq
|
||||
- fsl,lx2160a-extirq
|
||||
then:
|
||||
properties:
|
||||
interrupt-map:
|
||||
@@ -95,6 +92,29 @@ allOf:
|
||||
- const: 0xf
|
||||
- const: 0
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- fsl,ls1088a-extirq
|
||||
- fsl,ls2080a-extirq
|
||||
- fsl,lx2160a-extirq
|
||||
# The driver(drivers/irqchip/irq-ls-extirq.c) have not use standard DT
|
||||
# function to parser interrupt-map. So it doesn't consider '#address-size'
|
||||
# in parent interrupt controller, such as GIC.
|
||||
#
|
||||
# When dt-binding verify interrupt-map, item data matrix is spitted at
|
||||
# incorrect position. Remove interrupt-map restriction because it always
|
||||
# wrong.
|
||||
|
||||
then:
|
||||
properties:
|
||||
interrupt-map-mask:
|
||||
items:
|
||||
- const: 0xf
|
||||
- const: 0
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
|
||||
@@ -113,7 +113,7 @@ properties:
|
||||
|
||||
msi-parent:
|
||||
deprecated: true
|
||||
$ref: /schemas/types.yaml#/definitions/phandle
|
||||
maxItems: 1
|
||||
description:
|
||||
Describes the MSI controller node handling message
|
||||
interrupts for the MC. When there is no translation
|
||||
|
||||
@@ -101,8 +101,6 @@ properties:
|
||||
- domintech,dmard09
|
||||
# DMARD10: 3-axis Accelerometer
|
||||
- domintech,dmard10
|
||||
# Elgin SPI-controlled LCD
|
||||
- elgin,jg10309-01
|
||||
# MMA7660FC: 3-Axis Orientation/Motion Detection Sensor
|
||||
- fsl,mma7660
|
||||
# MMA8450Q: Xtrinsic Low-power, 3-axis Xtrinsic Accelerometer
|
||||
|
||||
@@ -12951,7 +12951,6 @@ LIBATA PATA ARASAN COMPACT FLASH CONTROLLER
|
||||
M: Viresh Kumar <vireshk@kernel.org>
|
||||
L: linux-ide@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git
|
||||
F: drivers/ata/pata_arasan_cf.c
|
||||
F: include/linux/pata_arasan_cf_data.h
|
||||
|
||||
@@ -12965,17 +12964,14 @@ LIBATA PATA FARADAY FTIDE010 AND GEMINI SATA BRIDGE DRIVERS
|
||||
M: Linus Walleij <linus.walleij@linaro.org>
|
||||
L: linux-ide@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git
|
||||
F: drivers/ata/pata_ftide010.c
|
||||
F: drivers/ata/sata_gemini.c
|
||||
F: drivers/ata/sata_gemini.h
|
||||
|
||||
LIBATA SATA AHCI PLATFORM devices support
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Jens Axboe <axboe@kernel.dk>
|
||||
L: linux-ide@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git
|
||||
F: drivers/ata/ahci_platform.c
|
||||
F: drivers/ata/libahci_platform.c
|
||||
F: include/linux/ahci_platform.h
|
||||
@@ -12984,7 +12980,6 @@ LIBATA SATA AHCI SYNOPSYS DWC CONTROLLER DRIVER
|
||||
M: Serge Semin <fancer.lancer@gmail.com>
|
||||
L: linux-ide@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal/libata.git
|
||||
F: Documentation/devicetree/bindings/ata/baikal,bt1-ahci.yaml
|
||||
F: Documentation/devicetree/bindings/ata/snps,dwc-ahci.yaml
|
||||
F: drivers/ata/ahci_dwc.c
|
||||
@@ -12993,7 +12988,6 @@ LIBATA SATA PROMISE TX2/TX4 CONTROLLER DRIVER
|
||||
M: Mikael Pettersson <mikpelinux@gmail.com>
|
||||
L: linux-ide@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git
|
||||
F: drivers/ata/sata_promise.*
|
||||
|
||||
LIBATA SUBSYSTEM (Serial and Parallel ATA drivers)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
VERSION = 6
|
||||
PATCHLEVEL = 12
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc2
|
||||
EXTRAVERSION = -rc3
|
||||
NAME = Baby Opossum Posse
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
||||
@@ -494,6 +494,7 @@ FixupDAR:/* Entry point for dcbx workaround. */
|
||||
bctr /* jump into table */
|
||||
152:
|
||||
mfdar r11
|
||||
mtdar r10
|
||||
mtctr r11 /* restore ctr reg from DAR */
|
||||
mfspr r11, SPRN_SPRG_THREAD
|
||||
stw r10, DAR(r11)
|
||||
|
||||
@@ -1032,6 +1032,10 @@ static u64 xen_do_read_msr(unsigned int msr, int *err)
|
||||
switch (msr) {
|
||||
case MSR_IA32_APICBASE:
|
||||
val &= ~X2APIC_ENABLE;
|
||||
if (smp_processor_id() == 0)
|
||||
val |= MSR_IA32_APICBASE_BSP;
|
||||
else
|
||||
val &= ~MSR_IA32_APICBASE_BSP;
|
||||
break;
|
||||
}
|
||||
return val;
|
||||
|
||||
+10
-66
@@ -448,73 +448,31 @@ static const struct dmi_system_id irq1_level_low_skip_override[] = {
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Asus ExpertBook B1402CBA */
|
||||
/* Asus ExpertBook B1402C* */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "B1402CBA"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "B1402C"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Asus ExpertBook B1402CVA */
|
||||
/* Asus ExpertBook B1502C* */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "B1402CVA"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "B1502C"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Asus ExpertBook B1502CBA */
|
||||
/* Asus ExpertBook B2402 (B2402CBA / B2402FBA / B2402CVA / B2402FVA) */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "B1502CBA"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "B2402"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Asus ExpertBook B1502CGA */
|
||||
/* Asus ExpertBook B2502 (B2502CBA / B2502FBA / B2502CVA / B2502FVA) */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "B1502CGA"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Asus ExpertBook B1502CVA */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "B1502CVA"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Asus ExpertBook B2402CBA */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "B2402CBA"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Asus ExpertBook B2402FBA */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "B2402FBA"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Asus ExpertBook B2502 */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "B2502CBA"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Asus ExpertBook B2502FBA */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "B2502FBA"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Asus ExpertBook B2502CVA */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "B2502CVA"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "B2502"),
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -532,24 +490,10 @@ static const struct dmi_system_id irq1_level_low_skip_override[] = {
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Asus Vivobook Pro N6506MV */
|
||||
/* Asus Vivobook Pro N6506M* */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "N6506MV"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Asus Vivobook Pro N6506MU */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "N6506MU"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Asus Vivobook Pro N6506MJ */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "N6506MJ"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "N6506M"),
|
||||
},
|
||||
},
|
||||
{
|
||||
|
||||
+14
-4
@@ -4099,10 +4099,20 @@ static void ata_eh_handle_port_suspend(struct ata_port *ap)
|
||||
|
||||
WARN_ON(ap->pflags & ATA_PFLAG_SUSPENDED);
|
||||
|
||||
/* Set all devices attached to the port in standby mode */
|
||||
ata_for_each_link(link, ap, HOST_FIRST) {
|
||||
ata_for_each_dev(dev, link, ENABLED)
|
||||
ata_dev_power_set_standby(dev);
|
||||
/*
|
||||
* We will reach this point for all of the PM events:
|
||||
* PM_EVENT_SUSPEND (if runtime pm, PM_EVENT_AUTO will also be set)
|
||||
* PM_EVENT_FREEZE, and PM_EVENT_HIBERNATE.
|
||||
*
|
||||
* We do not want to perform disk spin down for PM_EVENT_FREEZE.
|
||||
* (Spin down will be performed by the subsequent PM_EVENT_HIBERNATE.)
|
||||
*/
|
||||
if (!(ap->pm_mesg.event & PM_EVENT_FREEZE)) {
|
||||
/* Set all devices attached to the port in standby mode */
|
||||
ata_for_each_link(link, ap, HOST_FIRST) {
|
||||
ata_for_each_dev(dev, link, ENABLED)
|
||||
ata_dev_power_set_standby(dev);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+15
-10
@@ -195,6 +195,7 @@ int dev_pm_domain_attach_list(struct device *dev,
|
||||
struct device *pd_dev = NULL;
|
||||
int ret, i, num_pds = 0;
|
||||
bool by_id = true;
|
||||
size_t size;
|
||||
u32 pd_flags = data ? data->pd_flags : 0;
|
||||
u32 link_flags = pd_flags & PD_FLAG_NO_DEV_LINK ? 0 :
|
||||
DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME;
|
||||
@@ -217,19 +218,17 @@ int dev_pm_domain_attach_list(struct device *dev,
|
||||
if (num_pds <= 0)
|
||||
return 0;
|
||||
|
||||
pds = devm_kzalloc(dev, sizeof(*pds), GFP_KERNEL);
|
||||
pds = kzalloc(sizeof(*pds), GFP_KERNEL);
|
||||
if (!pds)
|
||||
return -ENOMEM;
|
||||
|
||||
pds->pd_devs = devm_kcalloc(dev, num_pds, sizeof(*pds->pd_devs),
|
||||
GFP_KERNEL);
|
||||
if (!pds->pd_devs)
|
||||
return -ENOMEM;
|
||||
|
||||
pds->pd_links = devm_kcalloc(dev, num_pds, sizeof(*pds->pd_links),
|
||||
GFP_KERNEL);
|
||||
if (!pds->pd_links)
|
||||
return -ENOMEM;
|
||||
size = sizeof(*pds->pd_devs) + sizeof(*pds->pd_links);
|
||||
pds->pd_devs = kcalloc(num_pds, size, GFP_KERNEL);
|
||||
if (!pds->pd_devs) {
|
||||
ret = -ENOMEM;
|
||||
goto free_pds;
|
||||
}
|
||||
pds->pd_links = (void *)(pds->pd_devs + num_pds);
|
||||
|
||||
if (link_flags && pd_flags & PD_FLAG_DEV_LINK_ON)
|
||||
link_flags |= DL_FLAG_RPM_ACTIVE;
|
||||
@@ -272,6 +271,9 @@ err_attach:
|
||||
device_link_del(pds->pd_links[i]);
|
||||
dev_pm_domain_detach(pds->pd_devs[i], true);
|
||||
}
|
||||
kfree(pds->pd_devs);
|
||||
free_pds:
|
||||
kfree(pds);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dev_pm_domain_attach_list);
|
||||
@@ -363,6 +365,9 @@ void dev_pm_domain_detach_list(struct dev_pm_domain_list *list)
|
||||
device_link_del(list->pd_links[i]);
|
||||
dev_pm_domain_detach(list->pd_devs[i], true);
|
||||
}
|
||||
|
||||
kfree(list->pd_devs);
|
||||
kfree(list);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dev_pm_domain_detach_list);
|
||||
|
||||
|
||||
@@ -406,6 +406,8 @@ static void __aspeed_gpio_set(struct gpio_chip *gc, unsigned int offset,
|
||||
gpio->dcache[GPIO_BANK(offset)] = reg;
|
||||
|
||||
iowrite32(reg, addr);
|
||||
/* Flush write */
|
||||
ioread32(addr);
|
||||
}
|
||||
|
||||
static void aspeed_gpio_set(struct gpio_chip *gc, unsigned int offset,
|
||||
@@ -1191,7 +1193,7 @@ static int __init aspeed_gpio_probe(struct platform_device *pdev)
|
||||
if (!gpio_id)
|
||||
return -EINVAL;
|
||||
|
||||
gpio->clk = of_clk_get(pdev->dev.of_node, 0);
|
||||
gpio->clk = devm_clk_get_enabled(&pdev->dev, NULL);
|
||||
if (IS_ERR(gpio->clk)) {
|
||||
dev_warn(&pdev->dev,
|
||||
"Failed to get clock from devicetree, debouncing disabled\n");
|
||||
|
||||
@@ -1439,8 +1439,8 @@ static int init_kfd_vm(struct amdgpu_vm *vm, void **process_info,
|
||||
list_add_tail(&vm->vm_list_node,
|
||||
&(vm->process_info->vm_list_head));
|
||||
vm->process_info->n_vms++;
|
||||
|
||||
*ef = dma_fence_get(&vm->process_info->eviction_fence->base);
|
||||
if (ef)
|
||||
*ef = dma_fence_get(&vm->process_info->eviction_fence->base);
|
||||
mutex_unlock(&vm->process_info->lock);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -1702,12 +1702,15 @@ int kfd_process_device_init_vm(struct kfd_process_device *pdd,
|
||||
|
||||
ret = amdgpu_amdkfd_gpuvm_acquire_process_vm(dev->adev, avm,
|
||||
&p->kgd_process_info,
|
||||
&ef);
|
||||
p->ef ? NULL : &ef);
|
||||
if (ret) {
|
||||
dev_err(dev->adev->dev, "Failed to create process VM object\n");
|
||||
return ret;
|
||||
}
|
||||
RCU_INIT_POINTER(p->ef, ef);
|
||||
|
||||
if (!p->ef)
|
||||
RCU_INIT_POINTER(p->ef, ef);
|
||||
|
||||
pdd->drm_priv = drm_file->private_data;
|
||||
|
||||
ret = kfd_process_device_reserve_ib_mem(pdd);
|
||||
|
||||
@@ -2972,10 +2972,11 @@ static int dm_suspend(void *handle)
|
||||
|
||||
hpd_rx_irq_work_suspend(dm);
|
||||
|
||||
if (adev->dm.dc->caps.ips_support)
|
||||
dc_allow_idle_optimizations(adev->dm.dc, true);
|
||||
|
||||
dc_set_power_state(dm->dc, DC_ACPI_CM_POWER_STATE_D3);
|
||||
|
||||
if (dm->dc->caps.ips_support && adev->in_s0ix)
|
||||
dc_allow_idle_optimizations(dm->dc, true);
|
||||
|
||||
dc_dmub_srv_set_power_state(dm->dc->ctx->dmub_srv, DC_ACPI_CM_POWER_STATE_D3);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -5065,11 +5065,26 @@ static bool update_planes_and_stream_v3(struct dc *dc,
|
||||
return true;
|
||||
}
|
||||
|
||||
static void clear_update_flags(struct dc_surface_update *srf_updates,
|
||||
int surface_count, struct dc_stream_state *stream)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (stream)
|
||||
stream->update_flags.raw = 0;
|
||||
|
||||
for (i = 0; i < surface_count; i++)
|
||||
if (srf_updates[i].surface)
|
||||
srf_updates[i].surface->update_flags.raw = 0;
|
||||
}
|
||||
|
||||
bool dc_update_planes_and_stream(struct dc *dc,
|
||||
struct dc_surface_update *srf_updates, int surface_count,
|
||||
struct dc_stream_state *stream,
|
||||
struct dc_stream_update *stream_update)
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
dc_exit_ips_for_hw_access(dc);
|
||||
/*
|
||||
* update planes and stream version 3 separates FULL and FAST updates
|
||||
@@ -5086,10 +5101,16 @@ bool dc_update_planes_and_stream(struct dc *dc,
|
||||
* features as they are now transparent to the new sequence.
|
||||
*/
|
||||
if (dc->ctx->dce_version >= DCN_VERSION_4_01)
|
||||
return update_planes_and_stream_v3(dc, srf_updates,
|
||||
ret = update_planes_and_stream_v3(dc, srf_updates,
|
||||
surface_count, stream, stream_update);
|
||||
return update_planes_and_stream_v2(dc, srf_updates,
|
||||
else
|
||||
ret = update_planes_and_stream_v2(dc, srf_updates,
|
||||
surface_count, stream, stream_update);
|
||||
|
||||
if (ret)
|
||||
clear_update_flags(srf_updates, surface_count, stream);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void dc_commit_updates_for_stream(struct dc *dc,
|
||||
@@ -5099,6 +5120,8 @@ void dc_commit_updates_for_stream(struct dc *dc,
|
||||
struct dc_stream_update *stream_update,
|
||||
struct dc_state *state)
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
dc_exit_ips_for_hw_access(dc);
|
||||
/* TODO: Since change commit sequence can have a huge impact,
|
||||
* we decided to only enable it for DCN3x. However, as soon as
|
||||
@@ -5106,17 +5129,17 @@ void dc_commit_updates_for_stream(struct dc *dc,
|
||||
* the new sequence for all ASICs.
|
||||
*/
|
||||
if (dc->ctx->dce_version >= DCN_VERSION_4_01) {
|
||||
update_planes_and_stream_v3(dc, srf_updates, surface_count,
|
||||
ret = update_planes_and_stream_v3(dc, srf_updates, surface_count,
|
||||
stream, stream_update);
|
||||
return;
|
||||
}
|
||||
if (dc->ctx->dce_version >= DCN_VERSION_3_2) {
|
||||
update_planes_and_stream_v2(dc, srf_updates, surface_count,
|
||||
} else if (dc->ctx->dce_version >= DCN_VERSION_3_2) {
|
||||
ret = update_planes_and_stream_v2(dc, srf_updates, surface_count,
|
||||
stream, stream_update);
|
||||
return;
|
||||
}
|
||||
update_planes_and_stream_v1(dc, srf_updates, surface_count, stream,
|
||||
stream_update, state);
|
||||
} else
|
||||
ret = update_planes_and_stream_v1(dc, srf_updates, surface_count, stream,
|
||||
stream_update, state);
|
||||
|
||||
if (ret)
|
||||
clear_update_flags(srf_updates, surface_count, stream);
|
||||
}
|
||||
|
||||
uint8_t dc_get_current_stream_count(struct dc *dc)
|
||||
|
||||
@@ -60,7 +60,7 @@ struct vi_dpm_level {
|
||||
|
||||
struct vi_dpm_table {
|
||||
uint32_t count;
|
||||
struct vi_dpm_level dpm_level[] __counted_by(count);
|
||||
struct vi_dpm_level dpm_level[];
|
||||
};
|
||||
|
||||
#define PCIE_PERF_REQ_REMOVE_REGISTRY 0
|
||||
@@ -91,7 +91,7 @@ struct phm_set_power_state_input {
|
||||
|
||||
struct phm_clock_array {
|
||||
uint32_t count;
|
||||
uint32_t values[] __counted_by(count);
|
||||
uint32_t values[];
|
||||
};
|
||||
|
||||
struct phm_clock_voltage_dependency_record {
|
||||
@@ -123,7 +123,7 @@ struct phm_acpclock_voltage_dependency_record {
|
||||
|
||||
struct phm_clock_voltage_dependency_table {
|
||||
uint32_t count;
|
||||
struct phm_clock_voltage_dependency_record entries[] __counted_by(count);
|
||||
struct phm_clock_voltage_dependency_record entries[];
|
||||
};
|
||||
|
||||
struct phm_phase_shedding_limits_record {
|
||||
@@ -140,7 +140,7 @@ struct phm_uvd_clock_voltage_dependency_record {
|
||||
|
||||
struct phm_uvd_clock_voltage_dependency_table {
|
||||
uint8_t count;
|
||||
struct phm_uvd_clock_voltage_dependency_record entries[] __counted_by(count);
|
||||
struct phm_uvd_clock_voltage_dependency_record entries[];
|
||||
};
|
||||
|
||||
struct phm_acp_clock_voltage_dependency_record {
|
||||
@@ -150,7 +150,7 @@ struct phm_acp_clock_voltage_dependency_record {
|
||||
|
||||
struct phm_acp_clock_voltage_dependency_table {
|
||||
uint32_t count;
|
||||
struct phm_acp_clock_voltage_dependency_record entries[] __counted_by(count);
|
||||
struct phm_acp_clock_voltage_dependency_record entries[];
|
||||
};
|
||||
|
||||
struct phm_vce_clock_voltage_dependency_record {
|
||||
@@ -161,32 +161,32 @@ struct phm_vce_clock_voltage_dependency_record {
|
||||
|
||||
struct phm_phase_shedding_limits_table {
|
||||
uint32_t count;
|
||||
struct phm_phase_shedding_limits_record entries[] __counted_by(count);
|
||||
struct phm_phase_shedding_limits_record entries[];
|
||||
};
|
||||
|
||||
struct phm_vceclock_voltage_dependency_table {
|
||||
uint8_t count;
|
||||
struct phm_vceclock_voltage_dependency_record entries[] __counted_by(count);
|
||||
struct phm_vceclock_voltage_dependency_record entries[];
|
||||
};
|
||||
|
||||
struct phm_uvdclock_voltage_dependency_table {
|
||||
uint8_t count;
|
||||
struct phm_uvdclock_voltage_dependency_record entries[] __counted_by(count);
|
||||
struct phm_uvdclock_voltage_dependency_record entries[];
|
||||
};
|
||||
|
||||
struct phm_samuclock_voltage_dependency_table {
|
||||
uint8_t count;
|
||||
struct phm_samuclock_voltage_dependency_record entries[] __counted_by(count);
|
||||
struct phm_samuclock_voltage_dependency_record entries[];
|
||||
};
|
||||
|
||||
struct phm_acpclock_voltage_dependency_table {
|
||||
uint32_t count;
|
||||
struct phm_acpclock_voltage_dependency_record entries[] __counted_by(count);
|
||||
struct phm_acpclock_voltage_dependency_record entries[];
|
||||
};
|
||||
|
||||
struct phm_vce_clock_voltage_dependency_table {
|
||||
uint8_t count;
|
||||
struct phm_vce_clock_voltage_dependency_record entries[] __counted_by(count);
|
||||
struct phm_vce_clock_voltage_dependency_record entries[];
|
||||
};
|
||||
|
||||
|
||||
@@ -393,7 +393,7 @@ union phm_cac_leakage_record {
|
||||
|
||||
struct phm_cac_leakage_table {
|
||||
uint32_t count;
|
||||
union phm_cac_leakage_record entries[] __counted_by(count);
|
||||
union phm_cac_leakage_record entries[];
|
||||
};
|
||||
|
||||
struct phm_samu_clock_voltage_dependency_record {
|
||||
@@ -404,7 +404,7 @@ struct phm_samu_clock_voltage_dependency_record {
|
||||
|
||||
struct phm_samu_clock_voltage_dependency_table {
|
||||
uint8_t count;
|
||||
struct phm_samu_clock_voltage_dependency_record entries[] __counted_by(count);
|
||||
struct phm_samu_clock_voltage_dependency_record entries[];
|
||||
};
|
||||
|
||||
struct phm_cac_tdp_table {
|
||||
|
||||
@@ -50,7 +50,8 @@ static void drm_fbdev_dma_fb_destroy(struct fb_info *info)
|
||||
if (!fb_helper->dev)
|
||||
return;
|
||||
|
||||
fb_deferred_io_cleanup(info);
|
||||
if (info->fbdefio)
|
||||
fb_deferred_io_cleanup(info);
|
||||
drm_fb_helper_fini(fb_helper);
|
||||
|
||||
drm_client_buffer_vunmap(fb_helper->buffer);
|
||||
|
||||
@@ -1094,7 +1094,8 @@ static void intel_hdcp_update_value(struct intel_connector *connector,
|
||||
hdcp->value = value;
|
||||
if (update_property) {
|
||||
drm_connector_get(&connector->base);
|
||||
queue_work(i915->unordered_wq, &hdcp->prop_work);
|
||||
if (!queue_work(i915->unordered_wq, &hdcp->prop_work))
|
||||
drm_connector_put(&connector->base);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2524,7 +2525,8 @@ void intel_hdcp_update_pipe(struct intel_atomic_state *state,
|
||||
mutex_lock(&hdcp->mutex);
|
||||
hdcp->value = DRM_MODE_CONTENT_PROTECTION_DESIRED;
|
||||
drm_connector_get(&connector->base);
|
||||
queue_work(i915->unordered_wq, &hdcp->prop_work);
|
||||
if (!queue_work(i915->unordered_wq, &hdcp->prop_work))
|
||||
drm_connector_put(&connector->base);
|
||||
mutex_unlock(&hdcp->mutex);
|
||||
}
|
||||
|
||||
@@ -2541,7 +2543,9 @@ void intel_hdcp_update_pipe(struct intel_atomic_state *state,
|
||||
*/
|
||||
if (!desired_and_not_enabled && !content_protection_type_changed) {
|
||||
drm_connector_get(&connector->base);
|
||||
queue_work(i915->unordered_wq, &hdcp->prop_work);
|
||||
if (!queue_work(i915->unordered_wq, &hdcp->prop_work))
|
||||
drm_connector_put(&connector->base);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -210,7 +210,7 @@ struct nvkm_gsp {
|
||||
} *rm;
|
||||
|
||||
struct {
|
||||
struct mutex mutex;;
|
||||
struct mutex mutex;
|
||||
struct idr idr;
|
||||
} client_id;
|
||||
|
||||
|
||||
@@ -193,7 +193,7 @@ static vm_fault_t nouveau_dmem_migrate_to_ram(struct vm_fault *vmf)
|
||||
if (!spage || !(src & MIGRATE_PFN_MIGRATE))
|
||||
goto done;
|
||||
|
||||
dpage = alloc_page_vma(GFP_HIGHUSER, vmf->vma, vmf->address);
|
||||
dpage = alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO, vmf->vma, vmf->address);
|
||||
if (!dpage)
|
||||
goto done;
|
||||
|
||||
|
||||
@@ -331,7 +331,7 @@ nouveau_accel_ce_init(struct nouveau_drm *drm)
|
||||
return;
|
||||
}
|
||||
|
||||
ret = nouveau_channel_new(&drm->client, false, runm, NvDmaFB, NvDmaTT, &drm->cechan);
|
||||
ret = nouveau_channel_new(&drm->client, true, runm, NvDmaFB, NvDmaTT, &drm->cechan);
|
||||
if (ret)
|
||||
NV_ERROR(drm, "failed to create ce channel, %d\n", ret);
|
||||
}
|
||||
|
||||
@@ -228,10 +228,8 @@ void radeon_dp_aux_init(struct radeon_connector *radeon_connector)
|
||||
{
|
||||
struct drm_device *dev = radeon_connector->base.dev;
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
int ret;
|
||||
|
||||
radeon_connector->ddc_bus->rec.hpd = radeon_connector->hpd.hpd;
|
||||
radeon_connector->ddc_bus->aux.dev = radeon_connector->base.kdev;
|
||||
radeon_connector->ddc_bus->aux.drm_dev = radeon_connector->base.dev;
|
||||
if (ASIC_IS_DCE5(rdev)) {
|
||||
if (radeon_auxch)
|
||||
@@ -242,11 +240,8 @@ void radeon_dp_aux_init(struct radeon_connector *radeon_connector)
|
||||
radeon_connector->ddc_bus->aux.transfer = radeon_dp_aux_transfer_atom;
|
||||
}
|
||||
|
||||
ret = drm_dp_aux_register(&radeon_connector->ddc_bus->aux);
|
||||
if (!ret)
|
||||
radeon_connector->ddc_bus->has_aux = true;
|
||||
|
||||
WARN(ret, "drm_dp_aux_register() failed with error %d\n", ret);
|
||||
drm_dp_aux_init(&radeon_connector->ddc_bus->aux);
|
||||
radeon_connector->ddc_bus->has_aux = true;
|
||||
}
|
||||
|
||||
/***** general DP utility functions *****/
|
||||
|
||||
@@ -1786,6 +1786,20 @@ static enum drm_mode_status radeon_dp_mode_valid(struct drm_connector *connector
|
||||
return MODE_OK;
|
||||
}
|
||||
|
||||
static int
|
||||
radeon_connector_late_register(struct drm_connector *connector)
|
||||
{
|
||||
struct radeon_connector *radeon_connector = to_radeon_connector(connector);
|
||||
int r = 0;
|
||||
|
||||
if (radeon_connector->ddc_bus->has_aux) {
|
||||
radeon_connector->ddc_bus->aux.dev = radeon_connector->base.kdev;
|
||||
r = drm_dp_aux_register(&radeon_connector->ddc_bus->aux);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static const struct drm_connector_helper_funcs radeon_dp_connector_helper_funcs = {
|
||||
.get_modes = radeon_dp_get_modes,
|
||||
.mode_valid = radeon_dp_mode_valid,
|
||||
@@ -1800,6 +1814,7 @@ static const struct drm_connector_funcs radeon_dp_connector_funcs = {
|
||||
.early_unregister = radeon_connector_unregister,
|
||||
.destroy = radeon_connector_destroy,
|
||||
.force = radeon_dvi_force,
|
||||
.late_register = radeon_connector_late_register,
|
||||
};
|
||||
|
||||
static const struct drm_connector_funcs radeon_edp_connector_funcs = {
|
||||
@@ -1810,6 +1825,7 @@ static const struct drm_connector_funcs radeon_edp_connector_funcs = {
|
||||
.early_unregister = radeon_connector_unregister,
|
||||
.destroy = radeon_connector_destroy,
|
||||
.force = radeon_dvi_force,
|
||||
.late_register = radeon_connector_late_register,
|
||||
};
|
||||
|
||||
static const struct drm_connector_funcs radeon_lvds_bridge_connector_funcs = {
|
||||
@@ -1820,6 +1836,7 @@ static const struct drm_connector_funcs radeon_lvds_bridge_connector_funcs = {
|
||||
.early_unregister = radeon_connector_unregister,
|
||||
.destroy = radeon_connector_destroy,
|
||||
.force = radeon_dvi_force,
|
||||
.late_register = radeon_connector_late_register,
|
||||
};
|
||||
|
||||
void
|
||||
|
||||
@@ -44,8 +44,6 @@ struct sg_table *radeon_gem_prime_get_sg_table(struct drm_gem_object *obj);
|
||||
int radeon_gem_prime_pin(struct drm_gem_object *obj);
|
||||
void radeon_gem_prime_unpin(struct drm_gem_object *obj);
|
||||
|
||||
const struct drm_gem_object_funcs radeon_gem_object_funcs;
|
||||
|
||||
static vm_fault_t radeon_gem_fault(struct vm_fault *vmf)
|
||||
{
|
||||
struct ttm_buffer_object *bo = vmf->vma->vm_private_data;
|
||||
@@ -132,7 +130,6 @@ retry:
|
||||
return r;
|
||||
}
|
||||
*obj = &robj->tbo.base;
|
||||
(*obj)->funcs = &radeon_gem_object_funcs;
|
||||
robj->pid = task_pid_nr(current);
|
||||
|
||||
mutex_lock(&rdev->gem.mutex);
|
||||
|
||||
@@ -151,6 +151,7 @@ int radeon_bo_create(struct radeon_device *rdev,
|
||||
if (bo == NULL)
|
||||
return -ENOMEM;
|
||||
drm_gem_private_object_init(rdev_to_drm(rdev), &bo->tbo.base, size);
|
||||
bo->tbo.base.funcs = &radeon_gem_object_funcs;
|
||||
bo->rdev = rdev;
|
||||
bo->surface_reg = -1;
|
||||
INIT_LIST_HEAD(&bo->list);
|
||||
|
||||
@@ -87,6 +87,12 @@
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include "gpu_scheduler_trace.h"
|
||||
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
static struct lockdep_map drm_sched_lockdep_map = {
|
||||
.name = "drm_sched_lockdep_map"
|
||||
};
|
||||
#endif
|
||||
|
||||
#define to_drm_sched_job(sched_job) \
|
||||
container_of((sched_job), struct drm_sched_job, queue_node)
|
||||
|
||||
@@ -1269,7 +1275,12 @@ int drm_sched_init(struct drm_gpu_scheduler *sched,
|
||||
sched->submit_wq = submit_wq;
|
||||
sched->own_submit_wq = false;
|
||||
} else {
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
sched->submit_wq = alloc_ordered_workqueue_lockdep_map(name, 0,
|
||||
&drm_sched_lockdep_map);
|
||||
#else
|
||||
sched->submit_wq = alloc_ordered_workqueue(name, 0);
|
||||
#endif
|
||||
if (!sched->submit_wq)
|
||||
return -ENOMEM;
|
||||
|
||||
|
||||
@@ -46,7 +46,6 @@ struct gr3d {
|
||||
unsigned int nclocks;
|
||||
struct reset_control_bulk_data resets[RST_GR3D_MAX];
|
||||
unsigned int nresets;
|
||||
struct dev_pm_domain_list *pd_list;
|
||||
|
||||
DECLARE_BITMAP(addr_regs, GR3D_NUM_REGS);
|
||||
};
|
||||
@@ -370,12 +369,18 @@ static int gr3d_power_up_legacy_domain(struct device *dev, const char *name,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void gr3d_del_link(void *link)
|
||||
{
|
||||
device_link_del(link);
|
||||
}
|
||||
|
||||
static int gr3d_init_power(struct device *dev, struct gr3d *gr3d)
|
||||
{
|
||||
struct dev_pm_domain_attach_data pd_data = {
|
||||
.pd_names = (const char *[]) { "3d0", "3d1" },
|
||||
.num_pd_names = 2,
|
||||
};
|
||||
static const char * const opp_genpd_names[] = { "3d0", "3d1", NULL };
|
||||
const u32 link_flags = DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME;
|
||||
struct device **opp_virt_devs, *pd_dev;
|
||||
struct device_link *link;
|
||||
unsigned int i;
|
||||
int err;
|
||||
|
||||
err = of_count_phandle_with_args(dev->of_node, "power-domains",
|
||||
@@ -409,10 +414,29 @@ static int gr3d_init_power(struct device *dev, struct gr3d *gr3d)
|
||||
if (dev->pm_domain)
|
||||
return 0;
|
||||
|
||||
err = dev_pm_domain_attach_list(dev, &pd_data, &gr3d->pd_list);
|
||||
if (err < 0)
|
||||
err = devm_pm_opp_attach_genpd(dev, opp_genpd_names, &opp_virt_devs);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
for (i = 0; opp_genpd_names[i]; i++) {
|
||||
pd_dev = opp_virt_devs[i];
|
||||
if (!pd_dev) {
|
||||
dev_err(dev, "failed to get %s power domain\n",
|
||||
opp_genpd_names[i]);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
link = device_link_add(dev, pd_dev, link_flags);
|
||||
if (!link) {
|
||||
dev_err(dev, "failed to link to %s\n", dev_name(pd_dev));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
err = devm_add_action_or_reset(dev, gr3d_del_link, link);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -503,13 +527,13 @@ static int gr3d_probe(struct platform_device *pdev)
|
||||
|
||||
err = devm_tegra_core_dev_init_opp_table_common(&pdev->dev);
|
||||
if (err)
|
||||
goto err;
|
||||
return err;
|
||||
|
||||
err = host1x_client_register(&gr3d->client.base);
|
||||
if (err < 0) {
|
||||
dev_err(&pdev->dev, "failed to register host1x client: %d\n",
|
||||
err);
|
||||
goto err;
|
||||
return err;
|
||||
}
|
||||
|
||||
/* initialize address register map */
|
||||
@@ -517,9 +541,6 @@ static int gr3d_probe(struct platform_device *pdev)
|
||||
set_bit(gr3d_addr_regs[i], gr3d->addr_regs);
|
||||
|
||||
return 0;
|
||||
err:
|
||||
dev_pm_domain_detach_list(gr3d->pd_list);
|
||||
return err;
|
||||
}
|
||||
|
||||
static void gr3d_remove(struct platform_device *pdev)
|
||||
@@ -528,7 +549,6 @@ static void gr3d_remove(struct platform_device *pdev)
|
||||
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
host1x_client_unregister(&gr3d->client.base);
|
||||
dev_pm_domain_detach_list(gr3d->pd_list);
|
||||
}
|
||||
|
||||
static int __maybe_unused gr3d_runtime_suspend(struct device *dev)
|
||||
|
||||
@@ -306,6 +306,11 @@ void v3d_perfmon_open_file(struct v3d_file_priv *v3d_priv)
|
||||
static int v3d_perfmon_idr_del(int id, void *elem, void *data)
|
||||
{
|
||||
struct v3d_perfmon *perfmon = elem;
|
||||
struct v3d_dev *v3d = (struct v3d_dev *)data;
|
||||
|
||||
/* If the active perfmon is being destroyed, stop it first */
|
||||
if (perfmon == v3d->active_perfmon)
|
||||
v3d_perfmon_stop(v3d, perfmon, false);
|
||||
|
||||
v3d_perfmon_put(perfmon);
|
||||
|
||||
@@ -314,8 +319,10 @@ static int v3d_perfmon_idr_del(int id, void *elem, void *data)
|
||||
|
||||
void v3d_perfmon_close_file(struct v3d_file_priv *v3d_priv)
|
||||
{
|
||||
struct v3d_dev *v3d = v3d_priv->v3d;
|
||||
|
||||
mutex_lock(&v3d_priv->perfmon.lock);
|
||||
idr_for_each(&v3d_priv->perfmon.idr, v3d_perfmon_idr_del, NULL);
|
||||
idr_for_each(&v3d_priv->perfmon.idr, v3d_perfmon_idr_del, v3d);
|
||||
idr_destroy(&v3d_priv->perfmon.idr);
|
||||
mutex_unlock(&v3d_priv->perfmon.lock);
|
||||
mutex_destroy(&v3d_priv->perfmon.lock);
|
||||
|
||||
@@ -116,6 +116,11 @@ void vc4_perfmon_open_file(struct vc4_file *vc4file)
|
||||
static int vc4_perfmon_idr_del(int id, void *elem, void *data)
|
||||
{
|
||||
struct vc4_perfmon *perfmon = elem;
|
||||
struct vc4_dev *vc4 = (struct vc4_dev *)data;
|
||||
|
||||
/* If the active perfmon is being destroyed, stop it first */
|
||||
if (perfmon == vc4->active_perfmon)
|
||||
vc4_perfmon_stop(vc4, perfmon, false);
|
||||
|
||||
vc4_perfmon_put(perfmon);
|
||||
|
||||
@@ -130,7 +135,7 @@ void vc4_perfmon_close_file(struct vc4_file *vc4file)
|
||||
return;
|
||||
|
||||
mutex_lock(&vc4file->perfmon.lock);
|
||||
idr_for_each(&vc4file->perfmon.idr, vc4_perfmon_idr_del, NULL);
|
||||
idr_for_each(&vc4file->perfmon.idr, vc4_perfmon_idr_del, vc4);
|
||||
idr_destroy(&vc4file->perfmon.idr);
|
||||
mutex_unlock(&vc4file->perfmon.lock);
|
||||
mutex_destroy(&vc4file->perfmon.lock);
|
||||
|
||||
@@ -187,7 +187,7 @@ void xe_debugfs_register(struct xe_device *xe)
|
||||
debugfs_create_file("forcewake_all", 0400, root, xe,
|
||||
&forcewake_all_fops);
|
||||
|
||||
debugfs_create_file("wedged_mode", 0400, root, xe,
|
||||
debugfs_create_file("wedged_mode", 0600, root, xe,
|
||||
&wedged_mode_fops);
|
||||
|
||||
for (mem_type = XE_PL_VRAM0; mem_type <= XE_PL_VRAM1; ++mem_type) {
|
||||
|
||||
@@ -874,7 +874,9 @@ int xe_gt_sanitize_freq(struct xe_gt *gt)
|
||||
int ret = 0;
|
||||
|
||||
if ((!xe_uc_fw_is_available(>->uc.gsc.fw) ||
|
||||
xe_uc_fw_is_loaded(>->uc.gsc.fw)) && XE_WA(gt, 22019338487))
|
||||
xe_uc_fw_is_loaded(>->uc.gsc.fw) ||
|
||||
xe_uc_fw_is_in_error_state(>->uc.gsc.fw)) &&
|
||||
XE_WA(gt, 22019338487))
|
||||
ret = xe_guc_pc_restore_stashed_freq(>->uc.guc.pc);
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -667,16 +667,12 @@ static int __guc_ct_send_locked(struct xe_guc_ct *ct, const u32 *action,
|
||||
num_g2h = 1;
|
||||
|
||||
if (g2h_fence_needs_alloc(g2h_fence)) {
|
||||
void *ptr;
|
||||
|
||||
g2h_fence->seqno = next_ct_seqno(ct, true);
|
||||
ptr = xa_store(&ct->fence_lookup,
|
||||
g2h_fence->seqno,
|
||||
g2h_fence, GFP_ATOMIC);
|
||||
if (IS_ERR(ptr)) {
|
||||
ret = PTR_ERR(ptr);
|
||||
ret = xa_err(xa_store(&ct->fence_lookup,
|
||||
g2h_fence->seqno, g2h_fence,
|
||||
GFP_ATOMIC));
|
||||
if (ret)
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
seqno = g2h_fence->seqno;
|
||||
@@ -879,14 +875,11 @@ retry:
|
||||
retry_same_fence:
|
||||
ret = guc_ct_send(ct, action, len, 0, 0, &g2h_fence);
|
||||
if (unlikely(ret == -ENOMEM)) {
|
||||
void *ptr;
|
||||
|
||||
/* Retry allocation /w GFP_KERNEL */
|
||||
ptr = xa_store(&ct->fence_lookup,
|
||||
g2h_fence.seqno,
|
||||
&g2h_fence, GFP_KERNEL);
|
||||
if (IS_ERR(ptr))
|
||||
return PTR_ERR(ptr);
|
||||
ret = xa_err(xa_store(&ct->fence_lookup, g2h_fence.seqno,
|
||||
&g2h_fence, GFP_KERNEL));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
goto retry_same_fence;
|
||||
} else if (unlikely(ret)) {
|
||||
@@ -903,16 +896,26 @@ retry_same_fence:
|
||||
}
|
||||
|
||||
ret = wait_event_timeout(ct->g2h_fence_wq, g2h_fence.done, HZ);
|
||||
|
||||
/*
|
||||
* Ensure we serialize with completion side to prevent UAF with fence going out of scope on
|
||||
* the stack, since we have no clue if it will fire after the timeout before we can erase
|
||||
* from the xa. Also we have some dependent loads and stores below for which we need the
|
||||
* correct ordering, and we lack the needed barriers.
|
||||
*/
|
||||
mutex_lock(&ct->lock);
|
||||
if (!ret) {
|
||||
xe_gt_err(gt, "Timed out wait for G2H, fence %u, action %04x",
|
||||
g2h_fence.seqno, action[0]);
|
||||
xe_gt_err(gt, "Timed out wait for G2H, fence %u, action %04x, done %s",
|
||||
g2h_fence.seqno, action[0], str_yes_no(g2h_fence.done));
|
||||
xa_erase_irq(&ct->fence_lookup, g2h_fence.seqno);
|
||||
mutex_unlock(&ct->lock);
|
||||
return -ETIME;
|
||||
}
|
||||
|
||||
if (g2h_fence.retry) {
|
||||
xe_gt_dbg(gt, "H2G action %#x retrying: reason %#x\n",
|
||||
action[0], g2h_fence.reason);
|
||||
mutex_unlock(&ct->lock);
|
||||
goto retry;
|
||||
}
|
||||
if (g2h_fence.fail) {
|
||||
@@ -921,7 +924,12 @@ retry_same_fence:
|
||||
ret = -EIO;
|
||||
}
|
||||
|
||||
return ret > 0 ? response_buffer ? g2h_fence.response_len : g2h_fence.response_data : ret;
|
||||
if (ret > 0)
|
||||
ret = response_buffer ? g2h_fence.response_len : g2h_fence.response_data;
|
||||
|
||||
mutex_unlock(&ct->lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -224,80 +224,11 @@ static bool exec_queue_killed_or_banned_or_wedged(struct xe_exec_queue *q)
|
||||
EXEC_QUEUE_STATE_BANNED));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PROVE_LOCKING
|
||||
static int alloc_submit_wq(struct xe_guc *guc)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_SUBMIT_WQ; ++i) {
|
||||
guc->submission_state.submit_wq_pool[i] =
|
||||
alloc_ordered_workqueue("submit_wq", 0);
|
||||
if (!guc->submission_state.submit_wq_pool[i])
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_free:
|
||||
while (i)
|
||||
destroy_workqueue(guc->submission_state.submit_wq_pool[--i]);
|
||||
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static void free_submit_wq(struct xe_guc *guc)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_SUBMIT_WQ; ++i)
|
||||
destroy_workqueue(guc->submission_state.submit_wq_pool[i]);
|
||||
}
|
||||
|
||||
static struct workqueue_struct *get_submit_wq(struct xe_guc *guc)
|
||||
{
|
||||
int idx = guc->submission_state.submit_wq_idx++ % NUM_SUBMIT_WQ;
|
||||
|
||||
return guc->submission_state.submit_wq_pool[idx];
|
||||
}
|
||||
#else
|
||||
static int alloc_submit_wq(struct xe_guc *guc)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void free_submit_wq(struct xe_guc *guc)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
static struct workqueue_struct *get_submit_wq(struct xe_guc *guc)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void xe_guc_submit_fini(struct xe_guc *guc)
|
||||
{
|
||||
struct xe_device *xe = guc_to_xe(guc);
|
||||
struct xe_gt *gt = guc_to_gt(guc);
|
||||
int ret;
|
||||
|
||||
ret = wait_event_timeout(guc->submission_state.fini_wq,
|
||||
xa_empty(&guc->submission_state.exec_queue_lookup),
|
||||
HZ * 5);
|
||||
|
||||
drain_workqueue(xe->destroy_wq);
|
||||
|
||||
xe_gt_assert(gt, ret);
|
||||
}
|
||||
|
||||
static void guc_submit_fini(struct drm_device *drm, void *arg)
|
||||
{
|
||||
struct xe_guc *guc = arg;
|
||||
|
||||
xe_guc_submit_fini(guc);
|
||||
xa_destroy(&guc->submission_state.exec_queue_lookup);
|
||||
free_submit_wq(guc);
|
||||
}
|
||||
|
||||
static void guc_submit_wedged_fini(void *arg)
|
||||
@@ -359,10 +290,6 @@ int xe_guc_submit_init(struct xe_guc *guc, unsigned int num_ids)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = alloc_submit_wq(guc);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
gt->exec_queue_ops = &guc_exec_queue_ops;
|
||||
|
||||
xa_init(&guc->submission_state.exec_queue_lookup);
|
||||
@@ -393,7 +320,6 @@ static void __release_guc_id(struct xe_guc *guc, struct xe_exec_queue *q, u32 xa
|
||||
static int alloc_guc_id(struct xe_guc *guc, struct xe_exec_queue *q)
|
||||
{
|
||||
int ret;
|
||||
void *ptr;
|
||||
int i;
|
||||
|
||||
/*
|
||||
@@ -413,12 +339,10 @@ static int alloc_guc_id(struct xe_guc *guc, struct xe_exec_queue *q)
|
||||
q->guc->id = ret;
|
||||
|
||||
for (i = 0; i < q->width; ++i) {
|
||||
ptr = xa_store(&guc->submission_state.exec_queue_lookup,
|
||||
q->guc->id + i, q, GFP_NOWAIT);
|
||||
if (IS_ERR(ptr)) {
|
||||
ret = PTR_ERR(ptr);
|
||||
ret = xa_err(xa_store(&guc->submission_state.exec_queue_lookup,
|
||||
q->guc->id + i, q, GFP_NOWAIT));
|
||||
if (ret)
|
||||
goto err_release;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -1482,8 +1406,7 @@ static int guc_exec_queue_init(struct xe_exec_queue *q)
|
||||
timeout = (q->vm && xe_vm_in_lr_mode(q->vm)) ? MAX_SCHEDULE_TIMEOUT :
|
||||
msecs_to_jiffies(q->sched_props.job_timeout_ms);
|
||||
err = xe_sched_init(&ge->sched, &drm_sched_ops, &xe_sched_ops,
|
||||
get_submit_wq(guc),
|
||||
q->lrc[0]->ring.size / MAX_JOB_SIZE_BYTES, 64,
|
||||
NULL, q->lrc[0]->ring.size / MAX_JOB_SIZE_BYTES, 64,
|
||||
timeout, guc_to_gt(guc)->ordered_wq, NULL,
|
||||
q->name, gt_to_xe(q->gt)->drm.dev);
|
||||
if (err)
|
||||
|
||||
@@ -72,13 +72,6 @@ struct xe_guc {
|
||||
atomic_t stopped;
|
||||
/** @submission_state.lock: protects submission state */
|
||||
struct mutex lock;
|
||||
#ifdef CONFIG_PROVE_LOCKING
|
||||
#define NUM_SUBMIT_WQ 256
|
||||
/** @submission_state.submit_wq_pool: submission ordered workqueues pool */
|
||||
struct workqueue_struct *submit_wq_pool[NUM_SUBMIT_WQ];
|
||||
/** @submission_state.submit_wq_idx: submission ordered workqueue index */
|
||||
int submit_wq_idx;
|
||||
#endif
|
||||
/** @submission_state.enabled: submission is enabled */
|
||||
bool enabled;
|
||||
/** @submission_state.fini_wq: submit fini wait queue */
|
||||
|
||||
@@ -162,6 +162,7 @@ config SENSORS_ADM9240
|
||||
tristate "Analog Devices ADM9240 and compatibles"
|
||||
depends on I2C
|
||||
select HWMON_VID
|
||||
select REGMAP_I2C
|
||||
help
|
||||
If you say yes here you get support for Analog Devices ADM9240,
|
||||
Dallas DS1780, National Semiconductor LM81 sensor chips.
|
||||
@@ -223,6 +224,7 @@ config SENSORS_ADT7462
|
||||
config SENSORS_ADT7470
|
||||
tristate "Analog Devices ADT7470"
|
||||
depends on I2C
|
||||
select REGMAP_I2C
|
||||
help
|
||||
If you say yes here you get support for the Analog Devices
|
||||
ADT7470 temperature monitoring chips.
|
||||
@@ -999,6 +1001,7 @@ config SENSORS_LTC2990
|
||||
config SENSORS_LTC2991
|
||||
tristate "Analog Devices LTC2991"
|
||||
depends on I2C
|
||||
select REGMAP_I2C
|
||||
help
|
||||
If you say yes here you get support for Analog Devices LTC2991
|
||||
Octal I2C Voltage, Current, and Temperature Monitor. The LTC2991
|
||||
@@ -1146,6 +1149,7 @@ config SENSORS_MAX1619
|
||||
config SENSORS_MAX1668
|
||||
tristate "Maxim MAX1668 and compatibles"
|
||||
depends on I2C
|
||||
select REGMAP_I2C
|
||||
help
|
||||
If you say yes here you get support for MAX1668, MAX1989 and
|
||||
MAX1805 chips.
|
||||
@@ -1275,6 +1279,7 @@ config SENSORS_MAX31790
|
||||
config SENSORS_MC34VR500
|
||||
tristate "NXP MC34VR500 hardware monitoring driver"
|
||||
depends on I2C
|
||||
select REGMAP_I2C
|
||||
help
|
||||
If you say yes here you get support for the temperature and input
|
||||
voltage sensors of the NXP MC34VR500.
|
||||
@@ -2312,6 +2317,7 @@ config SENSORS_TMP464
|
||||
config SENSORS_TMP513
|
||||
tristate "Texas Instruments TMP513 and compatibles"
|
||||
depends on I2C
|
||||
select REGMAP_I2C
|
||||
help
|
||||
If you say yes here you get support for Texas Instruments TMP512,
|
||||
and TMP513 temperature and power supply sensor chips.
|
||||
|
||||
@@ -1735,11 +1735,10 @@ static int adt7475_pwm_properties_parse_args(struct fwnode_handle *fwnode,
|
||||
static int adt7475_fan_pwm_config(struct i2c_client *client)
|
||||
{
|
||||
struct adt7475_data *data = i2c_get_clientdata(client);
|
||||
struct fwnode_handle *child;
|
||||
struct adt7475_pwm_config cfg = {};
|
||||
int ret;
|
||||
|
||||
device_for_each_child_node(&client->dev, child) {
|
||||
device_for_each_child_node_scoped(&client->dev, child) {
|
||||
if (!fwnode_property_present(child, "pwms"))
|
||||
continue;
|
||||
|
||||
|
||||
@@ -358,7 +358,7 @@ static const struct m10bmc_sdata n6000bmc_temp_tbl[] = {
|
||||
{ 0x4f0, 0x4f4, 0x4f8, 0x52c, 0x0, 500, "Board Top Near FPGA Temperature" },
|
||||
{ 0x4fc, 0x500, 0x504, 0x52c, 0x0, 500, "Board Bottom Near CVL Temperature" },
|
||||
{ 0x508, 0x50c, 0x510, 0x52c, 0x0, 500, "Board Top East Near VRs Temperature" },
|
||||
{ 0x514, 0x518, 0x51c, 0x52c, 0x0, 500, "Columbiaville Die Temperature" },
|
||||
{ 0x514, 0x518, 0x51c, 0x52c, 0x0, 500, "CVL Die Temperature" },
|
||||
{ 0x520, 0x524, 0x528, 0x52c, 0x0, 500, "Board Rear Side Temperature" },
|
||||
{ 0x530, 0x534, 0x538, 0x52c, 0x0, 500, "Board Front Side Temperature" },
|
||||
{ 0x53c, 0x540, 0x544, 0x0, 0x0, 500, "QSFP1 Case Temperature" },
|
||||
|
||||
@@ -388,7 +388,8 @@ static struct gendisk *mmc_alloc_disk(struct mmc_queue *mq,
|
||||
|
||||
blk_queue_rq_timeout(mq->queue, 60 * HZ);
|
||||
|
||||
dma_set_max_seg_size(mmc_dev(host), queue_max_segment_size(mq->queue));
|
||||
if (mmc_dev(host)->dma_parms)
|
||||
dma_set_max_seg_size(mmc_dev(host), queue_max_segment_size(mq->queue));
|
||||
|
||||
INIT_WORK(&mq->recovery_work, mmc_mq_recovery_handler);
|
||||
INIT_WORK(&mq->complete_work, mmc_blk_mq_complete_work);
|
||||
|
||||
+18
-53
@@ -38,9 +38,8 @@ struct mvsd_host {
|
||||
unsigned int xfer_mode;
|
||||
unsigned int intr_en;
|
||||
unsigned int ctrl;
|
||||
bool use_pio;
|
||||
struct sg_mapping_iter sg_miter;
|
||||
unsigned int pio_size;
|
||||
void *pio_ptr;
|
||||
unsigned int sg_frags;
|
||||
unsigned int ns_per_clk;
|
||||
unsigned int clock;
|
||||
@@ -115,18 +114,11 @@ static int mvsd_setup_data(struct mvsd_host *host, struct mmc_data *data)
|
||||
* data when the buffer is not aligned on a 64 byte
|
||||
* boundary.
|
||||
*/
|
||||
unsigned int miter_flags = SG_MITER_ATOMIC; /* Used from IRQ */
|
||||
|
||||
if (data->flags & MMC_DATA_READ)
|
||||
miter_flags |= SG_MITER_TO_SG;
|
||||
else
|
||||
miter_flags |= SG_MITER_FROM_SG;
|
||||
|
||||
host->pio_size = data->blocks * data->blksz;
|
||||
sg_miter_start(&host->sg_miter, data->sg, data->sg_len, miter_flags);
|
||||
host->pio_ptr = sg_virt(data->sg);
|
||||
if (!nodma)
|
||||
dev_dbg(host->dev, "fallback to PIO for data\n");
|
||||
host->use_pio = true;
|
||||
dev_dbg(host->dev, "fallback to PIO for data at 0x%p size %d\n",
|
||||
host->pio_ptr, host->pio_size);
|
||||
return 1;
|
||||
} else {
|
||||
dma_addr_t phys_addr;
|
||||
@@ -137,7 +129,6 @@ static int mvsd_setup_data(struct mvsd_host *host, struct mmc_data *data)
|
||||
phys_addr = sg_dma_address(data->sg);
|
||||
mvsd_write(MVSD_SYS_ADDR_LOW, (u32)phys_addr & 0xffff);
|
||||
mvsd_write(MVSD_SYS_ADDR_HI, (u32)phys_addr >> 16);
|
||||
host->use_pio = false;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -297,8 +288,8 @@ static u32 mvsd_finish_data(struct mvsd_host *host, struct mmc_data *data,
|
||||
{
|
||||
void __iomem *iobase = host->base;
|
||||
|
||||
if (host->use_pio) {
|
||||
sg_miter_stop(&host->sg_miter);
|
||||
if (host->pio_ptr) {
|
||||
host->pio_ptr = NULL;
|
||||
host->pio_size = 0;
|
||||
} else {
|
||||
dma_unmap_sg(mmc_dev(host->mmc), data->sg, host->sg_frags,
|
||||
@@ -353,12 +344,9 @@ static u32 mvsd_finish_data(struct mvsd_host *host, struct mmc_data *data,
|
||||
static irqreturn_t mvsd_irq(int irq, void *dev)
|
||||
{
|
||||
struct mvsd_host *host = dev;
|
||||
struct sg_mapping_iter *sgm = &host->sg_miter;
|
||||
void __iomem *iobase = host->base;
|
||||
u32 intr_status, intr_done_mask;
|
||||
int irq_handled = 0;
|
||||
u16 *p;
|
||||
int s;
|
||||
|
||||
intr_status = mvsd_read(MVSD_NOR_INTR_STATUS);
|
||||
dev_dbg(host->dev, "intr 0x%04x intr_en 0x%04x hw_state 0x%04x\n",
|
||||
@@ -382,36 +370,15 @@ static irqreturn_t mvsd_irq(int irq, void *dev)
|
||||
spin_lock(&host->lock);
|
||||
|
||||
/* PIO handling, if needed. Messy business... */
|
||||
if (host->use_pio) {
|
||||
/*
|
||||
* As we set sgm->consumed this always gives a valid buffer
|
||||
* position.
|
||||
*/
|
||||
if (!sg_miter_next(sgm)) {
|
||||
/* This should not happen */
|
||||
dev_err(host->dev, "ran out of scatter segments\n");
|
||||
spin_unlock(&host->lock);
|
||||
host->intr_en &=
|
||||
~(MVSD_NOR_RX_READY | MVSD_NOR_RX_FIFO_8W |
|
||||
MVSD_NOR_TX_AVAIL | MVSD_NOR_TX_FIFO_8W);
|
||||
mvsd_write(MVSD_NOR_INTR_EN, host->intr_en);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
p = sgm->addr;
|
||||
s = sgm->length;
|
||||
if (s > host->pio_size)
|
||||
s = host->pio_size;
|
||||
}
|
||||
|
||||
if (host->use_pio &&
|
||||
if (host->pio_size &&
|
||||
(intr_status & host->intr_en &
|
||||
(MVSD_NOR_RX_READY | MVSD_NOR_RX_FIFO_8W))) {
|
||||
|
||||
u16 *p = host->pio_ptr;
|
||||
int s = host->pio_size;
|
||||
while (s >= 32 && (intr_status & MVSD_NOR_RX_FIFO_8W)) {
|
||||
readsw(iobase + MVSD_FIFO, p, 16);
|
||||
p += 16;
|
||||
s -= 32;
|
||||
sgm->consumed += 32;
|
||||
intr_status = mvsd_read(MVSD_NOR_INTR_STATUS);
|
||||
}
|
||||
/*
|
||||
@@ -424,7 +391,6 @@ static irqreturn_t mvsd_irq(int irq, void *dev)
|
||||
put_unaligned(mvsd_read(MVSD_FIFO), p++);
|
||||
put_unaligned(mvsd_read(MVSD_FIFO), p++);
|
||||
s -= 4;
|
||||
sgm->consumed += 4;
|
||||
intr_status = mvsd_read(MVSD_NOR_INTR_STATUS);
|
||||
}
|
||||
if (s && s < 4 && (intr_status & MVSD_NOR_RX_READY)) {
|
||||
@@ -432,13 +398,10 @@ static irqreturn_t mvsd_irq(int irq, void *dev)
|
||||
val[0] = mvsd_read(MVSD_FIFO);
|
||||
val[1] = mvsd_read(MVSD_FIFO);
|
||||
memcpy(p, ((void *)&val) + 4 - s, s);
|
||||
sgm->consumed += s;
|
||||
s = 0;
|
||||
intr_status = mvsd_read(MVSD_NOR_INTR_STATUS);
|
||||
}
|
||||
/* PIO transfer done */
|
||||
host->pio_size -= sgm->consumed;
|
||||
if (host->pio_size == 0) {
|
||||
if (s == 0) {
|
||||
host->intr_en &=
|
||||
~(MVSD_NOR_RX_READY | MVSD_NOR_RX_FIFO_8W);
|
||||
mvsd_write(MVSD_NOR_INTR_EN, host->intr_en);
|
||||
@@ -450,10 +413,14 @@ static irqreturn_t mvsd_irq(int irq, void *dev)
|
||||
}
|
||||
dev_dbg(host->dev, "pio %d intr 0x%04x hw_state 0x%04x\n",
|
||||
s, intr_status, mvsd_read(MVSD_HW_STATE));
|
||||
host->pio_ptr = p;
|
||||
host->pio_size = s;
|
||||
irq_handled = 1;
|
||||
} else if (host->use_pio &&
|
||||
} else if (host->pio_size &&
|
||||
(intr_status & host->intr_en &
|
||||
(MVSD_NOR_TX_AVAIL | MVSD_NOR_TX_FIFO_8W))) {
|
||||
u16 *p = host->pio_ptr;
|
||||
int s = host->pio_size;
|
||||
/*
|
||||
* The TX_FIFO_8W bit is unreliable. When set, bursting
|
||||
* 16 halfwords all at once in the FIFO drops data. Actually
|
||||
@@ -464,7 +431,6 @@ static irqreturn_t mvsd_irq(int irq, void *dev)
|
||||
mvsd_write(MVSD_FIFO, get_unaligned(p++));
|
||||
mvsd_write(MVSD_FIFO, get_unaligned(p++));
|
||||
s -= 4;
|
||||
sgm->consumed += 4;
|
||||
intr_status = mvsd_read(MVSD_NOR_INTR_STATUS);
|
||||
}
|
||||
if (s < 4) {
|
||||
@@ -473,13 +439,10 @@ static irqreturn_t mvsd_irq(int irq, void *dev)
|
||||
memcpy(((void *)&val) + 4 - s, p, s);
|
||||
mvsd_write(MVSD_FIFO, val[0]);
|
||||
mvsd_write(MVSD_FIFO, val[1]);
|
||||
sgm->consumed += s;
|
||||
s = 0;
|
||||
intr_status = mvsd_read(MVSD_NOR_INTR_STATUS);
|
||||
}
|
||||
/* PIO transfer done */
|
||||
host->pio_size -= sgm->consumed;
|
||||
if (host->pio_size == 0) {
|
||||
if (s == 0) {
|
||||
host->intr_en &=
|
||||
~(MVSD_NOR_TX_AVAIL | MVSD_NOR_TX_FIFO_8W);
|
||||
mvsd_write(MVSD_NOR_INTR_EN, host->intr_en);
|
||||
@@ -487,6 +450,8 @@ static irqreturn_t mvsd_irq(int irq, void *dev)
|
||||
}
|
||||
dev_dbg(host->dev, "pio %d intr 0x%04x hw_state 0x%04x\n",
|
||||
s, intr_status, mvsd_read(MVSD_HW_STATE));
|
||||
host->pio_ptr = p;
|
||||
host->pio_size = s;
|
||||
irq_handled = 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -852,6 +852,14 @@ static void th1520_sdhci_reset(struct sdhci_host *host, u8 mask)
|
||||
|
||||
sdhci_reset(host, mask);
|
||||
|
||||
/* The T-Head 1520 SoC does not comply with the SDHCI specification
|
||||
* regarding the "Software Reset for CMD line should clear 'Command
|
||||
* Complete' in the Normal Interrupt Status Register." Clear the bit
|
||||
* here to compensate for this quirk.
|
||||
*/
|
||||
if (mask & SDHCI_RESET_CMD)
|
||||
sdhci_writel(host, SDHCI_INT_RESPONSE, SDHCI_INT_STATUS);
|
||||
|
||||
if (priv->flags & FLAG_IO_FIXED_1V8) {
|
||||
ctrl_2 = sdhci_readw(host, SDHCI_HOST_CONTROL2);
|
||||
if (!(ctrl_2 & SDHCI_CTRL_VDD_180)) {
|
||||
|
||||
@@ -10,6 +10,19 @@
|
||||
#include <kunit/test.h>
|
||||
#include <kunit/resource.h>
|
||||
|
||||
#include "of_private.h"
|
||||
|
||||
/**
|
||||
* of_root_kunit_skip() - Skip test if the root node isn't populated
|
||||
* @test: test to skip if the root node isn't populated
|
||||
*/
|
||||
void of_root_kunit_skip(struct kunit *test)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_ARM64) && IS_ENABLED(CONFIG_ACPI) && !of_root)
|
||||
kunit_skip(test, "arm64+acpi doesn't populate a root node");
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_root_kunit_skip);
|
||||
|
||||
#if defined(CONFIG_OF_OVERLAY) && defined(CONFIG_OF_EARLY_FLATTREE)
|
||||
|
||||
static void of_overlay_fdt_apply_kunit_exit(void *ovcs_id)
|
||||
@@ -36,6 +49,8 @@ int of_overlay_fdt_apply_kunit(struct kunit *test, void *overlay_fdt,
|
||||
int ret;
|
||||
int *copy_id;
|
||||
|
||||
of_root_kunit_skip(test);
|
||||
|
||||
copy_id = kunit_kmalloc(test, sizeof(*copy_id), GFP_KERNEL);
|
||||
if (!copy_id)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -42,6 +42,9 @@ extern raw_spinlock_t devtree_lock;
|
||||
extern struct list_head aliases_lookup;
|
||||
extern struct kset *of_kset;
|
||||
|
||||
struct kunit;
|
||||
extern void of_root_kunit_skip(struct kunit *test);
|
||||
|
||||
#if defined(CONFIG_OF_DYNAMIC)
|
||||
extern int of_property_notify(int action, struct device_node *np,
|
||||
struct property *prop, struct property *old_prop);
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
|
||||
#include <kunit/test.h>
|
||||
|
||||
#include "of_private.h"
|
||||
|
||||
/*
|
||||
* Test that the root node "/" can be found by path.
|
||||
*/
|
||||
@@ -36,6 +38,7 @@ static struct kunit_case of_dtb_test_cases[] = {
|
||||
|
||||
static int of_dtb_test_init(struct kunit *test)
|
||||
{
|
||||
of_root_kunit_skip(test);
|
||||
if (!IS_ENABLED(CONFIG_OF_EARLY_FLATTREE))
|
||||
kunit_skip(test, "requires CONFIG_OF_EARLY_FLATTREE");
|
||||
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
#include <kunit/of.h>
|
||||
#include <kunit/test.h>
|
||||
|
||||
#include "of_private.h"
|
||||
|
||||
static const char * const kunit_node_name = "kunit-test";
|
||||
static const char * const kunit_compatible = "test,empty";
|
||||
|
||||
@@ -62,6 +64,7 @@ static void of_overlay_apply_kunit_cleanup(struct kunit *test)
|
||||
struct device *dev;
|
||||
struct device_node *np;
|
||||
|
||||
of_root_kunit_skip(test);
|
||||
if (!IS_ENABLED(CONFIG_OF_EARLY_FLATTREE))
|
||||
kunit_skip(test, "requires CONFIG_OF_EARLY_FLATTREE for root node");
|
||||
|
||||
@@ -73,7 +76,7 @@ static void of_overlay_apply_kunit_cleanup(struct kunit *test)
|
||||
|
||||
np = of_find_node_by_name(NULL, kunit_node_name);
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np);
|
||||
of_node_put_kunit(test, np);
|
||||
of_node_put_kunit(&fake, np);
|
||||
|
||||
pdev = of_find_device_by_node(np);
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, pdev);
|
||||
|
||||
+3
-1
@@ -2630,8 +2630,10 @@ int dev_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config)
|
||||
|
||||
/* Attach genpds */
|
||||
if (config->genpd_names) {
|
||||
if (config->required_devs)
|
||||
if (config->required_devs) {
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = _opp_attach_genpd(opp_table, dev, config->genpd_names,
|
||||
config->virt_devs);
|
||||
|
||||
@@ -1052,7 +1052,7 @@ static unsigned long cpr_get_opp_hz_for_req(struct dev_pm_opp *ref,
|
||||
of_parse_phandle(child_np, "required-opps", 0);
|
||||
|
||||
if (child_req_np == ref_np) {
|
||||
u64 rate;
|
||||
u64 rate = 0;
|
||||
|
||||
of_property_read_u64(child_np, "opp-hz", &rate);
|
||||
return (unsigned long) rate;
|
||||
|
||||
@@ -147,6 +147,7 @@ static const struct x86_cpu_id pl4_support_ids[] = {
|
||||
X86_MATCH_VFM(INTEL_RAPTORLAKE_P, NULL),
|
||||
X86_MATCH_VFM(INTEL_METEORLAKE, NULL),
|
||||
X86_MATCH_VFM(INTEL_METEORLAKE_L, NULL),
|
||||
X86_MATCH_VFM(INTEL_ARROWLAKE_U, NULL),
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
@@ -15,7 +15,8 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#define TPMI_RAPL_VERSION 1
|
||||
#define TPMI_RAPL_MAJOR_VERSION 0
|
||||
#define TPMI_RAPL_MINOR_VERSION 1
|
||||
|
||||
/* 1 header + 10 registers + 5 reserved. 8 bytes for each. */
|
||||
#define TPMI_RAPL_DOMAIN_SIZE 128
|
||||
@@ -154,11 +155,21 @@ static int parse_one_domain(struct tpmi_rapl_package *trp, u32 offset)
|
||||
tpmi_domain_size = tpmi_domain_header >> 16 & 0xff;
|
||||
tpmi_domain_flags = tpmi_domain_header >> 32 & 0xffff;
|
||||
|
||||
if (tpmi_domain_version != TPMI_RAPL_VERSION) {
|
||||
pr_warn(FW_BUG "Unsupported version:%d\n", tpmi_domain_version);
|
||||
if (tpmi_domain_version == TPMI_VERSION_INVALID) {
|
||||
pr_warn(FW_BUG "Invalid version\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (TPMI_MAJOR_VERSION(tpmi_domain_version) != TPMI_RAPL_MAJOR_VERSION) {
|
||||
pr_warn(FW_BUG "Unsupported major version:%ld\n",
|
||||
TPMI_MAJOR_VERSION(tpmi_domain_version));
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (TPMI_MINOR_VERSION(tpmi_domain_version) > TPMI_RAPL_MINOR_VERSION)
|
||||
pr_info("Ignore: Unsupported minor version:%ld\n",
|
||||
TPMI_MINOR_VERSION(tpmi_domain_version));
|
||||
|
||||
/* Domain size: in unit of 128 Bytes */
|
||||
if (tpmi_domain_size != 1) {
|
||||
pr_warn(FW_BUG "Invalid Domain size %d\n", tpmi_domain_size);
|
||||
@@ -181,7 +192,7 @@ static int parse_one_domain(struct tpmi_rapl_package *trp, u32 offset)
|
||||
pr_warn(FW_BUG "System domain must support Domain Info register\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
tpmi_domain_info = readq(trp->base + offset + TPMI_RAPL_REG_DOMAIN_INFO);
|
||||
tpmi_domain_info = readq(trp->base + offset + TPMI_RAPL_REG_DOMAIN_INFO * 8);
|
||||
if (!(tpmi_domain_info & TPMI_RAPL_DOMAIN_ROOT))
|
||||
return 0;
|
||||
domain_type = RAPL_DOMAIN_PLATFORM;
|
||||
|
||||
@@ -830,7 +830,6 @@ static int fnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
spin_lock_init(&fnic->vlans_lock);
|
||||
INIT_WORK(&fnic->fip_frame_work, fnic_handle_fip_frame);
|
||||
INIT_WORK(&fnic->event_work, fnic_handle_event);
|
||||
INIT_WORK(&fnic->flush_work, fnic_flush_tx);
|
||||
skb_queue_head_init(&fnic->fip_frame_queue);
|
||||
INIT_LIST_HEAD(&fnic->evlist);
|
||||
INIT_LIST_HEAD(&fnic->vlans);
|
||||
@@ -948,6 +947,7 @@ static int fnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
|
||||
INIT_WORK(&fnic->link_work, fnic_handle_link);
|
||||
INIT_WORK(&fnic->frame_work, fnic_handle_frame);
|
||||
INIT_WORK(&fnic->flush_work, fnic_flush_tx);
|
||||
skb_queue_head_init(&fnic->frame_queue);
|
||||
skb_queue_head_init(&fnic->tx_queue);
|
||||
|
||||
|
||||
@@ -1250,7 +1250,7 @@ static ssize_t fc_rport_set_marginal_state(struct device *dev,
|
||||
*/
|
||||
if (rport->port_state == FC_PORTSTATE_ONLINE)
|
||||
rport->port_state = port_state;
|
||||
else
|
||||
else if (port_state != rport->port_state)
|
||||
return -EINVAL;
|
||||
} else if (port_state == FC_PORTSTATE_ONLINE) {
|
||||
/*
|
||||
@@ -1260,7 +1260,7 @@ static ssize_t fc_rport_set_marginal_state(struct device *dev,
|
||||
*/
|
||||
if (rport->port_state == FC_PORTSTATE_MARGINAL)
|
||||
rport->port_state = port_state;
|
||||
else
|
||||
else if (port_state != rport->port_state)
|
||||
return -EINVAL;
|
||||
} else
|
||||
return -EINVAL;
|
||||
|
||||
@@ -831,7 +831,7 @@ wd33c93_intr(struct Scsi_Host *instance)
|
||||
/* construct an IDENTIFY message with correct disconnect bit */
|
||||
|
||||
hostdata->outgoing_msg[0] = IDENTIFY(0, cmd->device->lun);
|
||||
if (scsi_pointer->phase)
|
||||
if (WD33C93_scsi_pointer(cmd)->phase)
|
||||
hostdata->outgoing_msg[0] |= 0x40;
|
||||
|
||||
if (hostdata->sync_stat[cmd->device->id] == SS_FIRST) {
|
||||
|
||||
@@ -416,7 +416,6 @@ err_del_legacy:
|
||||
if (!pci_info->no_legacy)
|
||||
proc_thermal_remove(proc_priv);
|
||||
proc_thermal_mmio_remove(pdev, proc_priv);
|
||||
pci_disable_device(pdev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -438,7 +437,6 @@ static void proc_thermal_pci_remove(struct pci_dev *pdev)
|
||||
proc_thermal_mmio_remove(pdev, pci_info->proc_priv);
|
||||
if (!pci_info->no_legacy)
|
||||
proc_thermal_remove(proc_priv);
|
||||
pci_disable_device(pdev);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
|
||||
@@ -13,48 +13,12 @@ static struct rapl_if_priv rapl_mmio_priv;
|
||||
|
||||
static const struct rapl_mmio_regs rapl_mmio_default = {
|
||||
.reg_unit = 0x5938,
|
||||
.regs[RAPL_DOMAIN_PACKAGE] = { 0x59a0, 0x593c, 0x58f0, 0, 0x5930},
|
||||
.regs[RAPL_DOMAIN_PACKAGE] = { 0x59a0, 0x593c, 0x58f0, 0, 0x5930, 0x59b0},
|
||||
.regs[RAPL_DOMAIN_DRAM] = { 0x58e0, 0x58e8, 0x58ec, 0, 0},
|
||||
.limits[RAPL_DOMAIN_PACKAGE] = BIT(POWER_LIMIT2),
|
||||
.limits[RAPL_DOMAIN_PACKAGE] = BIT(POWER_LIMIT2) | BIT(POWER_LIMIT4),
|
||||
.limits[RAPL_DOMAIN_DRAM] = BIT(POWER_LIMIT2),
|
||||
};
|
||||
|
||||
static int rapl_mmio_cpu_online(unsigned int cpu)
|
||||
{
|
||||
struct rapl_package *rp;
|
||||
|
||||
/* mmio rapl supports package 0 only for now */
|
||||
if (topology_physical_package_id(cpu))
|
||||
return 0;
|
||||
|
||||
rp = rapl_find_package_domain_cpuslocked(cpu, &rapl_mmio_priv, true);
|
||||
if (!rp) {
|
||||
rp = rapl_add_package_cpuslocked(cpu, &rapl_mmio_priv, true);
|
||||
if (IS_ERR(rp))
|
||||
return PTR_ERR(rp);
|
||||
}
|
||||
cpumask_set_cpu(cpu, &rp->cpumask);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rapl_mmio_cpu_down_prep(unsigned int cpu)
|
||||
{
|
||||
struct rapl_package *rp;
|
||||
int lead_cpu;
|
||||
|
||||
rp = rapl_find_package_domain_cpuslocked(cpu, &rapl_mmio_priv, true);
|
||||
if (!rp)
|
||||
return 0;
|
||||
|
||||
cpumask_clear_cpu(cpu, &rp->cpumask);
|
||||
lead_cpu = cpumask_first(&rp->cpumask);
|
||||
if (lead_cpu >= nr_cpu_ids)
|
||||
rapl_remove_package_cpuslocked(rp);
|
||||
else if (rp->lead_cpu == cpu)
|
||||
rp->lead_cpu = lead_cpu;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rapl_mmio_read_raw(int cpu, struct reg_action *ra)
|
||||
{
|
||||
if (!ra->reg.mmio)
|
||||
@@ -82,6 +46,7 @@ static int rapl_mmio_write_raw(int cpu, struct reg_action *ra)
|
||||
int proc_thermal_rapl_add(struct pci_dev *pdev, struct proc_thermal_device *proc_priv)
|
||||
{
|
||||
const struct rapl_mmio_regs *rapl_regs = &rapl_mmio_default;
|
||||
struct rapl_package *rp;
|
||||
enum rapl_domain_reg_id reg;
|
||||
enum rapl_domain_type domain;
|
||||
int ret;
|
||||
@@ -109,25 +74,38 @@ int proc_thermal_rapl_add(struct pci_dev *pdev, struct proc_thermal_device *proc
|
||||
return PTR_ERR(rapl_mmio_priv.control_type);
|
||||
}
|
||||
|
||||
ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "powercap/rapl:online",
|
||||
rapl_mmio_cpu_online, rapl_mmio_cpu_down_prep);
|
||||
if (ret < 0) {
|
||||
powercap_unregister_control_type(rapl_mmio_priv.control_type);
|
||||
rapl_mmio_priv.control_type = NULL;
|
||||
return ret;
|
||||
/* Register a RAPL package device for package 0 which is always online */
|
||||
rp = rapl_find_package_domain(0, &rapl_mmio_priv, false);
|
||||
if (rp) {
|
||||
ret = -EEXIST;
|
||||
goto err;
|
||||
}
|
||||
|
||||
rp = rapl_add_package(0, &rapl_mmio_priv, false);
|
||||
if (IS_ERR(rp)) {
|
||||
ret = PTR_ERR(rp);
|
||||
goto err;
|
||||
}
|
||||
rapl_mmio_priv.pcap_rapl_online = ret;
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
powercap_unregister_control_type(rapl_mmio_priv.control_type);
|
||||
rapl_mmio_priv.control_type = NULL;
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(proc_thermal_rapl_add);
|
||||
|
||||
void proc_thermal_rapl_remove(void)
|
||||
{
|
||||
struct rapl_package *rp;
|
||||
|
||||
if (IS_ERR_OR_NULL(rapl_mmio_priv.control_type))
|
||||
return;
|
||||
|
||||
cpuhp_remove_state(rapl_mmio_priv.pcap_rapl_online);
|
||||
rp = rapl_find_package_domain(0, &rapl_mmio_priv, false);
|
||||
if (rp)
|
||||
rapl_remove_package(rp);
|
||||
powercap_unregister_control_type(rapl_mmio_priv.control_type);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(proc_thermal_rapl_remove);
|
||||
|
||||
@@ -728,6 +728,7 @@ struct thermal_zone_device *thermal_zone_get_by_id(int id)
|
||||
mutex_lock(&thermal_list_lock);
|
||||
list_for_each_entry(tz, &thermal_tz_list, node) {
|
||||
if (tz->id == id) {
|
||||
get_device(&tz->device);
|
||||
match = tz;
|
||||
break;
|
||||
}
|
||||
@@ -1605,14 +1606,12 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz)
|
||||
ida_destroy(&tz->ida);
|
||||
|
||||
device_del(&tz->device);
|
||||
|
||||
kfree(tz->tzp);
|
||||
|
||||
put_device(&tz->device);
|
||||
|
||||
thermal_notify_tz_delete(tz);
|
||||
|
||||
wait_for_completion(&tz->removal);
|
||||
kfree(tz->tzp);
|
||||
kfree(tz);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(thermal_zone_device_unregister);
|
||||
|
||||
@@ -194,6 +194,9 @@ int for_each_thermal_governor(int (*cb)(struct thermal_governor *, void *),
|
||||
|
||||
struct thermal_zone_device *thermal_zone_get_by_id(int id);
|
||||
|
||||
DEFINE_CLASS(thermal_zone_get_by_id, struct thermal_zone_device *,
|
||||
if (_T) put_device(&_T->device), thermal_zone_get_by_id(id), int id)
|
||||
|
||||
static inline bool cdev_is_power_actor(struct thermal_cooling_device *cdev)
|
||||
{
|
||||
return cdev->ops->get_requested_power && cdev->ops->state2power &&
|
||||
|
||||
@@ -443,7 +443,6 @@ static int thermal_genl_cmd_tz_get_trip(struct param *p)
|
||||
{
|
||||
struct sk_buff *msg = p->msg;
|
||||
const struct thermal_trip_desc *td;
|
||||
struct thermal_zone_device *tz;
|
||||
struct nlattr *start_trip;
|
||||
int id;
|
||||
|
||||
@@ -452,7 +451,7 @@ static int thermal_genl_cmd_tz_get_trip(struct param *p)
|
||||
|
||||
id = nla_get_u32(p->attrs[THERMAL_GENL_ATTR_TZ_ID]);
|
||||
|
||||
tz = thermal_zone_get_by_id(id);
|
||||
CLASS(thermal_zone_get_by_id, tz)(id);
|
||||
if (!tz)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -488,7 +487,6 @@ out_cancel_nest:
|
||||
static int thermal_genl_cmd_tz_get_temp(struct param *p)
|
||||
{
|
||||
struct sk_buff *msg = p->msg;
|
||||
struct thermal_zone_device *tz;
|
||||
int temp, ret, id;
|
||||
|
||||
if (!p->attrs[THERMAL_GENL_ATTR_TZ_ID])
|
||||
@@ -496,7 +494,7 @@ static int thermal_genl_cmd_tz_get_temp(struct param *p)
|
||||
|
||||
id = nla_get_u32(p->attrs[THERMAL_GENL_ATTR_TZ_ID]);
|
||||
|
||||
tz = thermal_zone_get_by_id(id);
|
||||
CLASS(thermal_zone_get_by_id, tz)(id);
|
||||
if (!tz)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -514,7 +512,6 @@ static int thermal_genl_cmd_tz_get_temp(struct param *p)
|
||||
static int thermal_genl_cmd_tz_get_gov(struct param *p)
|
||||
{
|
||||
struct sk_buff *msg = p->msg;
|
||||
struct thermal_zone_device *tz;
|
||||
int id, ret = 0;
|
||||
|
||||
if (!p->attrs[THERMAL_GENL_ATTR_TZ_ID])
|
||||
@@ -522,7 +519,7 @@ static int thermal_genl_cmd_tz_get_gov(struct param *p)
|
||||
|
||||
id = nla_get_u32(p->attrs[THERMAL_GENL_ATTR_TZ_ID]);
|
||||
|
||||
tz = thermal_zone_get_by_id(id);
|
||||
CLASS(thermal_zone_get_by_id, tz)(id);
|
||||
if (!tz)
|
||||
return -EINVAL;
|
||||
|
||||
|
||||
@@ -2951,9 +2951,8 @@ static void ufshcd_init_lrb(struct ufs_hba *hba, struct ufshcd_lrb *lrb, int i)
|
||||
struct utp_transfer_req_desc *utrdlp = hba->utrdl_base_addr;
|
||||
dma_addr_t cmd_desc_element_addr = hba->ucdl_dma_addr +
|
||||
i * ufshcd_get_ucd_size(hba);
|
||||
u16 response_offset = offsetof(struct utp_transfer_cmd_desc,
|
||||
response_upiu);
|
||||
u16 prdt_offset = offsetof(struct utp_transfer_cmd_desc, prd_table);
|
||||
u16 response_offset = le16_to_cpu(utrdlp[i].response_upiu_offset);
|
||||
u16 prdt_offset = le16_to_cpu(utrdlp[i].prd_table_offset);
|
||||
|
||||
lrb->utr_descriptor_ptr = utrdlp + i;
|
||||
lrb->utrd_dma_addr = hba->utrdl_dma_addr +
|
||||
|
||||
+22
-8
@@ -544,6 +544,7 @@ static int dwc3_alloc_event_buffers(struct dwc3 *dwc, unsigned int length)
|
||||
int dwc3_event_buffers_setup(struct dwc3 *dwc)
|
||||
{
|
||||
struct dwc3_event_buffer *evt;
|
||||
u32 reg;
|
||||
|
||||
if (!dwc->ev_buf)
|
||||
return 0;
|
||||
@@ -556,8 +557,10 @@ int dwc3_event_buffers_setup(struct dwc3 *dwc)
|
||||
upper_32_bits(evt->dma));
|
||||
dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0),
|
||||
DWC3_GEVNTSIZ_SIZE(evt->length));
|
||||
dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), 0);
|
||||
|
||||
/* Clear any stale event */
|
||||
reg = dwc3_readl(dwc->regs, DWC3_GEVNTCOUNT(0));
|
||||
dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), reg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -584,7 +587,10 @@ void dwc3_event_buffers_cleanup(struct dwc3 *dwc)
|
||||
dwc3_writel(dwc->regs, DWC3_GEVNTADRHI(0), 0);
|
||||
dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), DWC3_GEVNTSIZ_INTMASK
|
||||
| DWC3_GEVNTSIZ_SIZE(0));
|
||||
dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), 0);
|
||||
|
||||
/* Clear any stale event */
|
||||
reg = dwc3_readl(dwc->regs, DWC3_GEVNTCOUNT(0));
|
||||
dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), reg);
|
||||
}
|
||||
|
||||
static void dwc3_core_num_eps(struct dwc3 *dwc)
|
||||
@@ -2499,7 +2505,11 @@ static int dwc3_runtime_resume(struct device *dev)
|
||||
|
||||
switch (dwc->current_dr_role) {
|
||||
case DWC3_GCTL_PRTCAP_DEVICE:
|
||||
dwc3_gadget_process_pending_events(dwc);
|
||||
if (dwc->pending_events) {
|
||||
pm_runtime_put(dwc->dev);
|
||||
dwc->pending_events = false;
|
||||
enable_irq(dwc->irq_gadget);
|
||||
}
|
||||
break;
|
||||
case DWC3_GCTL_PRTCAP_HOST:
|
||||
default:
|
||||
@@ -2552,7 +2562,7 @@ static int dwc3_suspend(struct device *dev)
|
||||
static int dwc3_resume(struct device *dev)
|
||||
{
|
||||
struct dwc3 *dwc = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
int ret = 0;
|
||||
|
||||
pinctrl_pm_select_default_state(dev);
|
||||
|
||||
@@ -2560,14 +2570,12 @@ static int dwc3_resume(struct device *dev)
|
||||
pm_runtime_set_active(dev);
|
||||
|
||||
ret = dwc3_resume_common(dwc, PMSG_RESUME);
|
||||
if (ret) {
|
||||
if (ret)
|
||||
pm_runtime_set_suspended(dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
pm_runtime_enable(dev);
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void dwc3_complete(struct device *dev)
|
||||
@@ -2589,6 +2597,12 @@ static void dwc3_complete(struct device *dev)
|
||||
static const struct dev_pm_ops dwc3_dev_pm_ops = {
|
||||
SET_SYSTEM_SLEEP_PM_OPS(dwc3_suspend, dwc3_resume)
|
||||
.complete = dwc3_complete,
|
||||
|
||||
/*
|
||||
* Runtime suspend halts the controller on disconnection. It relies on
|
||||
* platforms with custom connection notification to start the controller
|
||||
* again.
|
||||
*/
|
||||
SET_RUNTIME_PM_OPS(dwc3_runtime_suspend, dwc3_runtime_resume,
|
||||
dwc3_runtime_idle)
|
||||
};
|
||||
|
||||
@@ -1675,7 +1675,6 @@ static inline void dwc3_otg_host_init(struct dwc3 *dwc)
|
||||
#if !IS_ENABLED(CONFIG_USB_DWC3_HOST)
|
||||
int dwc3_gadget_suspend(struct dwc3 *dwc);
|
||||
int dwc3_gadget_resume(struct dwc3 *dwc);
|
||||
void dwc3_gadget_process_pending_events(struct dwc3 *dwc);
|
||||
#else
|
||||
static inline int dwc3_gadget_suspend(struct dwc3 *dwc)
|
||||
{
|
||||
@@ -1687,9 +1686,6 @@ static inline int dwc3_gadget_resume(struct dwc3 *dwc)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void dwc3_gadget_process_pending_events(struct dwc3 *dwc)
|
||||
{
|
||||
}
|
||||
#endif /* !IS_ENABLED(CONFIG_USB_DWC3_HOST) */
|
||||
|
||||
#if IS_ENABLED(CONFIG_USB_DWC3_ULPI)
|
||||
|
||||
@@ -4728,14 +4728,3 @@ int dwc3_gadget_resume(struct dwc3 *dwc)
|
||||
|
||||
return dwc3_gadget_soft_connect(dwc);
|
||||
}
|
||||
|
||||
void dwc3_gadget_process_pending_events(struct dwc3 *dwc)
|
||||
{
|
||||
if (dwc->pending_events) {
|
||||
dwc3_interrupt(dwc->irq_gadget, dwc->ev_buf);
|
||||
dwc3_thread_interrupt(dwc->irq_gadget, dwc->ev_buf);
|
||||
pm_runtime_put(dwc->dev);
|
||||
dwc->pending_events = false;
|
||||
enable_irq(dwc->irq_gadget);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1696,6 +1696,7 @@ int usb_gadget_register_driver_owner(struct usb_gadget_driver *driver,
|
||||
driver->driver.bus = &gadget_bus_type;
|
||||
driver->driver.owner = owner;
|
||||
driver->driver.mod_name = mod_name;
|
||||
driver->driver.probe_type = PROBE_FORCE_SYNCHRONOUS;
|
||||
ret = driver_register(&driver->driver);
|
||||
if (ret) {
|
||||
pr_warn("%s: driver registration failed: %d\n",
|
||||
|
||||
@@ -79,6 +79,7 @@
|
||||
#define PCI_DEVICE_ID_ASMEDIA_1042A_XHCI 0x1142
|
||||
#define PCI_DEVICE_ID_ASMEDIA_1142_XHCI 0x1242
|
||||
#define PCI_DEVICE_ID_ASMEDIA_2142_XHCI 0x2142
|
||||
#define PCI_DEVICE_ID_ASMEDIA_3042_XHCI 0x3042
|
||||
#define PCI_DEVICE_ID_ASMEDIA_3242_XHCI 0x3242
|
||||
|
||||
#define PCI_DEVICE_ID_CADENCE 0x17CD
|
||||
@@ -451,6 +452,10 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
|
||||
pdev->device == PCI_DEVICE_ID_ASMEDIA_1042A_XHCI)
|
||||
xhci->quirks |= XHCI_ASMEDIA_MODIFY_FLOWCONTROL;
|
||||
|
||||
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
|
||||
pdev->device == PCI_DEVICE_ID_ASMEDIA_3042_XHCI)
|
||||
xhci->quirks |= XHCI_RESET_ON_RESUME;
|
||||
|
||||
if (pdev->vendor == PCI_VENDOR_ID_TI && pdev->device == 0x8241)
|
||||
xhci->quirks |= XHCI_LIMIT_ENDPOINT_INTERVAL_7;
|
||||
|
||||
|
||||
@@ -331,3 +331,15 @@ config USB_ONBOARD_DEV
|
||||
this config will enable the driver and it will automatically
|
||||
match the state of the USB subsystem. If this driver is a
|
||||
module it will be called onboard_usb_dev.
|
||||
|
||||
config USB_ONBOARD_DEV_USB5744
|
||||
bool "Onboard USB Microchip usb5744 hub with SMBus support"
|
||||
depends on (USB_ONBOARD_DEV && I2C=y) || (USB_ONBOARD_DEV=m && I2C=m)
|
||||
help
|
||||
Say Y here if you want to support onboard USB Microchip usb5744
|
||||
hub that requires SMBus initialization.
|
||||
|
||||
This options enables usb5744 i2c default initialization sequence
|
||||
during hub start-up configuration stage. It is must to enable this
|
||||
option on AMD Kria KR260 Robotics Starter Kit as this hub is
|
||||
connected to USB-SD converter which mounts the root filesystem.
|
||||
|
||||
@@ -311,7 +311,7 @@ static void onboard_dev_attach_usb_driver(struct work_struct *work)
|
||||
|
||||
static int onboard_dev_5744_i2c_init(struct i2c_client *client)
|
||||
{
|
||||
#if IS_ENABLED(CONFIG_I2C)
|
||||
#if IS_ENABLED(CONFIG_USB_ONBOARD_DEV_USB5744)
|
||||
struct device *dev = &client->dev;
|
||||
int ret;
|
||||
|
||||
@@ -394,9 +394,11 @@ static int onboard_dev_probe(struct platform_device *pdev)
|
||||
|
||||
i2c_node = of_parse_phandle(pdev->dev.of_node, "i2c-bus", 0);
|
||||
if (i2c_node) {
|
||||
struct i2c_client *client;
|
||||
struct i2c_client *client = NULL;
|
||||
|
||||
#if IS_ENABLED(CONFIG_USB_ONBOARD_DEV_USB5744)
|
||||
client = of_find_i2c_device_by_node(i2c_node);
|
||||
#endif
|
||||
of_node_put(i2c_node);
|
||||
|
||||
if (!client) {
|
||||
|
||||
@@ -34,8 +34,6 @@
|
||||
#define YUREX_BUF_SIZE 8
|
||||
#define YUREX_WRITE_TIMEOUT (HZ*2)
|
||||
|
||||
#define MAX_S64_STRLEN 20 /* {-}922337203685477580{7,8} */
|
||||
|
||||
/* table of devices that work with this driver */
|
||||
static struct usb_device_id yurex_table[] = {
|
||||
{ USB_DEVICE(YUREX_VENDOR_ID, YUREX_PRODUCT_ID) },
|
||||
@@ -402,8 +400,9 @@ static ssize_t yurex_read(struct file *file, char __user *buffer, size_t count,
|
||||
loff_t *ppos)
|
||||
{
|
||||
struct usb_yurex *dev;
|
||||
int len = 0;
|
||||
char in_buffer[MAX_S64_STRLEN];
|
||||
int len;
|
||||
char in_buffer[20];
|
||||
unsigned long flags;
|
||||
|
||||
dev = file->private_data;
|
||||
|
||||
@@ -413,16 +412,14 @@ static ssize_t yurex_read(struct file *file, char __user *buffer, size_t count,
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (WARN_ON_ONCE(dev->bbu > S64_MAX || dev->bbu < S64_MIN)) {
|
||||
mutex_unlock(&dev->io_mutex);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
spin_lock_irq(&dev->lock);
|
||||
scnprintf(in_buffer, MAX_S64_STRLEN, "%lld\n", dev->bbu);
|
||||
spin_unlock_irq(&dev->lock);
|
||||
spin_lock_irqsave(&dev->lock, flags);
|
||||
len = snprintf(in_buffer, 20, "%lld\n", dev->bbu);
|
||||
spin_unlock_irqrestore(&dev->lock, flags);
|
||||
mutex_unlock(&dev->io_mutex);
|
||||
|
||||
if (WARN_ON_ONCE(len >= sizeof(in_buffer)))
|
||||
return -EIO;
|
||||
|
||||
return simple_read_from_buffer(buffer, count, ppos, in_buffer, len);
|
||||
}
|
||||
|
||||
|
||||
@@ -2423,6 +2423,17 @@ UNUSUAL_DEV( 0xc251, 0x4003, 0x0100, 0x0100,
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_NOT_LOCKABLE),
|
||||
|
||||
/*
|
||||
* Reported by Icenowy Zheng <uwu@icenowy.me>
|
||||
* This is an interface for vendor-specific cryptic commands instead
|
||||
* of real USB storage device.
|
||||
*/
|
||||
UNUSUAL_DEV( 0xe5b7, 0x0811, 0x0100, 0x0100,
|
||||
"ZhuHai JieLi Technology",
|
||||
"JieLi BR21",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_DEVICE),
|
||||
|
||||
/* Reported by Andrew Simmons <andrew.simmons@gmail.com> */
|
||||
UNUSUAL_DEV( 0xed06, 0x4500, 0x0001, 0x0001,
|
||||
"DataStor",
|
||||
|
||||
@@ -3774,8 +3774,8 @@ static void __exit amifb_remove(struct platform_device *pdev)
|
||||
* triggers a section mismatch warning.
|
||||
*/
|
||||
static struct platform_driver amifb_driver __refdata = {
|
||||
.remove_new = __exit_p(amifb_remove),
|
||||
.driver = {
|
||||
.remove = __exit_p(amifb_remove),
|
||||
.driver = {
|
||||
.name = "amiga-video",
|
||||
},
|
||||
};
|
||||
|
||||
@@ -548,7 +548,7 @@ static void arcfb_remove(struct platform_device *dev)
|
||||
|
||||
static struct platform_driver arcfb_driver = {
|
||||
.probe = arcfb_probe,
|
||||
.remove_new = arcfb_remove,
|
||||
.remove = arcfb_remove,
|
||||
.driver = {
|
||||
.name = "arcfb",
|
||||
},
|
||||
|
||||
@@ -1299,7 +1299,7 @@ static int atmel_lcdfb_resume(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver atmel_lcdfb_driver = {
|
||||
.probe = atmel_lcdfb_probe,
|
||||
.remove_new = atmel_lcdfb_remove,
|
||||
.remove = atmel_lcdfb_remove,
|
||||
.suspend = atmel_lcdfb_suspend,
|
||||
.resume = atmel_lcdfb_resume,
|
||||
.driver = {
|
||||
|
||||
@@ -588,7 +588,7 @@ static struct platform_driver au1100fb_driver = {
|
||||
.name = "au1100-lcd",
|
||||
},
|
||||
.probe = au1100fb_drv_probe,
|
||||
.remove_new = au1100fb_drv_remove,
|
||||
.remove = au1100fb_drv_remove,
|
||||
.suspend = au1100fb_drv_suspend,
|
||||
.resume = au1100fb_drv_resume,
|
||||
};
|
||||
|
||||
@@ -1833,7 +1833,7 @@ static struct platform_driver au1200fb_driver = {
|
||||
.pm = AU1200FB_PMOPS,
|
||||
},
|
||||
.probe = au1200fb_drv_probe,
|
||||
.remove_new = au1200fb_drv_remove,
|
||||
.remove = au1200fb_drv_remove,
|
||||
};
|
||||
module_platform_driver(au1200fb_driver);
|
||||
|
||||
|
||||
@@ -1151,7 +1151,7 @@ static void broadsheetfb_remove(struct platform_device *dev)
|
||||
|
||||
static struct platform_driver broadsheetfb_driver = {
|
||||
.probe = broadsheetfb_probe,
|
||||
.remove_new = broadsheetfb_remove,
|
||||
.remove = broadsheetfb_remove,
|
||||
.driver = {
|
||||
.name = "broadsheetfb",
|
||||
},
|
||||
|
||||
@@ -372,7 +372,7 @@ static struct platform_driver bw2_driver = {
|
||||
.of_match_table = bw2_match,
|
||||
},
|
||||
.probe = bw2_probe,
|
||||
.remove_new = bw2_remove,
|
||||
.remove = bw2_remove,
|
||||
};
|
||||
|
||||
static int __init bw2_init(void)
|
||||
|
||||
@@ -590,7 +590,7 @@ static struct platform_driver cg14_driver = {
|
||||
.of_match_table = cg14_match,
|
||||
},
|
||||
.probe = cg14_probe,
|
||||
.remove_new = cg14_remove,
|
||||
.remove = cg14_remove,
|
||||
};
|
||||
|
||||
static int __init cg14_init(void)
|
||||
|
||||
@@ -458,7 +458,7 @@ static struct platform_driver cg3_driver = {
|
||||
.of_match_table = cg3_match,
|
||||
},
|
||||
.probe = cg3_probe,
|
||||
.remove_new = cg3_remove,
|
||||
.remove = cg3_remove,
|
||||
};
|
||||
|
||||
static int __init cg3_init(void)
|
||||
|
||||
@@ -858,7 +858,7 @@ static struct platform_driver cg6_driver = {
|
||||
.of_match_table = cg6_match,
|
||||
},
|
||||
.probe = cg6_probe,
|
||||
.remove_new = cg6_remove,
|
||||
.remove = cg6_remove,
|
||||
};
|
||||
|
||||
static int __init cg6_init(void)
|
||||
|
||||
@@ -371,7 +371,7 @@ static struct platform_driver clps711x_fb_driver = {
|
||||
.of_match_table = clps711x_fb_dt_ids,
|
||||
},
|
||||
.probe = clps711x_fb_probe,
|
||||
.remove_new = clps711x_fb_remove,
|
||||
.remove = clps711x_fb_remove,
|
||||
};
|
||||
module_platform_driver(clps711x_fb_driver);
|
||||
|
||||
|
||||
@@ -344,7 +344,7 @@ static void cobalt_lcdfb_remove(struct platform_device *dev)
|
||||
|
||||
static struct platform_driver cobalt_lcdfb_driver = {
|
||||
.probe = cobalt_lcdfb_probe,
|
||||
.remove_new = cobalt_lcdfb_remove,
|
||||
.remove = cobalt_lcdfb_remove,
|
||||
.driver = {
|
||||
.name = "cobalt-lcd",
|
||||
},
|
||||
|
||||
@@ -1652,7 +1652,7 @@ static SIMPLE_DEV_PM_OPS(fb_pm_ops, fb_suspend, fb_resume);
|
||||
|
||||
static struct platform_driver da8xx_fb_driver = {
|
||||
.probe = fb_probe,
|
||||
.remove_new = fb_remove,
|
||||
.remove = fb_remove,
|
||||
.driver = {
|
||||
.name = DRIVER_NAME,
|
||||
.pm = &fb_pm_ops,
|
||||
|
||||
@@ -592,7 +592,7 @@ static void ep93xxfb_remove(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver ep93xxfb_driver = {
|
||||
.probe = ep93xxfb_probe,
|
||||
.remove_new = ep93xxfb_remove,
|
||||
.remove = ep93xxfb_remove,
|
||||
.driver = {
|
||||
.name = "ep93xx-fb",
|
||||
},
|
||||
|
||||
@@ -1053,7 +1053,7 @@ static struct platform_driver ffb_driver = {
|
||||
.of_match_table = ffb_match,
|
||||
},
|
||||
.probe = ffb_probe,
|
||||
.remove_new = ffb_remove,
|
||||
.remove = ffb_remove,
|
||||
};
|
||||
|
||||
static int __init ffb_init(void)
|
||||
|
||||
@@ -1876,12 +1876,12 @@ static const struct of_device_id fsl_diu_match[] = {
|
||||
MODULE_DEVICE_TABLE(of, fsl_diu_match);
|
||||
|
||||
static struct platform_driver fsl_diu_driver = {
|
||||
.driver = {
|
||||
.driver = {
|
||||
.name = "fsl-diu-fb",
|
||||
.of_match_table = fsl_diu_match,
|
||||
},
|
||||
.probe = fsl_diu_probe,
|
||||
.remove_new = fsl_diu_remove,
|
||||
.probe = fsl_diu_probe,
|
||||
.remove = fsl_diu_remove,
|
||||
.suspend = fsl_diu_suspend,
|
||||
.resume = fsl_diu_resume,
|
||||
};
|
||||
|
||||
@@ -1247,10 +1247,10 @@ static void gbefb_remove(struct platform_device* p_dev)
|
||||
|
||||
static struct platform_driver gbefb_driver = {
|
||||
.probe = gbefb_probe,
|
||||
.remove_new = gbefb_remove,
|
||||
.driver = {
|
||||
.remove = gbefb_remove,
|
||||
.driver = {
|
||||
.name = "gbefb",
|
||||
.dev_groups = gbefb_groups,
|
||||
.dev_groups = gbefb_groups,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -311,7 +311,7 @@ MODULE_DEVICE_TABLE(acpi, goldfish_fb_acpi_match);
|
||||
|
||||
static struct platform_driver goldfish_fb_driver = {
|
||||
.probe = goldfish_fb_probe,
|
||||
.remove_new = goldfish_fb_remove,
|
||||
.remove = goldfish_fb_remove,
|
||||
.driver = {
|
||||
.name = "goldfish_fb",
|
||||
.of_match_table = goldfish_fb_of_match,
|
||||
|
||||
@@ -540,7 +540,7 @@ static struct platform_driver grvga_driver = {
|
||||
.of_match_table = svgactrl_of_match,
|
||||
},
|
||||
.probe = grvga_probe,
|
||||
.remove_new = grvga_remove,
|
||||
.remove = grvga_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(grvga_driver);
|
||||
|
||||
@@ -235,7 +235,7 @@ static void hecubafb_remove(struct platform_device *dev)
|
||||
|
||||
static struct platform_driver hecubafb_driver = {
|
||||
.probe = hecubafb_probe,
|
||||
.remove_new = hecubafb_remove,
|
||||
.remove = hecubafb_remove,
|
||||
.driver = {
|
||||
.name = "hecubafb",
|
||||
},
|
||||
|
||||
@@ -629,7 +629,7 @@ static void hgafb_remove(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver hgafb_driver = {
|
||||
.probe = hgafb_probe,
|
||||
.remove_new = hgafb_remove,
|
||||
.remove = hgafb_remove,
|
||||
.driver = {
|
||||
.name = "hgafb",
|
||||
},
|
||||
|
||||
@@ -476,7 +476,7 @@ static const struct dev_pm_ops hitfb_dev_pm_ops = {
|
||||
|
||||
static struct platform_driver hitfb_driver = {
|
||||
.probe = hitfb_probe,
|
||||
.remove_new = hitfb_remove,
|
||||
.remove = hitfb_remove,
|
||||
.driver = {
|
||||
.name = "hitfb",
|
||||
.pm = &hitfb_dev_pm_ops,
|
||||
|
||||
@@ -1105,7 +1105,7 @@ static struct platform_driver imxfb_driver = {
|
||||
.pm = pm_sleep_ptr(&imxfb_pm_ops),
|
||||
},
|
||||
.probe = imxfb_probe,
|
||||
.remove_new = imxfb_remove,
|
||||
.remove = imxfb_remove,
|
||||
.id_table = imxfb_devtype,
|
||||
};
|
||||
module_platform_driver(imxfb_driver);
|
||||
|
||||
@@ -657,7 +657,7 @@ static struct platform_driver leo_driver = {
|
||||
.of_match_table = leo_match,
|
||||
},
|
||||
.probe = leo_probe,
|
||||
.remove_new = leo_remove,
|
||||
.remove = leo_remove,
|
||||
};
|
||||
|
||||
static int __init leo_init(void)
|
||||
|
||||
@@ -834,7 +834,7 @@ static struct platform_driver of_platform_mb862xxfb_driver = {
|
||||
.of_match_table = of_platform_mb862xx_tbl,
|
||||
},
|
||||
.probe = of_platform_mb862xx_probe,
|
||||
.remove_new = of_platform_mb862xx_remove,
|
||||
.remove = of_platform_mb862xx_remove,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
@@ -707,7 +707,7 @@ static void metronomefb_remove(struct platform_device *dev)
|
||||
|
||||
static struct platform_driver metronomefb_driver = {
|
||||
.probe = metronomefb_probe,
|
||||
.remove_new = metronomefb_remove,
|
||||
.remove = metronomefb_remove,
|
||||
.driver = {
|
||||
.name = "metronomefb",
|
||||
},
|
||||
|
||||
@@ -391,7 +391,7 @@ MODULE_DEVICE_TABLE(of, ocfb_match);
|
||||
|
||||
static struct platform_driver ocfb_driver = {
|
||||
.probe = ocfb_probe,
|
||||
.remove_new = ocfb_remove,
|
||||
.remove = ocfb_remove,
|
||||
.driver = {
|
||||
.name = "ocfb_fb",
|
||||
.of_match_table = ocfb_match,
|
||||
|
||||
@@ -673,7 +673,7 @@ static struct platform_driver offb_driver_bootx_noscreen = {
|
||||
.name = "bootx-noscreen",
|
||||
},
|
||||
.probe = offb_probe_bootx_noscreen,
|
||||
.remove_new = offb_remove,
|
||||
.remove = offb_remove,
|
||||
};
|
||||
|
||||
static int offb_probe_display(struct platform_device *pdev)
|
||||
@@ -695,7 +695,7 @@ static struct platform_driver offb_driver_display = {
|
||||
.of_match_table = offb_of_match_display,
|
||||
},
|
||||
.probe = offb_probe_display,
|
||||
.remove_new = offb_remove,
|
||||
.remove = offb_remove,
|
||||
};
|
||||
|
||||
static int __init offb_init(void)
|
||||
|
||||
@@ -1825,7 +1825,7 @@ static int omapfb_resume(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver omapfb_driver = {
|
||||
.probe = omapfb_probe,
|
||||
.remove_new = omapfb_remove,
|
||||
.remove = omapfb_remove,
|
||||
.suspend = omapfb_suspend,
|
||||
.resume = omapfb_resume,
|
||||
.driver = {
|
||||
|
||||
@@ -245,7 +245,7 @@ MODULE_DEVICE_TABLE(of, tvc_of_match);
|
||||
|
||||
static struct platform_driver tvc_connector_driver = {
|
||||
.probe = tvc_probe,
|
||||
.remove_new = tvc_remove,
|
||||
.remove = tvc_remove,
|
||||
.driver = {
|
||||
.name = "connector-analog-tv",
|
||||
.of_match_table = tvc_of_match,
|
||||
|
||||
@@ -328,7 +328,7 @@ MODULE_DEVICE_TABLE(of, dvic_of_match);
|
||||
|
||||
static struct platform_driver dvi_connector_driver = {
|
||||
.probe = dvic_probe,
|
||||
.remove_new = dvic_remove,
|
||||
.remove = dvic_remove,
|
||||
.driver = {
|
||||
.name = "connector-dvi",
|
||||
.of_match_table = dvic_of_match,
|
||||
|
||||
@@ -272,7 +272,7 @@ MODULE_DEVICE_TABLE(of, hdmic_of_match);
|
||||
|
||||
static struct platform_driver hdmi_connector_driver = {
|
||||
.probe = hdmic_probe,
|
||||
.remove_new = hdmic_remove,
|
||||
.remove = hdmic_remove,
|
||||
.driver = {
|
||||
.name = "connector-hdmi",
|
||||
.of_match_table = hdmic_of_match,
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user