Merge 8c94ccc7cd ("Merge tag 'usb-6.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb") into android-mainline
Steps on the way to v6.8-rc1 Signed-off-by: Lee Jones <joneslee@google.com> Change-Id: I81f18ae0459edb092419ac6c12d770b1bab9ac2c
This commit is contained in:
@@ -2704,6 +2704,9 @@
|
||||
...
|
||||
185 = /dev/ttyNX15 Hilscher netX serial port 15
|
||||
186 = /dev/ttyJ0 JTAG1 DCC protocol based serial port emulation
|
||||
|
||||
If maximum number of uartlite serial ports is more than 4, then the driver
|
||||
uses dynamic allocation instead of static allocation for major number.
|
||||
187 = /dev/ttyUL0 Xilinx uartlite - port 0
|
||||
...
|
||||
190 = /dev/ttyUL3 Xilinx uartlite - port 3
|
||||
|
||||
@@ -6937,6 +6937,9 @@
|
||||
pause after every control message);
|
||||
o = USB_QUIRK_HUB_SLOW_RESET (Hub needs extra
|
||||
delay after resetting its port);
|
||||
p = USB_QUIRK_SHORT_SET_ADDRESS_REQ_TIMEOUT
|
||||
(Reduce timeout of the SET_ADDRESS
|
||||
request from 5000 ms to 500 ms);
|
||||
Example: quirks=0781:5580:bk,0a5c:5834:gij
|
||||
|
||||
usbhid.mousepoll=
|
||||
|
||||
@@ -75,10 +75,19 @@ On other
|
||||
submit a patch to be included in this section.
|
||||
|
||||
On all
|
||||
Write a character to /proc/sysrq-trigger. e.g.::
|
||||
Write a single character to /proc/sysrq-trigger.
|
||||
Only the first character is processed, the rest of the string is
|
||||
ignored. However, it is not recommended to write any extra characters
|
||||
as the behavior is undefined and might change in the future versions.
|
||||
E.g.::
|
||||
|
||||
echo t > /proc/sysrq-trigger
|
||||
|
||||
Alternatively, write multiple characters prepended by underscore.
|
||||
This way, all characters will be processed. E.g.::
|
||||
|
||||
echo _reisub > /proc/sysrq-trigger
|
||||
|
||||
The :kbd:`<command key>` is case sensitive.
|
||||
|
||||
What are the 'command' keys?
|
||||
|
||||
@@ -66,7 +66,6 @@ properties:
|
||||
Particularly, if use an output GPIO to control a VBUS regulator, should
|
||||
model it as a regulator. See bindings/regulator/fixed-regulator.yaml
|
||||
|
||||
# The following are optional properties for "usb-c-connector".
|
||||
power-role:
|
||||
description: Determines the power role that the Type C connector will
|
||||
support. "dual" refers to Dual Role Port (DRP).
|
||||
@@ -119,30 +118,6 @@ properties:
|
||||
|
||||
# The following are optional properties for "usb-c-connector" with power
|
||||
# delivery support.
|
||||
source-pdos:
|
||||
description: An array of u32 with each entry providing supported power
|
||||
source data object(PDO), the detailed bit definitions of PDO can be found
|
||||
in "Universal Serial Bus Power Delivery Specification" chapter 6.4.1.2
|
||||
Source_Capabilities Message, the order of each entry(PDO) should follow
|
||||
the PD spec chapter 6.4.1. Required for power source and power dual role.
|
||||
User can specify the source PDO array via PDO_FIXED/BATT/VAR/PPS_APDO()
|
||||
defined in dt-bindings/usb/pd.h.
|
||||
minItems: 1
|
||||
maxItems: 7
|
||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
||||
|
||||
sink-pdos:
|
||||
description: An array of u32 with each entry providing supported power sink
|
||||
data object(PDO), the detailed bit definitions of PDO can be found in
|
||||
"Universal Serial Bus Power Delivery Specification" chapter 6.4.1.3
|
||||
Sink Capabilities Message, the order of each entry(PDO) should follow the
|
||||
PD spec chapter 6.4.1. Required for power sink and power dual role. User
|
||||
can specify the sink PDO array via PDO_FIXED/BATT/VAR/PPS_APDO() defined
|
||||
in dt-bindings/usb/pd.h.
|
||||
minItems: 1
|
||||
maxItems: 7
|
||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
||||
|
||||
sink-vdos:
|
||||
description: An array of u32 with each entry, a Vendor Defined Message Object (VDO),
|
||||
providing additional information corresponding to the product, the detailed bit
|
||||
@@ -166,10 +141,43 @@ properties:
|
||||
maxItems: 6
|
||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
||||
|
||||
op-sink-microwatt:
|
||||
description: Sink required operating power in microwatt, if source can't
|
||||
offer the power, Capability Mismatch is set. Required for power sink and
|
||||
power dual role.
|
||||
accessory-mode-audio:
|
||||
type: boolean
|
||||
description: Whether the device supports Audio Adapter Accessory Mode. This
|
||||
is only necessary if there are no other means to discover supported
|
||||
alternative modes (e.g. through the UCSI firmware interface).
|
||||
|
||||
accessory-mode-debug:
|
||||
type: boolean
|
||||
description: Whether the device supports Debug Accessory Mode. This
|
||||
is only necessary if there are no other means to discover supported
|
||||
alternative modes (e.g. through the UCSI firmware interface).
|
||||
|
||||
altmodes:
|
||||
type: object
|
||||
description: List of Alternative Modes supported by the schematics on the
|
||||
particular device. This is only necessary if there are no other means to
|
||||
discover supported alternative modes (e.g. through the UCSI firmware
|
||||
interface).
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
patternProperties:
|
||||
"^(displayport)$":
|
||||
type: object
|
||||
description:
|
||||
A single USB-C Alternative Mode as supported by the USB-C connector logic.
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
properties:
|
||||
svid:
|
||||
$ref: /schemas/types.yaml#/definitions/uint16
|
||||
description: Unique value assigned by USB-IF to the Vendor / AltMode.
|
||||
enum: [ 0xff01 ]
|
||||
vdo:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description: VDO returned by Discover Modes USB PD command.
|
||||
|
||||
port:
|
||||
$ref: /schemas/graph.yaml#/properties/port
|
||||
@@ -231,6 +239,20 @@ properties:
|
||||
SNK_READY for non-pd link.
|
||||
type: boolean
|
||||
|
||||
capabilities:
|
||||
description: A child node to contain all the selectable USB Power Delivery capabilities.
|
||||
type: object
|
||||
|
||||
patternProperties:
|
||||
"^caps-[0-9]+$":
|
||||
description: Child nodes under "capabilities" node. Each node contains a selectable USB
|
||||
Power Delivery capability.
|
||||
type: object
|
||||
$ref: "#/$defs/capabilities"
|
||||
unevaluatedProperties: false
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
dependencies:
|
||||
sink-vdos-v1: [ sink-vdos ]
|
||||
sink-vdos: [ sink-vdos-v1 ]
|
||||
@@ -238,7 +260,42 @@ dependencies:
|
||||
required:
|
||||
- compatible
|
||||
|
||||
$defs:
|
||||
capabilities:
|
||||
type: object
|
||||
|
||||
properties:
|
||||
source-pdos:
|
||||
description: An array of u32 with each entry providing supported power
|
||||
source data object(PDO), the detailed bit definitions of PDO can be found
|
||||
in "Universal Serial Bus Power Delivery Specification" chapter 6.4.1.2
|
||||
Source_Capabilities Message, the order of each entry(PDO) should follow
|
||||
the PD spec chapter 6.4.1. Required for power source and power dual role.
|
||||
User can specify the source PDO array via PDO_FIXED/BATT/VAR/PPS_APDO()
|
||||
defined in dt-bindings/usb/pd.h.
|
||||
minItems: 1
|
||||
maxItems: 7
|
||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
||||
|
||||
sink-pdos:
|
||||
description: An array of u32 with each entry providing supported power sink
|
||||
data object(PDO), the detailed bit definitions of PDO can be found in
|
||||
"Universal Serial Bus Power Delivery Specification" chapter 6.4.1.3
|
||||
Sink Capabilities Message, the order of each entry(PDO) should follow the
|
||||
PD spec chapter 6.4.1. Required for power sink and power dual role. User
|
||||
can specify the sink PDO array via PDO_FIXED/BATT/VAR/PPS_APDO() defined
|
||||
in dt-bindings/usb/pd.h.
|
||||
minItems: 1
|
||||
maxItems: 7
|
||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
||||
|
||||
op-sink-microwatt:
|
||||
description: Sink required operating power in microwatt, if source can't
|
||||
offer the power, Capability Mismatch is set. Required for power sink and
|
||||
power dual role.
|
||||
|
||||
allOf:
|
||||
- $ref: "#/$defs/capabilities"
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
@@ -267,7 +324,7 @@ anyOf:
|
||||
- typec-power-opmode
|
||||
- new-source-frs-typec-current
|
||||
|
||||
additionalProperties: false
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
# Micro-USB connector with HS lines routed via controller (MUIC).
|
||||
@@ -289,6 +346,13 @@ examples:
|
||||
compatible = "usb-c-connector";
|
||||
label = "USB-C";
|
||||
|
||||
altmodes {
|
||||
displayport {
|
||||
svid = /bits/ 16 <0xff01>;
|
||||
vdo = <0x00001c46>;
|
||||
};
|
||||
};
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/serial/arm,dcc.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: ARM DCC (Data communication channel) serial emulation
|
||||
|
||||
maintainers:
|
||||
- Michal Simek <michal.simek@amd.com>
|
||||
|
||||
description: |
|
||||
ARM DCC (Data communication channel) serial emulation interface available
|
||||
via JTAG can be also used as one of serial line tightly coupled with every
|
||||
ARM CPU available in the system.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: arm,dcc
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
serial {
|
||||
compatible = "arm,dcc";
|
||||
};
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
https://www.nxp.com/webapp/Download?colCode=S32V234RM.
|
||||
|
||||
maintainers:
|
||||
- Chester Lin <clin@suse.com>
|
||||
- Chester Lin <chester62515@gmail.com>
|
||||
|
||||
allOf:
|
||||
- $ref: serial.yaml#
|
||||
|
||||
@@ -9,10 +9,6 @@ title: Freescale i.MX Universal Asynchronous Receiver/Transmitter (UART)
|
||||
maintainers:
|
||||
- Fabio Estevam <festevam@gmail.com>
|
||||
|
||||
allOf:
|
||||
- $ref: serial.yaml#
|
||||
- $ref: rs485.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
@@ -68,7 +64,11 @@ properties:
|
||||
- const: tx
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
items:
|
||||
- description: UART RX Interrupt
|
||||
- description: UART TX Interrupt
|
||||
- description: UART RTS Interrupt
|
||||
minItems: 1
|
||||
|
||||
wakeup-source: true
|
||||
|
||||
@@ -110,6 +110,25 @@ required:
|
||||
- clock-names
|
||||
- interrupts
|
||||
|
||||
allOf:
|
||||
- $ref: serial.yaml#
|
||||
- $ref: rs485.yaml#
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: fsl,imx1-uart
|
||||
then:
|
||||
properties:
|
||||
interrupts:
|
||||
minItems: 3
|
||||
maxItems: 3
|
||||
else:
|
||||
properties:
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
|
||||
@@ -48,9 +48,17 @@ properties:
|
||||
- const: tx
|
||||
- const: rx
|
||||
|
||||
interconnects:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
operating-points-v2: true
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
qcom,rx-crci:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description:
|
||||
@@ -99,7 +107,9 @@ unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interconnect/qcom,msm8996.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/power/qcom-rpmpd.h>
|
||||
|
||||
serial@f991e000 {
|
||||
compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
|
||||
@@ -109,4 +119,7 @@ examples:
|
||||
clock-names = "core", "iface";
|
||||
dmas = <&dma0 0>, <&dma0 1>;
|
||||
dma-names = "tx", "rx";
|
||||
power-domains = <&rpmpd MSM8996_VDDCX>;
|
||||
operating-points-v2 = <&uart_opp_table>;
|
||||
interconnects = <&pnoc MASTER_BLSP_1 &bimc SLAVE_EBI_CH0>;
|
||||
};
|
||||
|
||||
@@ -17,7 +17,7 @@ properties:
|
||||
oneOf:
|
||||
- items:
|
||||
- enum:
|
||||
- renesas,r9a07g043-sci # RZ/G2UL
|
||||
- renesas,r9a07g043-sci # RZ/G2UL and RZ/Five
|
||||
- renesas,r9a07g044-sci # RZ/G2{L,LC}
|
||||
- renesas,r9a07g054-sci # RZ/V2L
|
||||
- const: renesas,sci # generic SCI compatible UART
|
||||
|
||||
@@ -11,6 +11,7 @@ maintainers:
|
||||
|
||||
allOf:
|
||||
- $ref: serial.yaml#
|
||||
- $ref: rs485.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -20,6 +20,7 @@ properties:
|
||||
- sprd,sc9860-uart
|
||||
- sprd,sc9863a-uart
|
||||
- sprd,ums512-uart
|
||||
- sprd,ums9620-uart
|
||||
- const: sprd,sc9836-uart
|
||||
- const: sprd,sc9836-uart
|
||||
|
||||
|
||||
@@ -9,9 +9,6 @@ title: USB xHCI Controller
|
||||
maintainers:
|
||||
- Mathias Nyman <mathias.nyman@intel.com>
|
||||
|
||||
allOf:
|
||||
- $ref: usb-xhci.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
@@ -25,6 +22,11 @@ properties:
|
||||
- marvell,armada-380-xhci
|
||||
- marvell,armada-8k-xhci
|
||||
- const: generic-xhci
|
||||
- description: Broadcom SoCs with power domains
|
||||
items:
|
||||
- enum:
|
||||
- brcm,bcm2711-xhci
|
||||
- const: brcm,xhci-brcm-v2
|
||||
- description: Broadcom STB SoCs with xHCI
|
||||
enum:
|
||||
- brcm,xhci-brcm-v2
|
||||
@@ -49,6 +51,9 @@ properties:
|
||||
- const: core
|
||||
- const: reg
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
required:
|
||||
@@ -56,6 +61,20 @@ required:
|
||||
- reg
|
||||
- interrupts
|
||||
|
||||
allOf:
|
||||
- $ref: usb-xhci.yaml#
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: brcm,bcm2711-xhci
|
||||
then:
|
||||
required:
|
||||
- power-domains
|
||||
else:
|
||||
properties:
|
||||
power-domains: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
usb@f0931000 {
|
||||
|
||||
@@ -29,6 +29,11 @@ properties:
|
||||
description:
|
||||
the regulator that provides 3.3V core power to the hub.
|
||||
|
||||
peer-hub:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle
|
||||
description:
|
||||
phandle to the peer hub on the controller.
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
@@ -124,6 +124,17 @@ properties:
|
||||
defined in the xHCI spec on MTK's controller.
|
||||
default: 5000
|
||||
|
||||
rx-fifo-depth:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description:
|
||||
It is a quirk used to work around Gen1 isoc-in endpoint transfer issue
|
||||
that still send out unexpected ACK after device finishes the burst
|
||||
transfer with a short packet and cause an exception, specially on a 4K
|
||||
camera device, it happens on controller before about IPM v1.6.0;
|
||||
the side-effect is that it may cause performance drop about 10%,
|
||||
including bulk transfer, prefer to use 3k here. The size is in bytes.
|
||||
enum: [1024, 2048, 3072, 4096]
|
||||
|
||||
# the following properties are only used for case 1
|
||||
wakeup-source:
|
||||
description: enable USB remote wakeup, see power/wakeup-source.txt
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
$id: http://devicetree.org/schemas/usb/nxp,ptn5110.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: NXP PTN5110 Typec Port Cotroller
|
||||
title: NXP PTN5110 Type-C Port Controller
|
||||
|
||||
maintainers:
|
||||
- Li Jun <jun.li@nxp.com>
|
||||
|
||||
@@ -46,6 +46,8 @@ properties:
|
||||
- qcom,sm8350-dwc3
|
||||
- qcom,sm8450-dwc3
|
||||
- qcom,sm8550-dwc3
|
||||
- qcom,sm8650-dwc3
|
||||
- qcom,x1e80100-dwc3
|
||||
- const: qcom,dwc3
|
||||
|
||||
reg:
|
||||
@@ -97,12 +99,29 @@ properties:
|
||||
- const: apps-usb
|
||||
|
||||
interrupts:
|
||||
minItems: 1
|
||||
maxItems: 4
|
||||
description: |
|
||||
Different types of interrupts are used based on HS PHY used on target:
|
||||
- pwr_event: Used for wakeup based on other power events.
|
||||
- hs_phY_irq: Apart from DP/DM/QUSB2 PHY interrupts, there is
|
||||
hs_phy_irq which is not triggered by default and its
|
||||
functionality is mutually exclusive to that of
|
||||
{dp/dm}_hs_phy_irq and qusb2_phy_irq.
|
||||
- qusb2_phy: SoCs with QUSB2 PHY do not have separate DP/DM IRQs and
|
||||
expose only a single IRQ whose behavior can be modified
|
||||
by the QUSB2PHY_INTR_CTRL register. The required DPSE/
|
||||
DMSE configuration is done in QUSB2PHY_INTR_CTRL register
|
||||
of PHY address space.
|
||||
- {dp/dm}_hs_phy_irq: These IRQ's directly reflect changes on the DP/
|
||||
DM pads of the SoC. These are used for wakeup
|
||||
only on SoCs with non-QUSB2 targets with
|
||||
exception of SDM670/SDM845/SM6350.
|
||||
- ss_phy_irq: Used for remote wakeup in Super Speed mode of operation.
|
||||
minItems: 2
|
||||
maxItems: 5
|
||||
|
||||
interrupt-names:
|
||||
minItems: 1
|
||||
maxItems: 4
|
||||
minItems: 2
|
||||
maxItems: 5
|
||||
|
||||
qcom,select-utmi-as-pipe-clk:
|
||||
description:
|
||||
@@ -263,6 +282,7 @@ allOf:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,sc8280xp-dwc3
|
||||
- qcom,x1e80100-dwc3
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
@@ -288,8 +308,8 @@ allOf:
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
minItems: 5
|
||||
maxItems: 6
|
||||
minItems: 4
|
||||
maxItems: 5
|
||||
clock-names:
|
||||
oneOf:
|
||||
- items:
|
||||
@@ -298,13 +318,11 @@ allOf:
|
||||
- const: iface
|
||||
- const: sleep
|
||||
- const: mock_utmi
|
||||
- const: bus
|
||||
- items:
|
||||
- const: cfg_noc
|
||||
- const: core
|
||||
- const: sleep
|
||||
- const: mock_utmi
|
||||
- const: bus
|
||||
|
||||
- if:
|
||||
properties:
|
||||
@@ -318,6 +336,7 @@ allOf:
|
||||
- qcom,sm8250-dwc3
|
||||
- qcom,sm8450-dwc3
|
||||
- qcom,sm8550-dwc3
|
||||
- qcom,sm8650-dwc3
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
@@ -357,131 +376,96 @@ allOf:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,ipq4019-dwc3
|
||||
- qcom,ipq5018-dwc3
|
||||
- qcom,ipq6018-dwc3
|
||||
- qcom,ipq8064-dwc3
|
||||
- qcom,ipq8074-dwc3
|
||||
- qcom,msm8994-dwc3
|
||||
- qcom,msm8953-dwc3
|
||||
- qcom,msm8998-dwc3
|
||||
then:
|
||||
properties:
|
||||
interrupts:
|
||||
minItems: 2
|
||||
maxItems: 3
|
||||
interrupt-names:
|
||||
items:
|
||||
- const: pwr_event
|
||||
- const: qusb2_phy
|
||||
- const: ss_phy_irq
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,msm8996-dwc3
|
||||
- qcom,qcs404-dwc3
|
||||
- qcom,sdm660-dwc3
|
||||
- qcom,sm6115-dwc3
|
||||
- qcom,sm6125-dwc3
|
||||
then:
|
||||
properties:
|
||||
interrupts:
|
||||
minItems: 3
|
||||
maxItems: 4
|
||||
interrupt-names:
|
||||
items:
|
||||
- const: pwr_event
|
||||
- const: qusb2_phy
|
||||
- const: hs_phy_irq
|
||||
- const: ss_phy_irq
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,ipq5332-dwc3
|
||||
- qcom,x1e80100-dwc3
|
||||
then:
|
||||
properties:
|
||||
interrupts:
|
||||
maxItems: 4
|
||||
interrupt-names:
|
||||
items:
|
||||
- const: pwr_event
|
||||
- const: dp_hs_phy_irq
|
||||
- const: dm_hs_phy_irq
|
||||
- const: ss_phy_irq
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,ipq4019-dwc3
|
||||
- qcom,ipq8064-dwc3
|
||||
- qcom,msm8994-dwc3
|
||||
- qcom,sa8775p-dwc3
|
||||
- qcom,sc7180-dwc3
|
||||
- qcom,sc7280-dwc3
|
||||
- qcom,sc8280xp-dwc3
|
||||
- qcom,sdm670-dwc3
|
||||
- qcom,sdm845-dwc3
|
||||
- qcom,sdx55-dwc3
|
||||
- qcom,sdx65-dwc3
|
||||
- qcom,sdx75-dwc3
|
||||
- qcom,sm4250-dwc3
|
||||
- qcom,sm6125-dwc3
|
||||
- qcom,sm6350-dwc3
|
||||
- qcom,sm8150-dwc3
|
||||
- qcom,sm8250-dwc3
|
||||
- qcom,sm8350-dwc3
|
||||
- qcom,sm8450-dwc3
|
||||
- qcom,sm8550-dwc3
|
||||
- qcom,sm8650-dwc3
|
||||
then:
|
||||
properties:
|
||||
interrupts:
|
||||
items:
|
||||
- description: The interrupt that is asserted
|
||||
when a wakeup event is received on USB2 bus.
|
||||
- description: The interrupt that is asserted
|
||||
when a wakeup event is received on USB3 bus.
|
||||
- description: Wakeup event on DM line.
|
||||
- description: Wakeup event on DP line.
|
||||
interrupt-names:
|
||||
items:
|
||||
- const: hs_phy_irq
|
||||
- const: ss_phy_irq
|
||||
- const: dm_hs_phy_irq
|
||||
- const: dp_hs_phy_irq
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,msm8953-dwc3
|
||||
- qcom,msm8996-dwc3
|
||||
- qcom,msm8998-dwc3
|
||||
- qcom,sm6115-dwc3
|
||||
then:
|
||||
properties:
|
||||
interrupts:
|
||||
maxItems: 2
|
||||
interrupt-names:
|
||||
items:
|
||||
- const: hs_phy_irq
|
||||
- const: ss_phy_irq
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,ipq5018-dwc3
|
||||
- qcom,ipq5332-dwc3
|
||||
- qcom,sdm660-dwc3
|
||||
then:
|
||||
properties:
|
||||
interrupts:
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
interrupt-names:
|
||||
minItems: 1
|
||||
items:
|
||||
- const: hs_phy_irq
|
||||
- const: ss_phy_irq
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,sc7280-dwc3
|
||||
then:
|
||||
properties:
|
||||
interrupts:
|
||||
minItems: 3
|
||||
maxItems: 4
|
||||
interrupt-names:
|
||||
minItems: 3
|
||||
items:
|
||||
- const: hs_phy_irq
|
||||
- const: dp_hs_phy_irq
|
||||
- const: dm_hs_phy_irq
|
||||
- const: ss_phy_irq
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,sc8280xp-dwc3
|
||||
then:
|
||||
properties:
|
||||
interrupts:
|
||||
maxItems: 4
|
||||
minItems: 4
|
||||
maxItems: 5
|
||||
interrupt-names:
|
||||
items:
|
||||
- const: pwr_event
|
||||
- const: dp_hs_phy_irq
|
||||
- const: dm_hs_phy_irq
|
||||
- const: ss_phy_irq
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,sa8775p-dwc3
|
||||
then:
|
||||
properties:
|
||||
interrupts:
|
||||
minItems: 3
|
||||
maxItems: 4
|
||||
interrupt-names:
|
||||
minItems: 3
|
||||
items:
|
||||
- const: pwr_event
|
||||
- const: hs_phy_irq
|
||||
- const: dp_hs_phy_irq
|
||||
- const: dm_hs_phy_irq
|
||||
- const: ss_phy_irq
|
||||
@@ -519,12 +503,13 @@ examples:
|
||||
<&gcc GCC_USB30_PRIM_MASTER_CLK>;
|
||||
assigned-clock-rates = <19200000>, <150000000>;
|
||||
|
||||
interrupts = <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 486 IRQ_TYPE_LEVEL_HIGH>,
|
||||
interrupts = <GIC_SPI 130 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 489 IRQ_TYPE_EDGE_BOTH>,
|
||||
<GIC_SPI 488 IRQ_TYPE_EDGE_BOTH>,
|
||||
<GIC_SPI 489 IRQ_TYPE_EDGE_BOTH>;
|
||||
interrupt-names = "hs_phy_irq", "ss_phy_irq",
|
||||
"dm_hs_phy_irq", "dp_hs_phy_irq";
|
||||
<GIC_SPI 486 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "pwr_event", "hs_phy_irq",
|
||||
"dp_hs_phy_irq", "dm_hs_phy_irq", "ss_phy_irq";
|
||||
|
||||
power-domains = <&gcc USB30_PRIM_GDSC>;
|
||||
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/usb/qcom,wcd939x-usbss.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Qualcomm WCD9380/WCD9385 USB SubSystem Altmode/Analog Audio Switch
|
||||
|
||||
maintainers:
|
||||
- Neil Armstrong <neil.armstrong@linaro.org>
|
||||
|
||||
description:
|
||||
Qualcomm WCD9390/WCD9395 is a standalone Hi-Fi audio codec IC with a
|
||||
functionally separate USB SubSystem for Altmode/Analog Audio Switch
|
||||
accessible over an I2C interface.
|
||||
The Audio Headphone and Microphone data path between the Codec and the
|
||||
USB-C Mux subsystems are external to the IC, thus requiring DT port-endpoint
|
||||
graph description to handle USB-C altmode & orientation switching for Audio
|
||||
Accessory Mode.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
- const: qcom,wcd9390-usbss
|
||||
- items:
|
||||
- const: qcom,wcd9395-usbss
|
||||
- const: qcom,wcd9390-usbss
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
reset-gpios:
|
||||
maxItems: 1
|
||||
|
||||
vdd-supply:
|
||||
description: USBSS VDD power supply
|
||||
|
||||
mode-switch:
|
||||
description: Flag the port as possible handle of altmode switching
|
||||
type: boolean
|
||||
|
||||
orientation-switch:
|
||||
description: Flag the port as possible handler of orientation switching
|
||||
type: boolean
|
||||
|
||||
ports:
|
||||
$ref: /schemas/graph.yaml#/properties/ports
|
||||
properties:
|
||||
port@0:
|
||||
$ref: /schemas/graph.yaml#/properties/port
|
||||
description:
|
||||
A port node to link the WCD939x USB SubSystem to a TypeC controller for the
|
||||
purpose of handling altmode muxing and orientation switching.
|
||||
|
||||
port@1:
|
||||
$ref: /schemas/graph.yaml#/properties/port
|
||||
description:
|
||||
A port node to link the WCD939x USB SubSystem to the Codec SubSystem for the
|
||||
purpose of handling USB-C Audio Accessory Mode muxing and orientation switching.
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- ports
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
typec-mux@42 {
|
||||
compatible = "qcom,wcd9390-usbss";
|
||||
reg = <0x42>;
|
||||
|
||||
vdd-supply = <&vreg_bob>;
|
||||
|
||||
mode-switch;
|
||||
orientation-switch;
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
wcd9390_usbss_sbu: endpoint {
|
||||
remote-endpoint = <&typec_sbu>;
|
||||
};
|
||||
};
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
wcd9390_usbss_codec: endpoint {
|
||||
remote-endpoint = <&wcd9390_codec_usbss>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
...
|
||||
@@ -19,7 +19,7 @@ properties:
|
||||
- items:
|
||||
- enum:
|
||||
- renesas,usbhs-r7s9210 # RZ/A2
|
||||
- renesas,usbhs-r9a07g043 # RZ/G2UL
|
||||
- renesas,usbhs-r9a07g043 # RZ/G2UL and RZ/Five
|
||||
- renesas,usbhs-r9a07g044 # RZ/G2{L,LC}
|
||||
- renesas,usbhs-r9a07g054 # RZ/V2L
|
||||
- const: renesas,rza2-usbhs
|
||||
|
||||
@@ -432,6 +432,10 @@ properties:
|
||||
items:
|
||||
enum: [1, 4, 8, 16, 32, 64, 128, 256]
|
||||
|
||||
num-hc-interrupters:
|
||||
maximum: 8
|
||||
default: 1
|
||||
|
||||
port:
|
||||
$ref: /schemas/graph.yaml#/properties/port
|
||||
description:
|
||||
|
||||
@@ -38,6 +38,10 @@ properties:
|
||||
- const: main
|
||||
- const: patch-address
|
||||
|
||||
reset-gpios:
|
||||
description: GPIO used for the HRESET pin.
|
||||
maxItems: 1
|
||||
|
||||
wakeup-source: true
|
||||
|
||||
interrupts:
|
||||
@@ -90,6 +94,7 @@ additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
@@ -106,6 +111,7 @@ examples:
|
||||
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&typec_pins>;
|
||||
reset-gpios = <&gpio1 6 GPIO_ACTIVE_HIGH>;
|
||||
|
||||
typec_con: connector {
|
||||
compatible = "usb-c-connector";
|
||||
|
||||
@@ -29,6 +29,12 @@ properties:
|
||||
description: Interrupt moderation interval
|
||||
default: 5000
|
||||
|
||||
num-hc-interrupters:
|
||||
description: Maximum number of interrupters to allocate
|
||||
$ref: /schemas/types.yaml#/definitions/uint16
|
||||
minimum: 1
|
||||
maximum: 1024
|
||||
|
||||
additionalProperties: true
|
||||
|
||||
examples:
|
||||
|
||||
@@ -448,15 +448,17 @@ Function-specific configfs interface
|
||||
The function name to use when creating the function directory is "ncm".
|
||||
The NCM function provides these attributes in its function directory:
|
||||
|
||||
=============== ==================================================
|
||||
ifname network device interface name associated with this
|
||||
function instance
|
||||
qmult queue length multiplier for high and super speed
|
||||
host_addr MAC address of host's end of this
|
||||
Ethernet over USB link
|
||||
dev_addr MAC address of device's end of this
|
||||
Ethernet over USB link
|
||||
=============== ==================================================
|
||||
=============== ==================================================
|
||||
ifname network device interface name associated with this
|
||||
function instance
|
||||
qmult queue length multiplier for high and super speed
|
||||
host_addr MAC address of host's end of this
|
||||
Ethernet over USB link
|
||||
dev_addr MAC address of device's end of this
|
||||
Ethernet over USB link
|
||||
max_segment_size Segment size required for P2P connections. This
|
||||
will set MTU to (max_segment_size - 14 bytes)
|
||||
=============== ==================================================
|
||||
|
||||
and after creating the functions/ncm.<instance name> they contain default
|
||||
values: qmult is 5, dev_addr and host_addr are randomly selected.
|
||||
|
||||
@@ -81,9 +81,6 @@ feature must be kept in the implementation.
|
||||
Potential future improvements
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- Report more events (suspend, resume, etc.) through
|
||||
``USB_RAW_IOCTL_EVENT_FETCH``.
|
||||
|
||||
- Support ``O_NONBLOCK`` I/O. This would be another mode of operation, where
|
||||
Raw Gadget would not wait until the completion of each USB request.
|
||||
|
||||
|
||||
@@ -23192,7 +23192,6 @@ M: Amit Shah <amit@kernel.org>
|
||||
L: virtualization@lists.linux.dev
|
||||
S: Maintained
|
||||
F: drivers/char/virtio_console.c
|
||||
F: include/linux/virtio_console.h
|
||||
F: include/uapi/linux/virtio_console.h
|
||||
|
||||
VIRTIO CORE AND NET DRIVERS
|
||||
|
||||
+15
-19
@@ -53,7 +53,7 @@ srmcons_do_receive_chars(struct tty_port *port)
|
||||
do {
|
||||
result.as_long = callback_getc(0);
|
||||
if (result.bits.status < 2) {
|
||||
tty_insert_flip_char(port, (char)result.bits.c, 0);
|
||||
tty_insert_flip_char(port, (u8)result.bits.c, 0);
|
||||
count++;
|
||||
}
|
||||
} while((result.bits.status & 1) && (++loops < 10));
|
||||
@@ -88,30 +88,27 @@ srmcons_receive_chars(struct timer_list *t)
|
||||
}
|
||||
|
||||
/* called with callback_lock held */
|
||||
static int
|
||||
srmcons_do_write(struct tty_port *port, const char *buf, int count)
|
||||
static void
|
||||
srmcons_do_write(struct tty_port *port, const u8 *buf, size_t count)
|
||||
{
|
||||
static char str_cr[1] = "\r";
|
||||
long c, remaining = count;
|
||||
size_t c;
|
||||
srmcons_result result;
|
||||
char *cur;
|
||||
int need_cr;
|
||||
|
||||
for (cur = (char *)buf; remaining > 0; ) {
|
||||
need_cr = 0;
|
||||
while (count > 0) {
|
||||
bool need_cr = false;
|
||||
/*
|
||||
* Break it up into reasonable size chunks to allow a chance
|
||||
* for input to get in
|
||||
*/
|
||||
for (c = 0; c < min_t(long, 128L, remaining) && !need_cr; c++)
|
||||
if (cur[c] == '\n')
|
||||
need_cr = 1;
|
||||
for (c = 0; c < min_t(size_t, 128U, count) && !need_cr; c++)
|
||||
if (buf[c] == '\n')
|
||||
need_cr = true;
|
||||
|
||||
while (c > 0) {
|
||||
result.as_long = callback_puts(0, cur, c);
|
||||
result.as_long = callback_puts(0, buf, c);
|
||||
c -= result.bits.c;
|
||||
remaining -= result.bits.c;
|
||||
cur += result.bits.c;
|
||||
count -= result.bits.c;
|
||||
buf += result.bits.c;
|
||||
|
||||
/*
|
||||
* Check for pending input iff a tty port was provided
|
||||
@@ -121,12 +118,11 @@ srmcons_do_write(struct tty_port *port, const char *buf, int count)
|
||||
}
|
||||
|
||||
while (need_cr) {
|
||||
result.as_long = callback_puts(0, str_cr, 1);
|
||||
result.as_long = callback_puts(0, "\r", 1);
|
||||
if (result.bits.c > 0)
|
||||
need_cr = 0;
|
||||
need_cr = false;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
@@ -135,7 +131,7 @@ srmcons_write(struct tty_struct *tty, const u8 *buf, size_t count)
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&srmcons_callback_lock, flags);
|
||||
srmcons_do_write(tty->port, (const char *) buf, count);
|
||||
srmcons_do_write(tty->port, buf, count);
|
||||
spin_unlock_irqrestore(&srmcons_callback_lock, flags);
|
||||
|
||||
return count;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include "bcm2835-rpi.dtsi"
|
||||
|
||||
#include <dt-bindings/power/raspberrypi-power.h>
|
||||
#include <dt-bindings/reset/raspberrypi,firmware-reset.h>
|
||||
|
||||
/ {
|
||||
@@ -76,3 +77,7 @@
|
||||
&vchiq {
|
||||
interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
&xhci {
|
||||
power-domains = <&power RPI_POWER_DOMAIN_USB>;
|
||||
};
|
||||
|
||||
@@ -604,6 +604,20 @@
|
||||
};
|
||||
};
|
||||
|
||||
xhci: usb@7e9c0000 {
|
||||
compatible = "brcm,bcm2711-xhci", "brcm,xhci-brcm-v2";
|
||||
reg = <0x0 0x7e9c0000 0x100000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
interrupts = <GIC_SPI 176 IRQ_TYPE_LEVEL_HIGH>;
|
||||
/* DWC2 and this IP block share the same USB PHY,
|
||||
* enabling both at the same time results in lockups.
|
||||
* So keep this node disabled and let the bootloader
|
||||
* decide which interface should be enabled.
|
||||
*/
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
v3d: gpu@7ec00000 {
|
||||
compatible = "brcm,2711-v3d";
|
||||
reg = <0x0 0x7ec00000 0x4000>,
|
||||
|
||||
@@ -1294,6 +1294,7 @@
|
||||
&xhci0 {
|
||||
status = "okay";
|
||||
|
||||
rx-fifo-depth = <3072>;
|
||||
vusb33-supply = <&mt6359_vusb_ldo_reg>;
|
||||
vbus-supply = <&usb_vbus>;
|
||||
};
|
||||
@@ -1301,6 +1302,7 @@
|
||||
&xhci1 {
|
||||
status = "okay";
|
||||
|
||||
rx-fifo-depth = <3072>;
|
||||
vusb33-supply = <&mt6359_vusb_ldo_reg>;
|
||||
vbus-supply = <&usb_vbus>;
|
||||
};
|
||||
|
||||
@@ -540,9 +540,6 @@
|
||||
compatible = "qcom,msm8916-bimc";
|
||||
reg = <0x00400000 0x62000>;
|
||||
#interconnect-cells = <1>;
|
||||
clock-names = "bus", "bus_a";
|
||||
clocks = <&rpmcc RPM_SMD_BIMC_CLK>,
|
||||
<&rpmcc RPM_SMD_BIMC_A_CLK>;
|
||||
};
|
||||
|
||||
tsens: thermal-sensor@4a9000 {
|
||||
@@ -575,18 +572,12 @@
|
||||
compatible = "qcom,msm8916-pcnoc";
|
||||
reg = <0x00500000 0x11000>;
|
||||
#interconnect-cells = <1>;
|
||||
clock-names = "bus", "bus_a";
|
||||
clocks = <&rpmcc RPM_SMD_PCNOC_CLK>,
|
||||
<&rpmcc RPM_SMD_PCNOC_A_CLK>;
|
||||
};
|
||||
|
||||
snoc: interconnect@580000 {
|
||||
compatible = "qcom,msm8916-snoc";
|
||||
reg = <0x00580000 0x14000>;
|
||||
#interconnect-cells = <1>;
|
||||
clock-names = "bus", "bus_a";
|
||||
clocks = <&rpmcc RPM_SMD_SNOC_CLK>,
|
||||
<&rpmcc RPM_SMD_SNOC_A_CLK>;
|
||||
};
|
||||
|
||||
stm: stm@802000 {
|
||||
|
||||
@@ -602,9 +602,6 @@
|
||||
bimc: interconnect@400000 {
|
||||
compatible = "qcom,msm8939-bimc";
|
||||
reg = <0x00400000 0x62000>;
|
||||
clock-names = "bus", "bus_a";
|
||||
clocks = <&rpmcc RPM_SMD_BIMC_CLK>,
|
||||
<&rpmcc RPM_SMD_BIMC_A_CLK>;
|
||||
#interconnect-cells = <1>;
|
||||
};
|
||||
|
||||
@@ -648,25 +645,16 @@
|
||||
pcnoc: interconnect@500000 {
|
||||
compatible = "qcom,msm8939-pcnoc";
|
||||
reg = <0x00500000 0x11000>;
|
||||
clock-names = "bus", "bus_a";
|
||||
clocks = <&rpmcc RPM_SMD_PCNOC_CLK>,
|
||||
<&rpmcc RPM_SMD_PCNOC_A_CLK>;
|
||||
#interconnect-cells = <1>;
|
||||
};
|
||||
|
||||
snoc: interconnect@580000 {
|
||||
compatible = "qcom,msm8939-snoc";
|
||||
reg = <0x00580000 0x14080>;
|
||||
clock-names = "bus", "bus_a";
|
||||
clocks = <&rpmcc RPM_SMD_SNOC_CLK>,
|
||||
<&rpmcc RPM_SMD_SNOC_A_CLK>;
|
||||
#interconnect-cells = <1>;
|
||||
|
||||
snoc_mm: interconnect-snoc {
|
||||
compatible = "qcom,msm8939-snoc-mm";
|
||||
clock-names = "bus", "bus_a";
|
||||
clocks = <&rpmcc RPM_SMD_SYSMMNOC_CLK>,
|
||||
<&rpmcc RPM_SMD_SYSMMNOC_A_CLK>;
|
||||
#interconnect-cells = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -838,9 +838,6 @@
|
||||
compatible = "qcom,msm8996-bimc";
|
||||
reg = <0x00408000 0x5a000>;
|
||||
#interconnect-cells = <1>;
|
||||
clock-names = "bus", "bus_a";
|
||||
clocks = <&rpmcc RPM_SMD_BIMC_CLK>,
|
||||
<&rpmcc RPM_SMD_BIMC_A_CLK>;
|
||||
};
|
||||
|
||||
tsens0: thermal-sensor@4a9000 {
|
||||
@@ -891,18 +888,12 @@
|
||||
compatible = "qcom,msm8996-cnoc";
|
||||
reg = <0x00500000 0x1000>;
|
||||
#interconnect-cells = <1>;
|
||||
clock-names = "bus", "bus_a";
|
||||
clocks = <&rpmcc RPM_SMD_CNOC_CLK>,
|
||||
<&rpmcc RPM_SMD_CNOC_A_CLK>;
|
||||
};
|
||||
|
||||
snoc: interconnect@524000 {
|
||||
compatible = "qcom,msm8996-snoc";
|
||||
reg = <0x00524000 0x1c000>;
|
||||
#interconnect-cells = <1>;
|
||||
clock-names = "bus", "bus_a";
|
||||
clocks = <&rpmcc RPM_SMD_SNOC_CLK>,
|
||||
<&rpmcc RPM_SMD_SNOC_A_CLK>;
|
||||
};
|
||||
|
||||
a0noc: interconnect@543000 {
|
||||
@@ -922,19 +913,14 @@
|
||||
compatible = "qcom,msm8996-a1noc";
|
||||
reg = <0x00562000 0x5000>;
|
||||
#interconnect-cells = <1>;
|
||||
clock-names = "bus", "bus_a";
|
||||
clocks = <&rpmcc RPM_SMD_AGGR1_NOC_CLK>,
|
||||
<&rpmcc RPM_SMD_AGGR1_NOC_A_CLK>;
|
||||
};
|
||||
|
||||
a2noc: interconnect@583000 {
|
||||
compatible = "qcom,msm8996-a2noc";
|
||||
reg = <0x00583000 0x7000>;
|
||||
#interconnect-cells = <1>;
|
||||
clock-names = "bus", "bus_a", "aggre2_ufs_axi", "ufs_axi";
|
||||
clocks = <&rpmcc RPM_SMD_AGGR2_NOC_CLK>,
|
||||
<&rpmcc RPM_SMD_AGGR2_NOC_A_CLK>,
|
||||
<&gcc GCC_AGGRE2_UFS_AXI_CLK>,
|
||||
clock-names = "aggre2_ufs_axi", "ufs_axi";
|
||||
clocks = <&gcc GCC_AGGRE2_UFS_AXI_CLK>,
|
||||
<&gcc GCC_UFS_AXI_CLK>;
|
||||
};
|
||||
|
||||
@@ -942,19 +928,14 @@
|
||||
compatible = "qcom,msm8996-mnoc";
|
||||
reg = <0x005a4000 0x1c000>;
|
||||
#interconnect-cells = <1>;
|
||||
clock-names = "bus", "bus_a", "iface";
|
||||
clocks = <&rpmcc RPM_SMD_MMAXI_CLK>,
|
||||
<&rpmcc RPM_SMD_MMAXI_A_CLK>,
|
||||
<&mmcc AHB_CLK_SRC>;
|
||||
clock-names = "iface";
|
||||
clocks = <&mmcc AHB_CLK_SRC>;
|
||||
};
|
||||
|
||||
pnoc: interconnect@5c0000 {
|
||||
compatible = "qcom,msm8996-pnoc";
|
||||
reg = <0x005c0000 0x3000>;
|
||||
#interconnect-cells = <1>;
|
||||
clock-names = "bus", "bus_a";
|
||||
clocks = <&rpmcc RPM_SMD_PCNOC_CLK>,
|
||||
<&rpmcc RPM_SMD_PCNOC_A_CLK>;
|
||||
};
|
||||
|
||||
tcsr_mutex: hwlock@740000 {
|
||||
@@ -2486,9 +2467,8 @@
|
||||
"handover",
|
||||
"stop-ack";
|
||||
|
||||
clocks = <&xo_board>,
|
||||
<&rpmcc RPM_SMD_AGGR2_NOC_CLK>;
|
||||
clock-names = "xo", "aggre2";
|
||||
clocks = <&xo_board>;
|
||||
clock-names = "xo";
|
||||
|
||||
memory-region = <&slpi_mem>;
|
||||
|
||||
@@ -2533,10 +2513,15 @@
|
||||
<&gcc GCC_MSS_GPLL0_DIV_CLK>,
|
||||
<&gcc GCC_MSS_SNOC_AXI_CLK>,
|
||||
<&gcc GCC_MSS_MNOC_BIMC_AXI_CLK>,
|
||||
<&rpmcc RPM_SMD_PCNOC_CLK>,
|
||||
<&rpmcc RPM_SMD_QDSS_CLK>;
|
||||
clock-names = "iface", "bus", "mem", "xo", "gpll0_mss",
|
||||
"snoc_axi", "mnoc_axi", "pnoc", "qdss";
|
||||
clock-names = "iface",
|
||||
"bus",
|
||||
"mem",
|
||||
"xo",
|
||||
"gpll0_mss",
|
||||
"snoc_axi",
|
||||
"mnoc_axi",
|
||||
"qdss";
|
||||
|
||||
resets = <&gcc GCC_MSS_RESTART>;
|
||||
reset-names = "mss_restart";
|
||||
|
||||
@@ -1605,9 +1605,8 @@
|
||||
|
||||
px-supply = <&vreg_lvs2a_1p8>;
|
||||
|
||||
clocks = <&rpmcc RPM_SMD_XO_CLK_SRC>,
|
||||
<&rpmcc RPM_SMD_AGGR2_NOC_CLK>;
|
||||
clock-names = "xo", "aggre2";
|
||||
clocks = <&rpmcc RPM_SMD_XO_CLK_SRC>;
|
||||
clock-names = "xo";
|
||||
|
||||
memory-region = <&slpi_mem>;
|
||||
|
||||
|
||||
@@ -558,9 +558,6 @@
|
||||
reg = <0x00400000 0x80000>;
|
||||
compatible = "qcom,qcs404-bimc";
|
||||
#interconnect-cells = <1>;
|
||||
clock-names = "bus", "bus_a";
|
||||
clocks = <&rpmcc RPM_SMD_BIMC_CLK>,
|
||||
<&rpmcc RPM_SMD_BIMC_A_CLK>;
|
||||
};
|
||||
|
||||
tsens: thermal-sensor@4a9000 {
|
||||
@@ -601,18 +598,12 @@
|
||||
reg = <0x00500000 0x15080>;
|
||||
compatible = "qcom,qcs404-pcnoc";
|
||||
#interconnect-cells = <1>;
|
||||
clock-names = "bus", "bus_a";
|
||||
clocks = <&rpmcc RPM_SMD_PNOC_CLK>,
|
||||
<&rpmcc RPM_SMD_PNOC_A_CLK>;
|
||||
};
|
||||
|
||||
snoc: interconnect@580000 {
|
||||
reg = <0x00580000 0x23080>;
|
||||
compatible = "qcom,qcs404-snoc";
|
||||
#interconnect-cells = <1>;
|
||||
clock-names = "bus", "bus_a";
|
||||
clocks = <&rpmcc RPM_SMD_SNOC_CLK>,
|
||||
<&rpmcc RPM_SMD_SNOC_A_CLK>;
|
||||
};
|
||||
|
||||
remoteproc_cdsp: remoteproc@b00000 {
|
||||
|
||||
@@ -1454,7 +1454,7 @@
|
||||
|
||||
altmodes {
|
||||
displayport {
|
||||
svid = <0xff01>;
|
||||
svid = /bits/ 16 <0xff01>;
|
||||
vdo = <0x00001c46>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -606,9 +606,6 @@
|
||||
compatible = "qcom,sdm660-bimc";
|
||||
reg = <0x01008000 0x78000>;
|
||||
#interconnect-cells = <1>;
|
||||
clock-names = "bus", "bus_a";
|
||||
clocks = <&rpmcc RPM_SMD_BIMC_CLK>,
|
||||
<&rpmcc RPM_SMD_BIMC_A_CLK>;
|
||||
};
|
||||
|
||||
restart@10ac000 {
|
||||
@@ -620,28 +617,17 @@
|
||||
compatible = "qcom,sdm660-cnoc";
|
||||
reg = <0x01500000 0x10000>;
|
||||
#interconnect-cells = <1>;
|
||||
clock-names = "bus", "bus_a";
|
||||
clocks = <&rpmcc RPM_SMD_CNOC_CLK>,
|
||||
<&rpmcc RPM_SMD_CNOC_A_CLK>;
|
||||
};
|
||||
|
||||
snoc: interconnect@1626000 {
|
||||
compatible = "qcom,sdm660-snoc";
|
||||
reg = <0x01626000 0x7090>;
|
||||
#interconnect-cells = <1>;
|
||||
clock-names = "bus", "bus_a";
|
||||
clocks = <&rpmcc RPM_SMD_SNOC_CLK>,
|
||||
<&rpmcc RPM_SMD_SNOC_A_CLK>;
|
||||
};
|
||||
|
||||
anoc2_smmu: iommu@16c0000 {
|
||||
compatible = "qcom,sdm630-smmu-v2", "qcom,smmu-v2";
|
||||
reg = <0x016c0000 0x40000>;
|
||||
|
||||
assigned-clocks = <&rpmcc RPM_SMD_AGGR2_NOC_CLK>;
|
||||
assigned-clock-rates = <1000>;
|
||||
clocks = <&rpmcc RPM_SMD_AGGR2_NOC_CLK>;
|
||||
clock-names = "bus";
|
||||
#global-interrupts = <2>;
|
||||
#iommu-cells = <1>;
|
||||
|
||||
@@ -686,16 +672,12 @@
|
||||
compatible = "qcom,sdm660-a2noc";
|
||||
reg = <0x01704000 0xc100>;
|
||||
#interconnect-cells = <1>;
|
||||
clock-names = "bus",
|
||||
"bus_a",
|
||||
"ipa",
|
||||
clock-names = "ipa",
|
||||
"ufs_axi",
|
||||
"aggre2_ufs_axi",
|
||||
"aggre2_usb3_axi",
|
||||
"cfg_noc_usb2_axi";
|
||||
clocks = <&rpmcc RPM_SMD_AGGR2_NOC_CLK>,
|
||||
<&rpmcc RPM_SMD_AGGR2_NOC_A_CLK>,
|
||||
<&rpmcc RPM_SMD_IPA_CLK>,
|
||||
clocks = <&rpmcc RPM_SMD_IPA_CLK>,
|
||||
<&gcc GCC_UFS_AXI_CLK>,
|
||||
<&gcc GCC_AGGRE2_UFS_AXI_CLK>,
|
||||
<&gcc GCC_AGGRE2_USB3_AXI_CLK>,
|
||||
@@ -706,10 +688,8 @@
|
||||
compatible = "qcom,sdm660-mnoc";
|
||||
reg = <0x01745000 0xa010>;
|
||||
#interconnect-cells = <1>;
|
||||
clock-names = "bus", "bus_a", "iface";
|
||||
clocks = <&rpmcc RPM_SMD_MMSSNOC_AXI_CLK>,
|
||||
<&rpmcc RPM_SMD_MMSSNOC_AXI_CLK_A>,
|
||||
<&mmcc AHB_CLK_SRC>;
|
||||
clock-names = "iface";
|
||||
clocks = <&mmcc AHB_CLK_SRC>;
|
||||
};
|
||||
|
||||
tsens: thermal-sensor@10ae000 {
|
||||
@@ -1186,7 +1166,9 @@
|
||||
clocks = <&gcc GCC_GPU_CFG_AHB_CLK>,
|
||||
<&gcc GCC_BIMC_GFX_CLK>,
|
||||
<&gcc GCC_GPU_BIMC_GFX_CLK>;
|
||||
clock-names = "iface", "mem", "mem_iface";
|
||||
clock-names = "iface",
|
||||
"mem",
|
||||
"mem_iface";
|
||||
#global-interrupts = <2>;
|
||||
#iommu-cells = <1>;
|
||||
|
||||
@@ -1288,20 +1270,16 @@
|
||||
<&gcc GCC_USB30_MASTER_CLK>,
|
||||
<&gcc GCC_AGGRE2_USB3_AXI_CLK>,
|
||||
<&gcc GCC_USB30_SLEEP_CLK>,
|
||||
<&gcc GCC_USB30_MOCK_UTMI_CLK>,
|
||||
<&rpmcc RPM_SMD_AGGR2_NOC_CLK>;
|
||||
<&gcc GCC_USB30_MOCK_UTMI_CLK>;
|
||||
clock-names = "cfg_noc",
|
||||
"core",
|
||||
"iface",
|
||||
"sleep",
|
||||
"mock_utmi",
|
||||
"bus";
|
||||
"mock_utmi";
|
||||
|
||||
assigned-clocks = <&gcc GCC_USB30_MOCK_UTMI_CLK>,
|
||||
<&gcc GCC_USB30_MASTER_CLK>,
|
||||
<&rpmcc RPM_SMD_AGGR2_NOC_CLK>;
|
||||
assigned-clock-rates = <19200000>, <120000000>,
|
||||
<19200000>;
|
||||
<&gcc GCC_USB30_MASTER_CLK>;
|
||||
assigned-clock-rates = <19200000>, <120000000>;
|
||||
|
||||
interrupts = <GIC_SPI 347 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 243 IRQ_TYPE_LEVEL_HIGH>;
|
||||
@@ -2204,10 +2182,9 @@
|
||||
|
||||
clocks = <&mmcc MNOC_AHB_CLK>,
|
||||
<&mmcc BIMC_SMMU_AHB_CLK>,
|
||||
<&rpmcc RPM_SMD_MMSSNOC_AXI_CLK>,
|
||||
<&mmcc BIMC_SMMU_AXI_CLK>;
|
||||
clock-names = "iface-mm", "iface-smmu",
|
||||
"bus-mm", "bus-smmu";
|
||||
"bus-smmu";
|
||||
#global-interrupts = <2>;
|
||||
#iommu-cells = <1>;
|
||||
|
||||
@@ -2324,12 +2301,6 @@
|
||||
compatible = "qcom,sdm660-gnoc";
|
||||
reg = <0x17900000 0xe000>;
|
||||
#interconnect-cells = <1>;
|
||||
/*
|
||||
* This one apparently features no clocks,
|
||||
* so let's not mess with the driver needlessly
|
||||
*/
|
||||
clock-names = "bus", "bus_a";
|
||||
clocks = <&xo_board>, <&xo_board>;
|
||||
};
|
||||
|
||||
apcs_glb: mailbox@17911000 {
|
||||
|
||||
@@ -23,9 +23,9 @@ static int stderr_id;
|
||||
static struct tty_port nfcon_tty_port;
|
||||
static struct tty_driver *nfcon_tty_driver;
|
||||
|
||||
static void nfputs(const char *str, unsigned int count)
|
||||
static void nfputs(const u8 *str, size_t count)
|
||||
{
|
||||
char buf[68];
|
||||
u8 buf[68];
|
||||
unsigned long phys = virt_to_phys(buf);
|
||||
|
||||
buf[64] = 0;
|
||||
|
||||
@@ -21,8 +21,8 @@
|
||||
* Vio firmware always attempts to fetch MAX_VIO_GET_CHARS chars. The 'count'
|
||||
* parm is included to conform to put_chars() function pointer template
|
||||
*/
|
||||
extern int hvc_get_chars(uint32_t vtermno, char *buf, int count);
|
||||
extern int hvc_put_chars(uint32_t vtermno, const char *buf, int count);
|
||||
extern ssize_t hvc_get_chars(uint32_t vtermno, u8 *buf, size_t count);
|
||||
extern ssize_t hvc_put_chars(uint32_t vtermno, const u8 *buf, size_t count);
|
||||
|
||||
/* Provided by HVC VIO */
|
||||
void hvc_vio_init_early(void);
|
||||
|
||||
@@ -64,7 +64,7 @@ struct hvsi_priv {
|
||||
unsigned int inbuf_len; /* data in input buffer */
|
||||
unsigned char inbuf[HVSI_INBUF_SIZE];
|
||||
unsigned int inbuf_cur; /* Cursor in input buffer */
|
||||
unsigned int inbuf_pktlen; /* packet length from cursor */
|
||||
size_t inbuf_pktlen; /* packet length from cursor */
|
||||
atomic_t seqno; /* packet sequence number */
|
||||
unsigned int opened:1; /* driver opened */
|
||||
unsigned int established:1; /* protocol established */
|
||||
@@ -72,24 +72,26 @@ struct hvsi_priv {
|
||||
unsigned int mctrl_update:1; /* modem control updated */
|
||||
unsigned short mctrl; /* modem control */
|
||||
struct tty_struct *tty; /* tty structure */
|
||||
int (*get_chars)(uint32_t termno, char *buf, int count);
|
||||
int (*put_chars)(uint32_t termno, const char *buf, int count);
|
||||
ssize_t (*get_chars)(uint32_t termno, u8 *buf, size_t count);
|
||||
ssize_t (*put_chars)(uint32_t termno, const u8 *buf, size_t count);
|
||||
uint32_t termno;
|
||||
};
|
||||
|
||||
/* hvsi lib functions */
|
||||
struct hvc_struct;
|
||||
extern void hvsilib_init(struct hvsi_priv *pv,
|
||||
int (*get_chars)(uint32_t termno, char *buf, int count),
|
||||
int (*put_chars)(uint32_t termno, const char *buf,
|
||||
int count),
|
||||
ssize_t (*get_chars)(uint32_t termno, u8 *buf,
|
||||
size_t count),
|
||||
ssize_t (*put_chars)(uint32_t termno, const u8 *buf,
|
||||
size_t count),
|
||||
int termno, int is_console);
|
||||
extern int hvsilib_open(struct hvsi_priv *pv, struct hvc_struct *hp);
|
||||
extern void hvsilib_close(struct hvsi_priv *pv, struct hvc_struct *hp);
|
||||
extern int hvsilib_read_mctrl(struct hvsi_priv *pv);
|
||||
extern int hvsilib_write_mctrl(struct hvsi_priv *pv, int dtr);
|
||||
extern void hvsilib_establish(struct hvsi_priv *pv);
|
||||
extern int hvsilib_get_chars(struct hvsi_priv *pv, char *buf, int count);
|
||||
extern int hvsilib_put_chars(struct hvsi_priv *pv, const char *buf, int count);
|
||||
extern ssize_t hvsilib_get_chars(struct hvsi_priv *pv, u8 *buf, size_t count);
|
||||
extern ssize_t hvsilib_put_chars(struct hvsi_priv *pv, const u8 *buf,
|
||||
size_t count);
|
||||
|
||||
#endif /* _HVSI_H */
|
||||
|
||||
@@ -313,9 +313,11 @@ extern int early_init_dt_scan_recoverable_ranges(unsigned long node,
|
||||
const char *uname, int depth, void *data);
|
||||
void __init opal_configure_cores(void);
|
||||
|
||||
extern int opal_get_chars(uint32_t vtermno, char *buf, int count);
|
||||
extern int opal_put_chars(uint32_t vtermno, const char *buf, int total_len);
|
||||
extern int opal_put_chars_atomic(uint32_t vtermno, const char *buf, int total_len);
|
||||
extern ssize_t opal_get_chars(uint32_t vtermno, u8 *buf, size_t count);
|
||||
extern ssize_t opal_put_chars(uint32_t vtermno, const u8 *buf,
|
||||
size_t total_len);
|
||||
extern ssize_t opal_put_chars_atomic(uint32_t vtermno, const u8 *buf,
|
||||
size_t total_len);
|
||||
extern int opal_flush_chars(uint32_t vtermno, bool wait);
|
||||
extern int opal_flush_console(uint32_t vtermno);
|
||||
|
||||
|
||||
@@ -424,7 +424,7 @@ static int __init opal_message_init(struct device_node *opal_node)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int opal_get_chars(uint32_t vtermno, char *buf, int count)
|
||||
ssize_t opal_get_chars(uint32_t vtermno, u8 *buf, size_t count)
|
||||
{
|
||||
s64 rc;
|
||||
__be64 evt, len;
|
||||
@@ -441,10 +441,11 @@ int opal_get_chars(uint32_t vtermno, char *buf, int count)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __opal_put_chars(uint32_t vtermno, const char *data, int total_len, bool atomic)
|
||||
static ssize_t __opal_put_chars(uint32_t vtermno, const u8 *data,
|
||||
size_t total_len, bool atomic)
|
||||
{
|
||||
unsigned long flags = 0 /* shut up gcc */;
|
||||
int written;
|
||||
ssize_t written;
|
||||
__be64 olen;
|
||||
s64 rc;
|
||||
|
||||
@@ -484,7 +485,7 @@ static int __opal_put_chars(uint32_t vtermno, const char *data, int total_len, b
|
||||
if (atomic) {
|
||||
/* Should not happen */
|
||||
pr_warn("atomic console write returned partial "
|
||||
"len=%d written=%d\n", total_len, written);
|
||||
"len=%zu written=%zd\n", total_len, written);
|
||||
}
|
||||
if (!written)
|
||||
written = -EAGAIN;
|
||||
@@ -497,7 +498,7 @@ out:
|
||||
return written;
|
||||
}
|
||||
|
||||
int opal_put_chars(uint32_t vtermno, const char *data, int total_len)
|
||||
ssize_t opal_put_chars(uint32_t vtermno, const u8 *data, size_t total_len)
|
||||
{
|
||||
return __opal_put_chars(vtermno, data, total_len, false);
|
||||
}
|
||||
@@ -508,7 +509,8 @@ int opal_put_chars(uint32_t vtermno, const char *data, int total_len)
|
||||
* true at the moment because console space can race with OPAL's console
|
||||
* writes.
|
||||
*/
|
||||
int opal_put_chars_atomic(uint32_t vtermno, const char *data, int total_len)
|
||||
ssize_t opal_put_chars_atomic(uint32_t vtermno, const u8 *data,
|
||||
size_t total_len)
|
||||
{
|
||||
return __opal_put_chars(vtermno, data, total_len, true);
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
* firmware.
|
||||
* @count: not used?
|
||||
*/
|
||||
int hvc_get_chars(uint32_t vtermno, char *buf, int count)
|
||||
ssize_t hvc_get_chars(uint32_t vtermno, u8 *buf, size_t count)
|
||||
{
|
||||
long ret;
|
||||
unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
|
||||
@@ -52,7 +52,7 @@ EXPORT_SYMBOL(hvc_get_chars);
|
||||
* firmware. Must be at least 16 bytes, even if count is less than 16.
|
||||
* @count: Send this number of characters.
|
||||
*/
|
||||
int hvc_put_chars(uint32_t vtermno, const char *buf, int count)
|
||||
ssize_t hvc_put_chars(uint32_t vtermno, const u8 *buf, size_t count)
|
||||
{
|
||||
unsigned long *lbuf = (unsigned long *) buf;
|
||||
long ret;
|
||||
|
||||
@@ -30,7 +30,7 @@ struct chan {
|
||||
extern void chan_interrupt(struct line *line, int irq);
|
||||
extern int parse_chan_pair(char *str, struct line *line, int device,
|
||||
const struct chan_opts *opts, char **error_out);
|
||||
extern int write_chan(struct chan *chan, const char *buf, int len,
|
||||
extern int write_chan(struct chan *chan, const u8 *buf, size_t len,
|
||||
int write_irq);
|
||||
extern int console_write_chan(struct chan *chan, const char *buf,
|
||||
int len);
|
||||
|
||||
@@ -33,14 +33,14 @@ static void not_configged_close(int fd, void *data)
|
||||
"UML\n");
|
||||
}
|
||||
|
||||
static int not_configged_read(int fd, char *c_out, void *data)
|
||||
static int not_configged_read(int fd, u8 *c_out, void *data)
|
||||
{
|
||||
printk(KERN_ERR "Using a channel type which is configured out of "
|
||||
"UML\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
static int not_configged_write(int fd, const char *buf, int len, void *data)
|
||||
static int not_configged_write(int fd, const u8 *buf, size_t len, void *data)
|
||||
{
|
||||
printk(KERN_ERR "Using a channel type which is configured out of "
|
||||
"UML\n");
|
||||
@@ -247,8 +247,7 @@ void deactivate_chan(struct chan *chan, int irq)
|
||||
deactivate_fd(chan->fd, irq);
|
||||
}
|
||||
|
||||
int write_chan(struct chan *chan, const char *buf, int len,
|
||||
int write_irq)
|
||||
int write_chan(struct chan *chan, const u8 *buf, size_t len, int write_irq)
|
||||
{
|
||||
int n, ret = 0;
|
||||
|
||||
@@ -540,7 +539,7 @@ void chan_interrupt(struct line *line, int irq)
|
||||
struct tty_port *port = &line->port;
|
||||
struct chan *chan = line->chan_in;
|
||||
int err;
|
||||
char c;
|
||||
u8 c;
|
||||
|
||||
if (!chan || !chan->ops->read)
|
||||
goto out;
|
||||
|
||||
@@ -19,7 +19,7 @@ void generic_close(int fd, void *unused)
|
||||
close(fd);
|
||||
}
|
||||
|
||||
int generic_read(int fd, char *c_out, void *unused)
|
||||
int generic_read(int fd, __u8 *c_out, void *unused)
|
||||
{
|
||||
int n;
|
||||
|
||||
@@ -35,7 +35,7 @@ int generic_read(int fd, char *c_out, void *unused)
|
||||
|
||||
/* XXX Trivial wrapper around write */
|
||||
|
||||
int generic_write(int fd, const char *buf, int n, void *unused)
|
||||
int generic_write(int fd, const __u8 *buf, size_t n, void *unused)
|
||||
{
|
||||
int err;
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#define __CHAN_USER_H__
|
||||
|
||||
#include <init.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
struct chan_opts {
|
||||
void (*const announce)(char *dev_name, int dev);
|
||||
@@ -19,8 +20,8 @@ struct chan_ops {
|
||||
void *(*init)(char *, int, const struct chan_opts *);
|
||||
int (*open)(int, int, int, void *, char **);
|
||||
void (*close)(int, void *);
|
||||
int (*read)(int, char *, void *);
|
||||
int (*write)(int, const char *, int, void *);
|
||||
int (*read)(int, __u8 *, void *);
|
||||
int (*write)(int, const __u8 *, size_t, void *);
|
||||
int (*console_write)(int, const char *, int);
|
||||
int (*window_size)(int, void *, unsigned short *, unsigned short *);
|
||||
void (*free)(void *);
|
||||
@@ -31,8 +32,8 @@ extern const struct chan_ops fd_ops, null_ops, port_ops, pts_ops, pty_ops,
|
||||
tty_ops, xterm_ops;
|
||||
|
||||
extern void generic_close(int fd, void *unused);
|
||||
extern int generic_read(int fd, char *c_out, void *unused);
|
||||
extern int generic_write(int fd, const char *buf, int n, void *unused);
|
||||
extern int generic_read(int fd, __u8 *c_out, void *unused);
|
||||
extern int generic_write(int fd, const __u8 *buf, size_t n, void *unused);
|
||||
extern int generic_console_write(int fd, const char *buf, int n);
|
||||
extern int generic_window_size(int fd, void *unused, unsigned short *rows_out,
|
||||
unsigned short *cols_out);
|
||||
|
||||
@@ -83,7 +83,7 @@ unsigned int line_chars_in_buffer(struct tty_struct *tty)
|
||||
*
|
||||
* Must be called while holding line->lock!
|
||||
*/
|
||||
static int buffer_data(struct line *line, const char *buf, int len)
|
||||
static int buffer_data(struct line *line, const u8 *buf, size_t len)
|
||||
{
|
||||
int end, room;
|
||||
|
||||
|
||||
@@ -47,9 +47,9 @@ struct line {
|
||||
*
|
||||
* buffer points to a buffer allocated on demand, of length
|
||||
* LINE_BUFSIZE, head to the start of the ring, tail to the end.*/
|
||||
char *buffer;
|
||||
char *head;
|
||||
char *tail;
|
||||
u8 *buffer;
|
||||
u8 *head;
|
||||
u8 *tail;
|
||||
|
||||
int sigio;
|
||||
struct delayed_work task;
|
||||
|
||||
@@ -28,7 +28,7 @@ static int null_open(int input, int output, int primary, void *d,
|
||||
return (fd < 0) ? -errno : fd;
|
||||
}
|
||||
|
||||
static int null_read(int fd, char *c_out, void *unused)
|
||||
static int null_read(int fd, __u8 *c_out, void *unused)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@ static void rs_poll(struct timer_list *unused)
|
||||
struct tty_port *port = &serial_port;
|
||||
int i = 0;
|
||||
int rd = 1;
|
||||
unsigned char c;
|
||||
u8 c;
|
||||
|
||||
while (simc_poll(0)) {
|
||||
rd = simc_read(0, &c, 1);
|
||||
|
||||
@@ -383,8 +383,8 @@ static void btmtkuart_recv(struct hci_dev *hdev, const u8 *data, size_t count)
|
||||
}
|
||||
}
|
||||
|
||||
static int btmtkuart_receive_buf(struct serdev_device *serdev, const u8 *data,
|
||||
size_t count)
|
||||
static ssize_t btmtkuart_receive_buf(struct serdev_device *serdev,
|
||||
const u8 *data, size_t count)
|
||||
{
|
||||
struct btmtkuart_dev *bdev = serdev_device_get_drvdata(serdev);
|
||||
|
||||
|
||||
@@ -1264,8 +1264,8 @@ static const struct h4_recv_pkt nxp_recv_pkts[] = {
|
||||
{ NXP_RECV_FW_REQ_V3, .recv = nxp_recv_fw_req_v3 },
|
||||
};
|
||||
|
||||
static int btnxpuart_receive_buf(struct serdev_device *serdev, const u8 *data,
|
||||
size_t count)
|
||||
static ssize_t btnxpuart_receive_buf(struct serdev_device *serdev,
|
||||
const u8 *data, size_t count)
|
||||
{
|
||||
struct btnxpuart_dev *nxpdev = serdev_device_get_drvdata(serdev);
|
||||
|
||||
|
||||
@@ -4796,10 +4796,8 @@ static struct usb_driver btusb_driver = {
|
||||
.disable_hub_initiated_lpm = 1,
|
||||
|
||||
#ifdef CONFIG_DEV_COREDUMP
|
||||
.drvwrap = {
|
||||
.driver = {
|
||||
.coredump = btusb_coredump,
|
||||
},
|
||||
.driver = {
|
||||
.coredump = btusb_coredump,
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -271,8 +271,8 @@ static void hci_uart_write_wakeup(struct serdev_device *serdev)
|
||||
*
|
||||
* Return: number of processed bytes
|
||||
*/
|
||||
static int hci_uart_receive_buf(struct serdev_device *serdev, const u8 *data,
|
||||
size_t count)
|
||||
static ssize_t hci_uart_receive_buf(struct serdev_device *serdev,
|
||||
const u8 *data, size_t count)
|
||||
{
|
||||
struct hci_uart *hu = serdev_device_get_drvdata(serdev);
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ static struct ttyprintk_port tpk_port;
|
||||
|
||||
static int tpk_curr;
|
||||
|
||||
static char tpk_buffer[TPK_STR_SIZE + 4];
|
||||
static u8 tpk_buffer[TPK_STR_SIZE + 4];
|
||||
|
||||
static void tpk_flush(void)
|
||||
{
|
||||
@@ -51,9 +51,9 @@ static void tpk_flush(void)
|
||||
}
|
||||
}
|
||||
|
||||
static int tpk_printk(const u8 *buf, int count)
|
||||
static int tpk_printk(const u8 *buf, size_t count)
|
||||
{
|
||||
int i;
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
if (tpk_curr >= TPK_STR_SIZE) {
|
||||
|
||||
@@ -230,9 +230,6 @@ struct port {
|
||||
bool guest_connected;
|
||||
};
|
||||
|
||||
/* This is the very early arch-specified put chars function. */
|
||||
static int (*early_put_chars)(u32, const char *, int);
|
||||
|
||||
static struct port *find_port_by_vtermno(u32 vtermno)
|
||||
{
|
||||
struct port *port;
|
||||
@@ -653,7 +650,7 @@ done:
|
||||
* Give out the data that's requested from the buffer that we have
|
||||
* queued up.
|
||||
*/
|
||||
static ssize_t fill_readbuf(struct port *port, char __user *out_buf,
|
||||
static ssize_t fill_readbuf(struct port *port, u8 __user *out_buf,
|
||||
size_t out_count, bool to_user)
|
||||
{
|
||||
struct port_buffer *buf;
|
||||
@@ -672,7 +669,7 @@ static ssize_t fill_readbuf(struct port *port, char __user *out_buf,
|
||||
if (ret)
|
||||
return -EFAULT;
|
||||
} else {
|
||||
memcpy((__force char *)out_buf, buf->buf + buf->offset,
|
||||
memcpy((__force u8 *)out_buf, buf->buf + buf->offset,
|
||||
out_count);
|
||||
}
|
||||
|
||||
@@ -1107,16 +1104,13 @@ static const struct file_operations port_fops = {
|
||||
* it to finish: inefficient in theory, but in practice
|
||||
* implementations will do it immediately.
|
||||
*/
|
||||
static int put_chars(u32 vtermno, const char *buf, int count)
|
||||
static ssize_t put_chars(u32 vtermno, const u8 *buf, size_t count)
|
||||
{
|
||||
struct port *port;
|
||||
struct scatterlist sg[1];
|
||||
void *data;
|
||||
int ret;
|
||||
|
||||
if (unlikely(early_put_chars))
|
||||
return early_put_chars(vtermno, buf, count);
|
||||
|
||||
port = find_port_by_vtermno(vtermno);
|
||||
if (!port)
|
||||
return -EPIPE;
|
||||
@@ -1138,14 +1132,10 @@ static int put_chars(u32 vtermno, const char *buf, int count)
|
||||
* We call out to fill_readbuf that gets us the required data from the
|
||||
* buffers that are queued up.
|
||||
*/
|
||||
static int get_chars(u32 vtermno, char *buf, int count)
|
||||
static ssize_t get_chars(u32 vtermno, u8 *buf, size_t count)
|
||||
{
|
||||
struct port *port;
|
||||
|
||||
/* If we've not set up the port yet, we have no input to give. */
|
||||
if (unlikely(early_put_chars))
|
||||
return 0;
|
||||
|
||||
port = find_port_by_vtermno(vtermno);
|
||||
if (!port)
|
||||
return -EPIPE;
|
||||
@@ -1153,7 +1143,7 @@ static int get_chars(u32 vtermno, char *buf, int count)
|
||||
/* If we don't have an input queue yet, we can't get input. */
|
||||
BUG_ON(!port->in_vq);
|
||||
|
||||
return fill_readbuf(port, (__force char __user *)buf, count, false);
|
||||
return fill_readbuf(port, (__force u8 __user *)buf, count, false);
|
||||
}
|
||||
|
||||
static void resize_console(struct port *port)
|
||||
@@ -1201,21 +1191,6 @@ static const struct hv_ops hv_ops = {
|
||||
.notifier_hangup = notifier_del_vio,
|
||||
};
|
||||
|
||||
/*
|
||||
* Console drivers are initialized very early so boot messages can go
|
||||
* out, so we do things slightly differently from the generic virtio
|
||||
* initialization of the net and block drivers.
|
||||
*
|
||||
* At this stage, the console is output-only. It's too early to set
|
||||
* up a virtqueue, so we let the drivers do some boutique early-output
|
||||
* thing.
|
||||
*/
|
||||
int __init virtio_cons_early_init(int (*put_chars)(u32, const char *, int))
|
||||
{
|
||||
early_put_chars = put_chars;
|
||||
return hvc_instantiate(0, 0, &hv_ops);
|
||||
}
|
||||
|
||||
static int init_port_console(struct port *port)
|
||||
{
|
||||
int ret;
|
||||
@@ -1256,13 +1231,6 @@ static int init_port_console(struct port *port)
|
||||
spin_unlock_irq(&pdrvdata_lock);
|
||||
port->guest_connected = true;
|
||||
|
||||
/*
|
||||
* Start using the new console output if this is the first
|
||||
* console to come up.
|
||||
*/
|
||||
if (early_put_chars)
|
||||
early_put_chars = NULL;
|
||||
|
||||
/* Notify host of port being opened */
|
||||
send_control_msg(port, VIRTIO_CONSOLE_PORT_OPEN, 1);
|
||||
|
||||
@@ -1999,7 +1967,6 @@ static int virtcons_probe(struct virtio_device *vdev)
|
||||
struct ports_device *portdev;
|
||||
int err;
|
||||
bool multiport;
|
||||
bool early = early_put_chars != NULL;
|
||||
|
||||
/* We only need a config space if features are offered */
|
||||
if (!vdev->config->get &&
|
||||
@@ -2010,9 +1977,6 @@ static int virtcons_probe(struct virtio_device *vdev)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Ensure to read early_put_chars now */
|
||||
barrier();
|
||||
|
||||
portdev = kmalloc(sizeof(*portdev), GFP_KERNEL);
|
||||
if (!portdev) {
|
||||
err = -ENOMEM;
|
||||
@@ -2100,18 +2064,6 @@ static int virtcons_probe(struct virtio_device *vdev)
|
||||
__send_control_msg(portdev, VIRTIO_CONSOLE_BAD_ID,
|
||||
VIRTIO_CONSOLE_DEVICE_READY, 1);
|
||||
|
||||
/*
|
||||
* If there was an early virtio console, assume that there are no
|
||||
* other consoles. We need to wait until the hvc_alloc matches the
|
||||
* hvc_instantiate, otherwise tty_open will complain, resulting in
|
||||
* a "Warning: unable to open an initial console" boot failure.
|
||||
* Without multiport this is done in add_port above. With multiport
|
||||
* this might take some host<->guest communication - thus we have to
|
||||
* wait.
|
||||
*/
|
||||
if (multiport && early)
|
||||
wait_for_completion(&early_console_added);
|
||||
|
||||
return 0;
|
||||
|
||||
free_chrdev:
|
||||
|
||||
@@ -80,8 +80,8 @@ static const struct gnss_operations gnss_serial_gnss_ops = {
|
||||
.write_raw = gnss_serial_write_raw,
|
||||
};
|
||||
|
||||
static int gnss_serial_receive_buf(struct serdev_device *serdev,
|
||||
const unsigned char *buf, size_t count)
|
||||
static ssize_t gnss_serial_receive_buf(struct serdev_device *serdev,
|
||||
const u8 *buf, size_t count)
|
||||
{
|
||||
struct gnss_serial *gserial = serdev_device_get_drvdata(serdev);
|
||||
struct gnss_device *gdev = gserial->gdev;
|
||||
|
||||
+2
-2
@@ -160,8 +160,8 @@ static const struct gnss_operations sirf_gnss_ops = {
|
||||
.write_raw = sirf_write_raw,
|
||||
};
|
||||
|
||||
static int sirf_receive_buf(struct serdev_device *serdev,
|
||||
const unsigned char *buf, size_t count)
|
||||
static ssize_t sirf_receive_buf(struct serdev_device *serdev,
|
||||
const u8 *buf, size_t count)
|
||||
{
|
||||
struct sirf_data *data = serdev_device_get_drvdata(serdev);
|
||||
struct gnss_device *gdev = data->gdev;
|
||||
|
||||
@@ -271,7 +271,7 @@ static void hdlc_rx_frame(struct gb_beagleplay *bg)
|
||||
}
|
||||
}
|
||||
|
||||
static int hdlc_rx(struct gb_beagleplay *bg, const u8 *data, size_t count)
|
||||
static ssize_t hdlc_rx(struct gb_beagleplay *bg, const u8 *data, size_t count)
|
||||
{
|
||||
size_t i;
|
||||
u8 c;
|
||||
@@ -331,7 +331,8 @@ static void hdlc_deinit(struct gb_beagleplay *bg)
|
||||
flush_work(&bg->tx_work);
|
||||
}
|
||||
|
||||
static int gb_tty_receive(struct serdev_device *sd, const unsigned char *data, size_t count)
|
||||
static ssize_t gb_tty_receive(struct serdev_device *sd, const u8 *data,
|
||||
size_t count)
|
||||
{
|
||||
struct gb_beagleplay *bg = serdev_device_get_drvdata(sd);
|
||||
|
||||
|
||||
@@ -211,13 +211,13 @@ static bool pms7003_frame_is_okay(struct pms7003_frame *frame)
|
||||
return checksum == pms7003_calc_checksum(frame);
|
||||
}
|
||||
|
||||
static int pms7003_receive_buf(struct serdev_device *serdev,
|
||||
const unsigned char *buf, size_t size)
|
||||
static ssize_t pms7003_receive_buf(struct serdev_device *serdev, const u8 *buf,
|
||||
size_t size)
|
||||
{
|
||||
struct iio_dev *indio_dev = serdev_device_get_drvdata(serdev);
|
||||
struct pms7003_state *state = iio_priv(indio_dev);
|
||||
struct pms7003_frame *frame = &state->frame;
|
||||
int num;
|
||||
size_t num;
|
||||
|
||||
if (!frame->expected_length) {
|
||||
u16 magic;
|
||||
|
||||
@@ -174,13 +174,13 @@ static int scd30_serdev_command(struct scd30_state *state, enum scd30_cmd cmd, u
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int scd30_serdev_receive_buf(struct serdev_device *serdev,
|
||||
const unsigned char *buf, size_t size)
|
||||
static ssize_t scd30_serdev_receive_buf(struct serdev_device *serdev,
|
||||
const u8 *buf, size_t size)
|
||||
{
|
||||
struct iio_dev *indio_dev = serdev_device_get_drvdata(serdev);
|
||||
struct scd30_serdev_priv *priv;
|
||||
struct scd30_state *state;
|
||||
int num;
|
||||
size_t num;
|
||||
|
||||
if (!indio_dev)
|
||||
return 0;
|
||||
|
||||
@@ -74,8 +74,8 @@ static int sps30_serial_xfer(struct sps30_state *state, const unsigned char *buf
|
||||
}
|
||||
|
||||
static const struct {
|
||||
unsigned char byte;
|
||||
unsigned char byte2;
|
||||
u8 byte;
|
||||
u8 byte2;
|
||||
} sps30_serial_bytes[] = {
|
||||
{ 0x11, 0x31 },
|
||||
{ 0x13, 0x33 },
|
||||
@@ -83,7 +83,7 @@ static const struct {
|
||||
{ 0x7d, 0x5d },
|
||||
};
|
||||
|
||||
static int sps30_serial_put_byte(unsigned char *buf, unsigned char byte)
|
||||
static int sps30_serial_put_byte(u8 *buf, u8 byte)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -102,7 +102,7 @@ static int sps30_serial_put_byte(unsigned char *buf, unsigned char byte)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static char sps30_serial_get_byte(bool escaped, unsigned char byte2)
|
||||
static u8 sps30_serial_get_byte(bool escaped, u8 byte2)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -130,8 +130,8 @@ static unsigned char sps30_serial_calc_chksum(const unsigned char *buf, size_t n
|
||||
return ~chksum;
|
||||
}
|
||||
|
||||
static int sps30_serial_prep_frame(unsigned char *buf, unsigned char cmd,
|
||||
const unsigned char *arg, size_t arg_size)
|
||||
static int sps30_serial_prep_frame(u8 *buf, u8 cmd, const u8 *arg,
|
||||
size_t arg_size)
|
||||
{
|
||||
unsigned char chksum;
|
||||
int num = 0;
|
||||
@@ -210,14 +210,14 @@ static int sps30_serial_command(struct sps30_state *state, unsigned char cmd,
|
||||
return rsp_size;
|
||||
}
|
||||
|
||||
static int sps30_serial_receive_buf(struct serdev_device *serdev,
|
||||
const unsigned char *buf, size_t size)
|
||||
static ssize_t sps30_serial_receive_buf(struct serdev_device *serdev,
|
||||
const u8 *buf, size_t size)
|
||||
{
|
||||
struct iio_dev *indio_dev = dev_get_drvdata(&serdev->dev);
|
||||
struct sps30_serial_priv *priv;
|
||||
struct sps30_state *state;
|
||||
unsigned char byte;
|
||||
size_t i;
|
||||
u8 byte;
|
||||
|
||||
if (!indio_dev)
|
||||
return 0;
|
||||
|
||||
@@ -378,12 +378,12 @@ static void bno055_ser_handle_rx(struct bno055_ser_priv *priv, int status)
|
||||
* Also, we assume to RX one pkt per time (i.e. the HW doesn't send anything
|
||||
* unless we require to AND we don't queue more than one request per time).
|
||||
*/
|
||||
static int bno055_ser_receive_buf(struct serdev_device *serdev,
|
||||
const unsigned char *buf, size_t size)
|
||||
static ssize_t bno055_ser_receive_buf(struct serdev_device *serdev,
|
||||
const u8 *buf, size_t size)
|
||||
{
|
||||
int status;
|
||||
struct bno055_ser_priv *priv = serdev_device_get_drvdata(serdev);
|
||||
int remaining = size;
|
||||
size_t remaining = size;
|
||||
|
||||
if (size == 0)
|
||||
return 0;
|
||||
|
||||
@@ -158,9 +158,7 @@ static int ipoctal_get_icount(struct tty_struct *tty,
|
||||
static void ipoctal_irq_rx(struct ipoctal_channel *channel, u8 sr)
|
||||
{
|
||||
struct tty_port *port = &channel->tty_port;
|
||||
unsigned char value;
|
||||
unsigned char flag;
|
||||
u8 isr;
|
||||
u8 isr, value, flag;
|
||||
|
||||
do {
|
||||
value = ioread8(&channel->regs->r.rhr);
|
||||
@@ -202,8 +200,8 @@ static void ipoctal_irq_rx(struct ipoctal_channel *channel, u8 sr)
|
||||
|
||||
static void ipoctal_irq_tx(struct ipoctal_channel *channel)
|
||||
{
|
||||
unsigned char value;
|
||||
unsigned int *pointer_write = &channel->pointer_write;
|
||||
u8 value;
|
||||
|
||||
if (channel->nb_bytes == 0)
|
||||
return;
|
||||
@@ -436,11 +434,11 @@ err_put_driver:
|
||||
return res;
|
||||
}
|
||||
|
||||
static inline int ipoctal_copy_write_buffer(struct ipoctal_channel *channel,
|
||||
const u8 *buf, int count)
|
||||
static inline size_t ipoctal_copy_write_buffer(struct ipoctal_channel *channel,
|
||||
const u8 *buf, size_t count)
|
||||
{
|
||||
unsigned long flags;
|
||||
int i;
|
||||
size_t i;
|
||||
unsigned int *pointer_read = &channel->pointer_read;
|
||||
|
||||
/* Copy the bytes from the user buffer to the internal one */
|
||||
@@ -462,7 +460,7 @@ static ssize_t ipoctal_write_tty(struct tty_struct *tty, const u8 *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct ipoctal_channel *channel = tty->driver_data;
|
||||
unsigned int char_copied;
|
||||
size_t char_copied;
|
||||
|
||||
char_copied = ipoctal_copy_write_buffer(channel, buf, count);
|
||||
|
||||
|
||||
@@ -1231,9 +1231,9 @@ static void capinc_tty_hangup(struct tty_struct *tty)
|
||||
tty_port_hangup(&mp->port);
|
||||
}
|
||||
|
||||
static void capinc_tty_send_xchar(struct tty_struct *tty, char ch)
|
||||
static void capinc_tty_send_xchar(struct tty_struct *tty, u8 ch)
|
||||
{
|
||||
pr_debug("capinc_tty_send_xchar(%d)\n", ch);
|
||||
pr_debug("capinc_tty_send_xchar(%u)\n", ch);
|
||||
}
|
||||
|
||||
static const struct tty_operations capinc_ops = {
|
||||
|
||||
@@ -471,17 +471,17 @@ static void rave_sp_receive_frame(struct rave_sp *sp,
|
||||
rave_sp_receive_reply(sp, data, length);
|
||||
}
|
||||
|
||||
static int rave_sp_receive_buf(struct serdev_device *serdev,
|
||||
const unsigned char *buf, size_t size)
|
||||
static ssize_t rave_sp_receive_buf(struct serdev_device *serdev,
|
||||
const u8 *buf, size_t size)
|
||||
{
|
||||
struct device *dev = &serdev->dev;
|
||||
struct rave_sp *sp = dev_get_drvdata(dev);
|
||||
struct rave_sp_deframer *deframer = &sp->deframer;
|
||||
const unsigned char *src = buf;
|
||||
const unsigned char *end = buf + size;
|
||||
const u8 *src = buf;
|
||||
const u8 *end = buf + size;
|
||||
|
||||
while (src < end) {
|
||||
const unsigned char byte = *src++;
|
||||
const u8 byte = *src++;
|
||||
|
||||
switch (deframer->state) {
|
||||
case RAVE_SP_EXPECT_SOF:
|
||||
|
||||
@@ -64,9 +64,9 @@ static void bcm_vk_tty_wq_handler(struct work_struct *work)
|
||||
struct bcm_vk_tty *vktty;
|
||||
int card_status;
|
||||
int count;
|
||||
unsigned char c;
|
||||
int i;
|
||||
int wr;
|
||||
u8 c;
|
||||
|
||||
card_status = vkread32(vk, BAR_0, BAR_CARD_STATUS);
|
||||
if (BCM_VK_INTF_IS_DOWN(card_status))
|
||||
@@ -192,7 +192,7 @@ static ssize_t bcm_vk_tty_write(struct tty_struct *tty, const u8 *buffer,
|
||||
int index;
|
||||
struct bcm_vk *vk;
|
||||
struct bcm_vk_tty *vktty;
|
||||
int i;
|
||||
size_t i;
|
||||
|
||||
index = tty->index;
|
||||
vk = dev_get_drvdata(tty->dev);
|
||||
|
||||
@@ -178,11 +178,9 @@ static inline void sdio_uart_release_func(struct sdio_uart_port *port)
|
||||
sdio_release_host(port->func);
|
||||
}
|
||||
|
||||
static inline unsigned int sdio_in(struct sdio_uart_port *port, int offset)
|
||||
static inline u8 sdio_in(struct sdio_uart_port *port, int offset)
|
||||
{
|
||||
unsigned char c;
|
||||
c = sdio_readb(port->func, port->regs_offset + offset, NULL);
|
||||
return c;
|
||||
return sdio_readb(port->func, port->regs_offset + offset, NULL);
|
||||
}
|
||||
|
||||
static inline void sdio_out(struct sdio_uart_port *port, int offset, int value)
|
||||
@@ -192,8 +190,8 @@ static inline void sdio_out(struct sdio_uart_port *port, int offset, int value)
|
||||
|
||||
static unsigned int sdio_uart_get_mctrl(struct sdio_uart_port *port)
|
||||
{
|
||||
unsigned char status;
|
||||
unsigned int ret;
|
||||
u8 status;
|
||||
|
||||
/* FIXME: What stops this losing the delta bits and breaking
|
||||
sdio_uart_check_modem_status ? */
|
||||
@@ -354,15 +352,13 @@ static void sdio_uart_stop_rx(struct sdio_uart_port *port)
|
||||
sdio_out(port, UART_IER, port->ier);
|
||||
}
|
||||
|
||||
static void sdio_uart_receive_chars(struct sdio_uart_port *port,
|
||||
unsigned int *status)
|
||||
static void sdio_uart_receive_chars(struct sdio_uart_port *port, u8 *status)
|
||||
{
|
||||
unsigned int ch, flag;
|
||||
int max_count = 256;
|
||||
|
||||
do {
|
||||
ch = sdio_in(port, UART_RX);
|
||||
flag = TTY_NORMAL;
|
||||
u8 ch = sdio_in(port, UART_RX);
|
||||
u8 flag = TTY_NORMAL;
|
||||
port->icount.rx++;
|
||||
|
||||
if (unlikely(*status & (UART_LSR_BI | UART_LSR_PE |
|
||||
@@ -449,8 +445,8 @@ static void sdio_uart_transmit_chars(struct sdio_uart_port *port)
|
||||
|
||||
static void sdio_uart_check_modem_status(struct sdio_uart_port *port)
|
||||
{
|
||||
int status;
|
||||
struct tty_struct *tty;
|
||||
u8 status;
|
||||
|
||||
status = sdio_in(port, UART_MSR);
|
||||
|
||||
@@ -499,7 +495,7 @@ static void sdio_uart_check_modem_status(struct sdio_uart_port *port)
|
||||
static void sdio_uart_irq(struct sdio_func *func)
|
||||
{
|
||||
struct sdio_uart_port *port = sdio_get_drvdata(func);
|
||||
unsigned int iir, lsr;
|
||||
u8 iir, lsr;
|
||||
|
||||
/*
|
||||
* In a few places sdio_uart_irq() is called directly instead of
|
||||
@@ -795,7 +791,7 @@ static unsigned int sdio_uart_chars_in_buffer(struct tty_struct *tty)
|
||||
return kfifo_len(&port->xmit_fifo);
|
||||
}
|
||||
|
||||
static void sdio_uart_send_xchar(struct tty_struct *tty, char ch)
|
||||
static void sdio_uart_send_xchar(struct tty_struct *tty, u8 ch)
|
||||
{
|
||||
struct sdio_uart_port *port = tty->driver_data;
|
||||
|
||||
|
||||
@@ -1143,7 +1143,7 @@ static void __exit peak_usb_exit(void)
|
||||
int err;
|
||||
|
||||
/* last chance do send any synchronous commands here */
|
||||
err = driver_for_each_device(&peak_usb_driver.drvwrap.driver, NULL,
|
||||
err = driver_for_each_device(&peak_usb_driver.driver, NULL,
|
||||
NULL, peak_usb_do_device_exit);
|
||||
if (err)
|
||||
pr_err("%s: failed to stop all can devices (err %d)\n",
|
||||
|
||||
@@ -58,9 +58,8 @@ struct qcauart {
|
||||
unsigned char *tx_buffer;
|
||||
};
|
||||
|
||||
static int
|
||||
qca_tty_receive(struct serdev_device *serdev, const unsigned char *data,
|
||||
size_t count)
|
||||
static ssize_t
|
||||
qca_tty_receive(struct serdev_device *serdev, const u8 *data, size_t count)
|
||||
{
|
||||
struct qcauart *qca = serdev_device_get_drvdata(serdev);
|
||||
struct net_device *netdev = qca->net_dev;
|
||||
|
||||
@@ -363,7 +363,6 @@ static int disable_net;
|
||||
/* driver info */
|
||||
static const char driver_name[] = "hso";
|
||||
static const char tty_filename[] = "ttyHS";
|
||||
static const char *version = __FILE__ ": " MOD_AUTHOR;
|
||||
/* the usb driver itself (registered in hso_init) */
|
||||
static struct usb_driver hso_driver;
|
||||
/* serial structures */
|
||||
@@ -3228,16 +3227,8 @@ static struct usb_driver hso_driver = {
|
||||
|
||||
static int __init hso_init(void)
|
||||
{
|
||||
int i;
|
||||
int result;
|
||||
|
||||
/* put it in the log */
|
||||
pr_info("%s\n", version);
|
||||
|
||||
/* Initialise the serial table semaphore and table */
|
||||
for (i = 0; i < HSO_SERIAL_TTY_MINORS; i++)
|
||||
serial_table[i] = NULL;
|
||||
|
||||
/* allocate our driver using the proper amount of supported minors */
|
||||
tty_drv = tty_alloc_driver(HSO_SERIAL_TTY_MINORS, TTY_DRIVER_REAL_RAW |
|
||||
TTY_DRIVER_DYNAMIC_DEV);
|
||||
@@ -3285,8 +3276,6 @@ err_free_tty:
|
||||
|
||||
static void __exit hso_exit(void)
|
||||
{
|
||||
pr_info("unloaded\n");
|
||||
|
||||
tty_unregister_driver(tty_drv);
|
||||
/* deregister the usb driver */
|
||||
usb_deregister(&hso_driver);
|
||||
|
||||
+5
-11
@@ -10069,7 +10069,7 @@ static struct usb_driver rtl8152_driver = {
|
||||
.disable_hub_initiated_lpm = 1,
|
||||
};
|
||||
|
||||
static int rtl8152_cfgselector_probe(struct usb_device *udev)
|
||||
static int rtl8152_cfgselector_choose_configuration(struct usb_device *udev)
|
||||
{
|
||||
struct usb_host_config *c;
|
||||
int i, num_configs;
|
||||
@@ -10096,19 +10096,13 @@ static int rtl8152_cfgselector_probe(struct usb_device *udev)
|
||||
if (i == num_configs)
|
||||
return -ENODEV;
|
||||
|
||||
if (usb_set_configuration(udev, c->desc.bConfigurationValue)) {
|
||||
dev_err(&udev->dev, "Failed to set configuration %d\n",
|
||||
c->desc.bConfigurationValue);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return c->desc.bConfigurationValue;
|
||||
}
|
||||
|
||||
static struct usb_device_driver rtl8152_cfgselector_driver = {
|
||||
.name = MODULENAME "-cfgselector",
|
||||
.probe = rtl8152_cfgselector_probe,
|
||||
.id_table = rtl8152_table,
|
||||
.name = MODULENAME "-cfgselector",
|
||||
.choose_configuration = rtl8152_cfgselector_choose_configuration,
|
||||
.id_table = rtl8152_table,
|
||||
.generic_subclass = 1,
|
||||
.supports_autosuspend = 1,
|
||||
};
|
||||
|
||||
@@ -1581,7 +1581,7 @@ static int brcmf_usb_reset_device(struct device *dev, void *notused)
|
||||
|
||||
void brcmf_usb_exit(void)
|
||||
{
|
||||
struct device_driver *drv = &brcmf_usbdrvr.drvwrap.driver;
|
||||
struct device_driver *drv = &brcmf_usbdrvr.driver;
|
||||
int ret;
|
||||
|
||||
brcmf_dbg(USB, "Enter\n");
|
||||
|
||||
@@ -687,7 +687,7 @@ static struct usb_driver mwifiex_usb_driver = {
|
||||
.suspend = mwifiex_usb_suspend,
|
||||
.resume = mwifiex_usb_resume,
|
||||
.soft_unbind = 1,
|
||||
.drvwrap.driver = {
|
||||
.driver = {
|
||||
.coredump = mwifiex_usb_coredump,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -203,8 +203,8 @@ static int pn532_uart_rx_is_frame(struct sk_buff *skb)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pn532_receive_buf(struct serdev_device *serdev,
|
||||
const unsigned char *data, size_t count)
|
||||
static ssize_t pn532_receive_buf(struct serdev_device *serdev,
|
||||
const u8 *data, size_t count)
|
||||
{
|
||||
struct pn532_uart_phy *dev = serdev_device_get_drvdata(serdev);
|
||||
size_t i;
|
||||
|
||||
@@ -51,9 +51,8 @@ static const struct s3fwrn5_phy_ops uart_phy_ops = {
|
||||
.write = s3fwrn82_uart_write,
|
||||
};
|
||||
|
||||
static int s3fwrn82_uart_read(struct serdev_device *serdev,
|
||||
const unsigned char *data,
|
||||
size_t count)
|
||||
static ssize_t s3fwrn82_uart_read(struct serdev_device *serdev,
|
||||
const u8 *data, size_t count)
|
||||
{
|
||||
struct s3fwrn82_uart_phy *phy = serdev_device_get_drvdata(serdev);
|
||||
size_t i;
|
||||
|
||||
@@ -81,9 +81,8 @@ struct cros_ec_uart {
|
||||
struct response_info response;
|
||||
};
|
||||
|
||||
static int cros_ec_uart_rx_bytes(struct serdev_device *serdev,
|
||||
const u8 *data,
|
||||
size_t count)
|
||||
static ssize_t cros_ec_uart_rx_bytes(struct serdev_device *serdev,
|
||||
const u8 *data, size_t count)
|
||||
{
|
||||
struct ec_host_response *host_response;
|
||||
struct cros_ec_device *ec_dev = serdev_device_get_drvdata(serdev);
|
||||
|
||||
@@ -238,8 +238,8 @@ struct ssam_controller {
|
||||
* layer of the controller has been shut down, %-ESHUTDOWN.
|
||||
*/
|
||||
static inline
|
||||
int ssam_controller_receive_buf(struct ssam_controller *ctrl,
|
||||
const unsigned char *buf, size_t n)
|
||||
ssize_t ssam_controller_receive_buf(struct ssam_controller *ctrl, const u8 *buf,
|
||||
size_t n)
|
||||
{
|
||||
return ssh_ptl_rx_rcvbuf(&ctrl->rtl.ptl, buf, n);
|
||||
}
|
||||
|
||||
@@ -227,8 +227,8 @@ EXPORT_SYMBOL_GPL(ssam_client_bind);
|
||||
|
||||
/* -- Glue layer (serdev_device -> ssam_controller). ------------------------ */
|
||||
|
||||
static int ssam_receive_buf(struct serdev_device *dev, const unsigned char *buf,
|
||||
size_t n)
|
||||
static ssize_t ssam_receive_buf(struct serdev_device *dev, const u8 *buf,
|
||||
size_t n)
|
||||
{
|
||||
struct ssam_controller *ctrl;
|
||||
int ret;
|
||||
|
||||
@@ -1887,9 +1887,9 @@ int ssh_ptl_rx_stop(struct ssh_ptl *ptl)
|
||||
* Return: Returns the number of bytes transferred (positive or zero) on
|
||||
* success. Returns %-ESHUTDOWN if the packet layer has been shut down.
|
||||
*/
|
||||
int ssh_ptl_rx_rcvbuf(struct ssh_ptl *ptl, const u8 *buf, size_t n)
|
||||
ssize_t ssh_ptl_rx_rcvbuf(struct ssh_ptl *ptl, const u8 *buf, size_t n)
|
||||
{
|
||||
int used;
|
||||
size_t used;
|
||||
|
||||
if (test_bit(SSH_PTL_SF_SHUTDOWN_BIT, &ptl->state))
|
||||
return -ESHUTDOWN;
|
||||
|
||||
@@ -162,7 +162,7 @@ void ssh_ptl_shutdown(struct ssh_ptl *ptl);
|
||||
int ssh_ptl_submit(struct ssh_ptl *ptl, struct ssh_packet *p);
|
||||
void ssh_ptl_cancel(struct ssh_packet *p);
|
||||
|
||||
int ssh_ptl_rx_rcvbuf(struct ssh_ptl *ptl, const u8 *buf, size_t n);
|
||||
ssize_t ssh_ptl_rx_rcvbuf(struct ssh_ptl *ptl, const u8 *buf, size_t n);
|
||||
|
||||
/**
|
||||
* ssh_ptl_tx_wakeup_transfer() - Wake up packet transmitter thread for
|
||||
|
||||
@@ -136,7 +136,7 @@ static const struct software_node altmodes_node = {
|
||||
};
|
||||
|
||||
static const struct property_entry dp_altmode_properties[] = {
|
||||
PROPERTY_ENTRY_U32("svid", 0xff01),
|
||||
PROPERTY_ENTRY_U16("svid", 0xff01),
|
||||
PROPERTY_ENTRY_U32("vdo", 0x0c0086),
|
||||
{ }
|
||||
};
|
||||
|
||||
+12
-13
@@ -79,8 +79,8 @@ struct raw3215_info {
|
||||
struct ccw_device *cdev; /* device for tty driver */
|
||||
spinlock_t *lock; /* pointer to irq lock */
|
||||
int flags; /* state flags */
|
||||
char *buffer; /* pointer to output buffer */
|
||||
char *inbuf; /* pointer to input buffer */
|
||||
u8 *buffer; /* pointer to output buffer */
|
||||
u8 *inbuf; /* pointer to input buffer */
|
||||
int head; /* first free byte in output buffer */
|
||||
int count; /* number of bytes in output buffer */
|
||||
int written; /* number of bytes in write requests */
|
||||
@@ -89,7 +89,6 @@ struct raw3215_info {
|
||||
wait_queue_head_t empty_wait; /* wait queue for flushing */
|
||||
struct timer_list timer; /* timer for delayed output */
|
||||
int line_pos; /* position on the line (for tabs) */
|
||||
char ubuffer[80]; /* copy_from_user buffer */
|
||||
};
|
||||
|
||||
/* array of 3215 devices structures */
|
||||
@@ -523,12 +522,14 @@ static unsigned int raw3215_make_room(struct raw3215_info *raw,
|
||||
* string without blocking.
|
||||
* Return value is the number of bytes copied.
|
||||
*/
|
||||
static unsigned int raw3215_addtext(const char *str, unsigned int length,
|
||||
static unsigned int raw3215_addtext(const u8 *str, size_t length,
|
||||
struct raw3215_info *raw, int opmode,
|
||||
unsigned int todrop)
|
||||
{
|
||||
unsigned int c, ch, i, blanks, expanded_size = 0;
|
||||
unsigned int i, blanks, expanded_size = 0;
|
||||
unsigned int column = raw->line_pos;
|
||||
size_t c;
|
||||
u8 ch;
|
||||
|
||||
if (opmode == RAW3215_COUNT)
|
||||
todrop = 0;
|
||||
@@ -559,7 +560,7 @@ static unsigned int raw3215_addtext(const char *str, unsigned int length,
|
||||
if (todrop && expanded_size < todrop) /* Drop head data */
|
||||
continue;
|
||||
for (i = 0; i < blanks; i++) {
|
||||
raw->buffer[raw->head] = (char)_ascebc[(int)ch];
|
||||
raw->buffer[raw->head] = _ascebc[ch];
|
||||
raw->head = (raw->head + 1) & (RAW3215_BUFFER_SIZE - 1);
|
||||
raw->count++;
|
||||
}
|
||||
@@ -571,8 +572,8 @@ static unsigned int raw3215_addtext(const char *str, unsigned int length,
|
||||
/*
|
||||
* String write routine for 3215 devices
|
||||
*/
|
||||
static void raw3215_write(struct raw3215_info *raw, const char *str,
|
||||
unsigned int length)
|
||||
static void raw3215_write(struct raw3215_info *raw, const u8 *str,
|
||||
size_t length)
|
||||
{
|
||||
unsigned int count, avail;
|
||||
unsigned long flags;
|
||||
@@ -597,7 +598,7 @@ static void raw3215_write(struct raw3215_info *raw, const char *str,
|
||||
/*
|
||||
* Put character routine for 3215 devices
|
||||
*/
|
||||
static void raw3215_putchar(struct raw3215_info *raw, unsigned char ch)
|
||||
static void raw3215_putchar(struct raw3215_info *raw, u8 ch)
|
||||
{
|
||||
raw3215_write(raw, &ch, 1);
|
||||
}
|
||||
@@ -824,12 +825,10 @@ static struct ccw_driver raw3215_ccw_driver = {
|
||||
.int_class = IRQIO_C15,
|
||||
};
|
||||
|
||||
static void handle_write(struct raw3215_info *raw, const char *str, int count)
|
||||
static void handle_write(struct raw3215_info *raw, const u8 *str, size_t count)
|
||||
{
|
||||
int i;
|
||||
|
||||
while (count > 0) {
|
||||
i = min_t(int, count, RAW3215_BUFFER_SIZE - 1);
|
||||
size_t i = min_t(size_t, count, RAW3215_BUFFER_SIZE - 1);
|
||||
raw3215_write(raw, str, i);
|
||||
count -= i;
|
||||
str += i;
|
||||
|
||||
@@ -54,7 +54,7 @@ struct tty3270_attribute {
|
||||
};
|
||||
|
||||
struct tty3270_cell {
|
||||
unsigned char character;
|
||||
u8 character;
|
||||
struct tty3270_attribute attributes;
|
||||
};
|
||||
|
||||
@@ -123,7 +123,7 @@ struct tty3270 {
|
||||
|
||||
/* Character array for put_char/flush_chars. */
|
||||
unsigned int char_count;
|
||||
char char_buf[TTY3270_CHAR_BUF_SIZE];
|
||||
u8 char_buf[TTY3270_CHAR_BUF_SIZE];
|
||||
};
|
||||
|
||||
/* tty3270->update_flags. See tty3270_update for details. */
|
||||
@@ -1255,7 +1255,7 @@ static unsigned int tty3270_write_room(struct tty_struct *tty)
|
||||
* Insert character into the screen at the current position with the
|
||||
* current color and highlight. This function does NOT do cursor movement.
|
||||
*/
|
||||
static void tty3270_put_character(struct tty3270 *tp, char ch)
|
||||
static void tty3270_put_character(struct tty3270 *tp, u8 ch)
|
||||
{
|
||||
struct tty3270_line *line;
|
||||
struct tty3270_cell *cell;
|
||||
@@ -1561,7 +1561,7 @@ static void tty3270_goto_xy(struct tty3270 *tp, int cx, int cy)
|
||||
* Pn is a numeric parameter, a string of zero or more decimal digits.
|
||||
* Ps is a selective parameter.
|
||||
*/
|
||||
static void tty3270_escape_sequence(struct tty3270 *tp, char ch)
|
||||
static void tty3270_escape_sequence(struct tty3270 *tp, u8 ch)
|
||||
{
|
||||
enum { ES_NORMAL, ES_ESC, ES_SQUARE, ES_PAREN, ES_GETPARS };
|
||||
|
||||
@@ -1726,7 +1726,7 @@ static void tty3270_escape_sequence(struct tty3270 *tp, char ch)
|
||||
* String write routine for 3270 ttys
|
||||
*/
|
||||
static void tty3270_do_write(struct tty3270 *tp, struct tty_struct *tty,
|
||||
const unsigned char *buf, int count)
|
||||
const u8 *buf, size_t count)
|
||||
{
|
||||
int i_msg, i;
|
||||
|
||||
@@ -2052,7 +2052,7 @@ con3270_write(struct console *co, const char *str, unsigned int count)
|
||||
{
|
||||
struct tty3270 *tp = co->data;
|
||||
unsigned long flags;
|
||||
char c;
|
||||
u8 c;
|
||||
|
||||
spin_lock_irqsave(&tp->view.lock, flags);
|
||||
while (count--) {
|
||||
|
||||
@@ -307,7 +307,7 @@ static const struct attribute_group *domain_attr_groups[] = {
|
||||
NULL,
|
||||
};
|
||||
|
||||
struct bus_type tb_bus_type = {
|
||||
const struct bus_type tb_bus_type = {
|
||||
.name = "thunderbolt",
|
||||
.match = tb_service_match,
|
||||
.probe = tb_service_probe,
|
||||
|
||||
@@ -1020,7 +1020,7 @@ icm_tr_driver_ready(struct tb *tb, enum tb_security_level *security_level,
|
||||
|
||||
memset(&reply, 0, sizeof(reply));
|
||||
ret = icm_request(tb, &request, sizeof(request), &reply, sizeof(reply),
|
||||
1, 10, 2000);
|
||||
1, 10, 250);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
||||
@@ -1517,6 +1517,10 @@ static struct pci_device_id nhi_ids[] = {
|
||||
.driver_data = (kernel_ulong_t)&icl_nhi_ops },
|
||||
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_MTL_P_NHI1),
|
||||
.driver_data = (kernel_ulong_t)&icl_nhi_ops },
|
||||
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_LNL_NHI0),
|
||||
.driver_data = (kernel_ulong_t)&icl_nhi_ops },
|
||||
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_LNL_NHI1),
|
||||
.driver_data = (kernel_ulong_t)&icl_nhi_ops },
|
||||
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HOST_80G_NHI) },
|
||||
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HOST_40G_NHI) },
|
||||
|
||||
|
||||
@@ -90,6 +90,8 @@ extern const struct tb_nhi_ops icl_nhi_ops;
|
||||
#define PCI_DEVICE_ID_INTEL_TGL_H_NHI1 0x9a21
|
||||
#define PCI_DEVICE_ID_INTEL_RPL_NHI0 0xa73e
|
||||
#define PCI_DEVICE_ID_INTEL_RPL_NHI1 0xa76d
|
||||
#define PCI_DEVICE_ID_INTEL_LNL_NHI0 0xa833
|
||||
#define PCI_DEVICE_ID_INTEL_LNL_NHI1 0xa834
|
||||
|
||||
#define PCI_CLASS_SERIAL_USB_USB4 0x0c0340
|
||||
|
||||
|
||||
@@ -941,22 +941,6 @@ int tb_port_get_link_generation(struct tb_port *port)
|
||||
}
|
||||
}
|
||||
|
||||
static const char *width_name(enum tb_link_width width)
|
||||
{
|
||||
switch (width) {
|
||||
case TB_LINK_WIDTH_SINGLE:
|
||||
return "symmetric, single lane";
|
||||
case TB_LINK_WIDTH_DUAL:
|
||||
return "symmetric, dual lanes";
|
||||
case TB_LINK_WIDTH_ASYM_TX:
|
||||
return "asymmetric, 3 transmitters, 1 receiver";
|
||||
case TB_LINK_WIDTH_ASYM_RX:
|
||||
return "asymmetric, 3 receivers, 1 transmitter";
|
||||
default:
|
||||
return "unknown";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* tb_port_get_link_width() - Get current link width
|
||||
* @port: Port to check (USB4 or CIO)
|
||||
@@ -2769,7 +2753,7 @@ static void tb_switch_link_init(struct tb_switch *sw)
|
||||
return;
|
||||
|
||||
tb_sw_dbg(sw, "current link speed %u.0 Gb/s\n", sw->link_speed);
|
||||
tb_sw_dbg(sw, "current link width %s\n", width_name(sw->link_width));
|
||||
tb_sw_dbg(sw, "current link width %s\n", tb_width_name(sw->link_width));
|
||||
|
||||
bonded = sw->link_width >= TB_LINK_WIDTH_DUAL;
|
||||
|
||||
@@ -2789,6 +2773,19 @@ static void tb_switch_link_init(struct tb_switch *sw)
|
||||
if (down->dual_link_port)
|
||||
down->dual_link_port->bonded = bonded;
|
||||
tb_port_update_credits(down);
|
||||
|
||||
if (tb_port_get_link_generation(up) < 4)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Set the Gen 4 preferred link width. This is what the router
|
||||
* prefers when the link is brought up. If the router does not
|
||||
* support asymmetric link configuration, this also will be set
|
||||
* to TB_LINK_WIDTH_DUAL.
|
||||
*/
|
||||
sw->preferred_link_width = sw->link_width;
|
||||
tb_sw_dbg(sw, "preferred link width %s\n",
|
||||
tb_width_name(sw->preferred_link_width));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -3029,7 +3026,7 @@ int tb_switch_set_link_width(struct tb_switch *sw, enum tb_link_width width)
|
||||
|
||||
tb_switch_update_link_attributes(sw);
|
||||
|
||||
tb_sw_dbg(sw, "link width set to %s\n", width_name(width));
|
||||
tb_sw_dbg(sw, "link width set to %s\n", tb_width_name(width));
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
+50
-24
@@ -513,8 +513,6 @@ static void tb_port_unconfigure_xdomain(struct tb_port *port)
|
||||
usb4_port_unconfigure_xdomain(port);
|
||||
else
|
||||
tb_lc_unconfigure_xdomain(port);
|
||||
|
||||
tb_port_enable(port->dual_link_port);
|
||||
}
|
||||
|
||||
static void tb_scan_xdomain(struct tb_port *port)
|
||||
@@ -1087,15 +1085,14 @@ static int tb_configure_asym(struct tb *tb, struct tb_port *src_port,
|
||||
struct tb_port *dst_port, int requested_up,
|
||||
int requested_down)
|
||||
{
|
||||
bool clx = false, clx_disabled = false, downstream;
|
||||
struct tb_switch *sw;
|
||||
bool clx, downstream;
|
||||
struct tb_port *up;
|
||||
int ret = 0;
|
||||
|
||||
if (!asym_threshold)
|
||||
return 0;
|
||||
|
||||
/* Disable CL states before doing any transitions */
|
||||
downstream = tb_port_path_direction_downstream(src_port, dst_port);
|
||||
/* Pick up router deepest in the hierarchy */
|
||||
if (downstream)
|
||||
@@ -1103,11 +1100,10 @@ static int tb_configure_asym(struct tb *tb, struct tb_port *src_port,
|
||||
else
|
||||
sw = src_port->sw;
|
||||
|
||||
clx = tb_disable_clx(sw);
|
||||
|
||||
tb_for_each_upstream_port_on_path(src_port, dst_port, up) {
|
||||
struct tb_port *down = tb_switch_downstream_port(up->sw);
|
||||
enum tb_link_width width_up, width_down;
|
||||
int consumed_up, consumed_down;
|
||||
enum tb_link_width width;
|
||||
|
||||
ret = tb_consumed_dp_bandwidth(tb, src_port, dst_port, up,
|
||||
&consumed_up, &consumed_down);
|
||||
@@ -1128,7 +1124,8 @@ static int tb_configure_asym(struct tb *tb, struct tb_port *src_port,
|
||||
if (consumed_down + requested_down < asym_threshold)
|
||||
continue;
|
||||
|
||||
width = TB_LINK_WIDTH_ASYM_RX;
|
||||
width_up = TB_LINK_WIDTH_ASYM_RX;
|
||||
width_down = TB_LINK_WIDTH_ASYM_TX;
|
||||
} else {
|
||||
/* Upstream, the opposite of above */
|
||||
if (consumed_down + requested_down >= TB_ASYM_MIN) {
|
||||
@@ -1138,22 +1135,34 @@ static int tb_configure_asym(struct tb *tb, struct tb_port *src_port,
|
||||
if (consumed_up + requested_up < asym_threshold)
|
||||
continue;
|
||||
|
||||
width = TB_LINK_WIDTH_ASYM_TX;
|
||||
width_up = TB_LINK_WIDTH_ASYM_TX;
|
||||
width_down = TB_LINK_WIDTH_ASYM_RX;
|
||||
}
|
||||
|
||||
if (up->sw->link_width == width)
|
||||
if (up->sw->link_width == width_up)
|
||||
continue;
|
||||
|
||||
if (!tb_port_width_supported(up, width))
|
||||
if (!tb_port_width_supported(up, width_up) ||
|
||||
!tb_port_width_supported(down, width_down))
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Disable CL states before doing any transitions. We
|
||||
* delayed it until now that we know there is a real
|
||||
* transition taking place.
|
||||
*/
|
||||
if (!clx_disabled) {
|
||||
clx = tb_disable_clx(sw);
|
||||
clx_disabled = true;
|
||||
}
|
||||
|
||||
tb_sw_dbg(up->sw, "configuring asymmetric link\n");
|
||||
|
||||
/*
|
||||
* Here requested + consumed > threshold so we need to
|
||||
* transtion the link into asymmetric now.
|
||||
*/
|
||||
ret = tb_switch_set_link_width(up->sw, width);
|
||||
ret = tb_switch_set_link_width(up->sw, width_up);
|
||||
if (ret) {
|
||||
tb_sw_warn(up->sw, "failed to set link width\n");
|
||||
break;
|
||||
@@ -1174,24 +1183,24 @@ static int tb_configure_asym(struct tb *tb, struct tb_port *src_port,
|
||||
* @dst_port: Destination adapter
|
||||
* @requested_up: New lower bandwidth request upstream (Mb/s)
|
||||
* @requested_down: New lower bandwidth request downstream (Mb/s)
|
||||
* @keep_asym: Keep asymmetric link if preferred
|
||||
*
|
||||
* Goes over each link from @src_port to @dst_port and tries to
|
||||
* transition the link to symmetric if the currently consumed bandwidth
|
||||
* allows.
|
||||
* allows and link asymmetric preference is ignored (if @keep_asym is %false).
|
||||
*/
|
||||
static int tb_configure_sym(struct tb *tb, struct tb_port *src_port,
|
||||
struct tb_port *dst_port, int requested_up,
|
||||
int requested_down)
|
||||
int requested_down, bool keep_asym)
|
||||
{
|
||||
bool clx = false, clx_disabled = false, downstream;
|
||||
struct tb_switch *sw;
|
||||
bool clx, downstream;
|
||||
struct tb_port *up;
|
||||
int ret = 0;
|
||||
|
||||
if (!asym_threshold)
|
||||
return 0;
|
||||
|
||||
/* Disable CL states before doing any transitions */
|
||||
downstream = tb_port_path_direction_downstream(src_port, dst_port);
|
||||
/* Pick up router deepest in the hierarchy */
|
||||
if (downstream)
|
||||
@@ -1199,8 +1208,6 @@ static int tb_configure_sym(struct tb *tb, struct tb_port *src_port,
|
||||
else
|
||||
sw = src_port->sw;
|
||||
|
||||
clx = tb_disable_clx(sw);
|
||||
|
||||
tb_for_each_upstream_port_on_path(src_port, dst_port, up) {
|
||||
int consumed_up, consumed_down;
|
||||
|
||||
@@ -1233,6 +1240,25 @@ static int tb_configure_sym(struct tb *tb, struct tb_port *src_port,
|
||||
if (up->sw->link_width == TB_LINK_WIDTH_DUAL)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Here consumed < threshold so we can transition the
|
||||
* link to symmetric.
|
||||
*
|
||||
* However, if the router prefers asymmetric link we
|
||||
* honor that (unless @keep_asym is %false).
|
||||
*/
|
||||
if (keep_asym &&
|
||||
up->sw->preferred_link_width > TB_LINK_WIDTH_DUAL) {
|
||||
tb_sw_dbg(up->sw, "keeping preferred asymmetric link\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Disable CL states before doing any transitions */
|
||||
if (!clx_disabled) {
|
||||
clx = tb_disable_clx(sw);
|
||||
clx_disabled = true;
|
||||
}
|
||||
|
||||
tb_sw_dbg(up->sw, "configuring symmetric link\n");
|
||||
|
||||
ret = tb_switch_set_link_width(up->sw, TB_LINK_WIDTH_DUAL);
|
||||
@@ -1280,7 +1306,7 @@ static void tb_configure_link(struct tb_port *down, struct tb_port *up,
|
||||
struct tb_port *host_port;
|
||||
|
||||
host_port = tb_port_at(tb_route(sw), tb->root_switch);
|
||||
tb_configure_sym(tb, host_port, up, 0, 0);
|
||||
tb_configure_sym(tb, host_port, up, 0, 0, false);
|
||||
}
|
||||
|
||||
/* Set the link configured */
|
||||
@@ -1465,7 +1491,7 @@ static void tb_deactivate_and_free_tunnel(struct tb_tunnel *tunnel)
|
||||
* If bandwidth on a link is < asym_threshold
|
||||
* transition the link to symmetric.
|
||||
*/
|
||||
tb_configure_sym(tb, src_port, dst_port, 0, 0);
|
||||
tb_configure_sym(tb, src_port, dst_port, 0, 0, true);
|
||||
/* Now we can allow the domain to runtime suspend again */
|
||||
pm_runtime_mark_last_busy(&dst_port->sw->dev);
|
||||
pm_runtime_put_autosuspend(&dst_port->sw->dev);
|
||||
@@ -1901,7 +1927,7 @@ static void tb_dp_resource_available(struct tb *tb, struct tb_port *port)
|
||||
return;
|
||||
}
|
||||
|
||||
tb_port_dbg(port, "DP %s resource available\n",
|
||||
tb_port_dbg(port, "DP %s resource available after hotplug\n",
|
||||
tb_port_is_dpin(port) ? "IN" : "OUT");
|
||||
list_add_tail(&port->list, &tcm->dp_resources);
|
||||
|
||||
@@ -2287,7 +2313,7 @@ static int tb_alloc_dp_bandwidth(struct tb_tunnel *tunnel, int *requested_up,
|
||||
* If bandwidth on a link is < asym_threshold transition
|
||||
* the link to symmetric.
|
||||
*/
|
||||
tb_configure_sym(tb, in, out, *requested_up, *requested_down);
|
||||
tb_configure_sym(tb, in, out, *requested_up, *requested_down, true);
|
||||
/*
|
||||
* If requested bandwidth is less or equal than what is
|
||||
* currently allocated to that tunnel we simply change
|
||||
@@ -2330,7 +2356,7 @@ static int tb_alloc_dp_bandwidth(struct tb_tunnel *tunnel, int *requested_up,
|
||||
ret = tb_configure_asym(tb, in, out, *requested_up,
|
||||
*requested_down);
|
||||
if (ret) {
|
||||
tb_configure_sym(tb, in, out, 0, 0);
|
||||
tb_configure_sym(tb, in, out, 0, 0, true);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -2338,7 +2364,7 @@ static int tb_alloc_dp_bandwidth(struct tb_tunnel *tunnel, int *requested_up,
|
||||
requested_down);
|
||||
if (ret) {
|
||||
tb_tunnel_warn(tunnel, "failed to allocate bandwidth\n");
|
||||
tb_configure_sym(tb, in, out, 0, 0);
|
||||
tb_configure_sym(tb, in, out, 0, 0, true);
|
||||
}
|
||||
} else {
|
||||
ret = -ENOBUFS;
|
||||
|
||||
@@ -125,6 +125,7 @@ struct tb_switch_tmu {
|
||||
* @device_name: Name of the device (or %NULL if not known)
|
||||
* @link_speed: Speed of the link in Gb/s
|
||||
* @link_width: Width of the upstream facing link
|
||||
* @preferred_link_width: Router preferred link width (only set for Gen 4 links)
|
||||
* @link_usb4: Upstream link is USB4
|
||||
* @generation: Switch Thunderbolt generation
|
||||
* @cap_plug_events: Offset to the plug events capability (%0 if not found)
|
||||
@@ -178,6 +179,7 @@ struct tb_switch {
|
||||
const char *device_name;
|
||||
unsigned int link_speed;
|
||||
enum tb_link_width link_width;
|
||||
enum tb_link_width preferred_link_width;
|
||||
bool link_usb4;
|
||||
unsigned int generation;
|
||||
int cap_plug_events;
|
||||
@@ -568,6 +570,22 @@ static inline struct tb_port *tb_port_at(u64 route, struct tb_switch *sw)
|
||||
return &sw->ports[port];
|
||||
}
|
||||
|
||||
static inline const char *tb_width_name(enum tb_link_width width)
|
||||
{
|
||||
switch (width) {
|
||||
case TB_LINK_WIDTH_SINGLE:
|
||||
return "symmetric, single lane";
|
||||
case TB_LINK_WIDTH_DUAL:
|
||||
return "symmetric, dual lanes";
|
||||
case TB_LINK_WIDTH_ASYM_TX:
|
||||
return "asymmetric, 3 transmitters, 1 receiver";
|
||||
case TB_LINK_WIDTH_ASYM_RX:
|
||||
return "asymmetric, 3 receivers, 1 transmitter";
|
||||
default:
|
||||
return "unknown";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* tb_port_has_remote() - Does the port have switch connected downstream
|
||||
* @port: Port to check
|
||||
|
||||
@@ -894,7 +894,7 @@ static int tb_switch_tmu_change_mode(struct tb_switch *sw)
|
||||
|
||||
ret = tb_switch_set_tmu_mode_params(sw, sw->tmu.mode_request);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto out;
|
||||
|
||||
/* Program the new mode and the downstream router lane adapter */
|
||||
switch (sw->tmu.mode_request) {
|
||||
|
||||
@@ -173,16 +173,28 @@ static int tb_pci_set_ext_encapsulation(struct tb_tunnel *tunnel, bool enable)
|
||||
int ret;
|
||||
|
||||
/* Only supported of both routers are at least USB4 v2 */
|
||||
if (tb_port_get_link_generation(port) < 4)
|
||||
if ((usb4_switch_version(tunnel->src_port->sw) < 2) ||
|
||||
(usb4_switch_version(tunnel->dst_port->sw) < 2))
|
||||
return 0;
|
||||
|
||||
if (enable && tb_port_get_link_generation(port) < 4)
|
||||
return 0;
|
||||
|
||||
ret = usb4_pci_port_set_ext_encapsulation(tunnel->src_port, enable);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* Downstream router could be unplugged so disable of encapsulation
|
||||
* in upstream router is still possible.
|
||||
*/
|
||||
ret = usb4_pci_port_set_ext_encapsulation(tunnel->dst_port, enable);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (ret) {
|
||||
if (enable)
|
||||
return ret;
|
||||
if (ret != -ENODEV)
|
||||
return ret;
|
||||
}
|
||||
|
||||
tb_tunnel_dbg(tunnel, "extended encapsulation %s\n",
|
||||
str_enabled_disabled(enable));
|
||||
@@ -199,14 +211,21 @@ static int tb_pci_activate(struct tb_tunnel *tunnel, bool activate)
|
||||
return res;
|
||||
}
|
||||
|
||||
res = tb_pci_port_enable(tunnel->src_port, activate);
|
||||
if (activate)
|
||||
res = tb_pci_port_enable(tunnel->dst_port, activate);
|
||||
else
|
||||
res = tb_pci_port_enable(tunnel->src_port, activate);
|
||||
if (res)
|
||||
return res;
|
||||
|
||||
if (tb_port_is_pcie_up(tunnel->dst_port)) {
|
||||
res = tb_pci_port_enable(tunnel->dst_port, activate);
|
||||
|
||||
if (activate) {
|
||||
res = tb_pci_port_enable(tunnel->src_port, activate);
|
||||
if (res)
|
||||
return res;
|
||||
} else {
|
||||
/* Downstream router could be unplugged */
|
||||
tb_pci_port_enable(tunnel->dst_port, activate);
|
||||
}
|
||||
|
||||
return activate ? 0 : tb_pci_set_ext_encapsulation(tunnel, activate);
|
||||
@@ -1067,8 +1086,7 @@ static int tb_dp_alloc_bandwidth(struct tb_tunnel *tunnel, int *alloc_up,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tb_dp_read_dprx(struct tb_tunnel *tunnel, u32 *rate, u32 *lanes,
|
||||
int timeout_msec)
|
||||
static int tb_dp_wait_dprx(struct tb_tunnel *tunnel, int timeout_msec)
|
||||
{
|
||||
ktime_t timeout = ktime_add_ms(ktime_get(), timeout_msec);
|
||||
struct tb_port *in = tunnel->src_port;
|
||||
@@ -1087,15 +1105,13 @@ static int tb_dp_read_dprx(struct tb_tunnel *tunnel, u32 *rate, u32 *lanes,
|
||||
return ret;
|
||||
|
||||
if (val & DP_COMMON_CAP_DPRX_DONE) {
|
||||
*rate = tb_dp_cap_get_rate(val);
|
||||
*lanes = tb_dp_cap_get_lanes(val);
|
||||
|
||||
tb_tunnel_dbg(tunnel, "DPRX read done\n");
|
||||
return 0;
|
||||
}
|
||||
usleep_range(100, 150);
|
||||
} while (ktime_before(ktime_get(), timeout));
|
||||
|
||||
tb_tunnel_dbg(tunnel, "DPRX read timeout\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
@@ -1110,6 +1126,7 @@ static int tb_dp_read_cap(struct tb_tunnel *tunnel, unsigned int cap, u32 *rate,
|
||||
switch (cap) {
|
||||
case DP_LOCAL_CAP:
|
||||
case DP_REMOTE_CAP:
|
||||
case DP_COMMON_CAP:
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -1182,7 +1199,7 @@ static int tb_dp_consumed_bandwidth(struct tb_tunnel *tunnel, int *consumed_up,
|
||||
* reduced one). Otherwise return the remote (possibly
|
||||
* reduced) caps.
|
||||
*/
|
||||
ret = tb_dp_read_dprx(tunnel, &rate, &lanes, 150);
|
||||
ret = tb_dp_wait_dprx(tunnel, 150);
|
||||
if (ret) {
|
||||
if (ret == -ETIMEDOUT)
|
||||
ret = tb_dp_read_cap(tunnel, DP_REMOTE_CAP,
|
||||
@@ -1190,6 +1207,9 @@ static int tb_dp_consumed_bandwidth(struct tb_tunnel *tunnel, int *consumed_up,
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
ret = tb_dp_read_cap(tunnel, DP_COMMON_CAP, &rate, &lanes);
|
||||
if (ret)
|
||||
return ret;
|
||||
} else if (sw->generation >= 2) {
|
||||
ret = tb_dp_read_cap(tunnel, DP_REMOTE_CAP, &rate, &lanes);
|
||||
if (ret)
|
||||
@@ -1313,8 +1333,6 @@ static void tb_dp_dump(struct tb_tunnel *tunnel)
|
||||
"DP IN maximum supported bandwidth %u Mb/s x%u = %u Mb/s\n",
|
||||
rate, lanes, tb_dp_bandwidth(rate, lanes));
|
||||
|
||||
out = tunnel->dst_port;
|
||||
|
||||
if (tb_port_read(out, &dp_cap, TB_CFG_PORT,
|
||||
out->cap_adap + DP_LOCAL_CAP, 1))
|
||||
return;
|
||||
|
||||
@@ -1462,6 +1462,11 @@ static int tb_xdomain_get_properties(struct tb_xdomain *xd)
|
||||
tb_port_disable(port->dual_link_port);
|
||||
}
|
||||
|
||||
dev_dbg(&xd->dev, "current link speed %u.0 Gb/s\n",
|
||||
xd->link_speed);
|
||||
dev_dbg(&xd->dev, "current link width %s\n",
|
||||
tb_width_name(xd->link_width));
|
||||
|
||||
if (device_add(&xd->dev)) {
|
||||
dev_err(&xd->dev, "failed to add XDomain device\n");
|
||||
return -ENODEV;
|
||||
@@ -1895,6 +1900,50 @@ struct device_type tb_xdomain_type = {
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(tb_xdomain_type);
|
||||
|
||||
static void tb_xdomain_link_init(struct tb_xdomain *xd, struct tb_port *down)
|
||||
{
|
||||
if (!down->dual_link_port)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Gen 4 links come up already as bonded so only update the port
|
||||
* structures here.
|
||||
*/
|
||||
if (tb_port_get_link_generation(down) >= 4) {
|
||||
down->bonded = true;
|
||||
down->dual_link_port->bonded = true;
|
||||
} else {
|
||||
xd->bonding_possible = true;
|
||||
}
|
||||
}
|
||||
|
||||
static void tb_xdomain_link_exit(struct tb_xdomain *xd)
|
||||
{
|
||||
struct tb_port *down = tb_xdomain_downstream_port(xd);
|
||||
|
||||
if (!down->dual_link_port)
|
||||
return;
|
||||
|
||||
if (tb_port_get_link_generation(down) >= 4) {
|
||||
down->bonded = false;
|
||||
down->dual_link_port->bonded = false;
|
||||
} else if (xd->link_width > TB_LINK_WIDTH_SINGLE) {
|
||||
/*
|
||||
* Just return port structures back to way they were and
|
||||
* update credits. No need to update userspace because
|
||||
* the XDomain is removed soon anyway.
|
||||
*/
|
||||
tb_port_lane_bonding_disable(down);
|
||||
tb_port_update_credits(down);
|
||||
} else if (down->dual_link_port) {
|
||||
/*
|
||||
* Re-enable the lane 1 adapter we disabled at the end
|
||||
* of tb_xdomain_get_properties().
|
||||
*/
|
||||
tb_port_enable(down->dual_link_port);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* tb_xdomain_alloc() - Allocate new XDomain object
|
||||
* @tb: Domain where the XDomain belongs
|
||||
@@ -1945,7 +1994,8 @@ struct tb_xdomain *tb_xdomain_alloc(struct tb *tb, struct device *parent,
|
||||
goto err_free_local_uuid;
|
||||
} else {
|
||||
xd->needs_uuid = true;
|
||||
xd->bonding_possible = !!down->dual_link_port;
|
||||
|
||||
tb_xdomain_link_init(xd, down);
|
||||
}
|
||||
|
||||
device_initialize(&xd->dev);
|
||||
@@ -2014,6 +2064,8 @@ void tb_xdomain_remove(struct tb_xdomain *xd)
|
||||
|
||||
device_for_each_child_reverse(&xd->dev, xd, unregister_service);
|
||||
|
||||
tb_xdomain_link_exit(xd);
|
||||
|
||||
/*
|
||||
* Undo runtime PM here explicitly because it is possible that
|
||||
* the XDomain was never added to the bus and thus device_del()
|
||||
|
||||
@@ -81,7 +81,7 @@ struct serial_state {
|
||||
int quot;
|
||||
int IER; /* Interrupt Enable Register */
|
||||
int MCR; /* Modem control register */
|
||||
int x_char; /* xon/xoff character */
|
||||
u8 x_char; /* xon/xoff character */
|
||||
};
|
||||
|
||||
static struct tty_driver *serial_driver;
|
||||
@@ -178,9 +178,9 @@ static void receive_chars(struct serial_state *info)
|
||||
{
|
||||
int status;
|
||||
int serdatr;
|
||||
unsigned char ch, flag;
|
||||
u8 ch, flag;
|
||||
struct async_icount *icount;
|
||||
int oe = 0;
|
||||
bool overrun = false;
|
||||
|
||||
icount = &info->icount;
|
||||
|
||||
@@ -230,7 +230,7 @@ static void receive_chars(struct serial_state *info)
|
||||
* should be ignored.
|
||||
*/
|
||||
if (status & info->ignore_status_mask)
|
||||
goto out;
|
||||
return;
|
||||
|
||||
status &= info->read_status_mask;
|
||||
|
||||
@@ -251,15 +251,13 @@ static void receive_chars(struct serial_state *info)
|
||||
* reported immediately, and doesn't
|
||||
* affect the current character
|
||||
*/
|
||||
oe = 1;
|
||||
overrun = true;
|
||||
}
|
||||
}
|
||||
tty_insert_flip_char(&info->tport, ch, flag);
|
||||
if (oe == 1)
|
||||
if (overrun)
|
||||
tty_insert_flip_char(&info->tport, 0, TTY_OVERRUN);
|
||||
tty_flip_buffer_push(&info->tport);
|
||||
out:
|
||||
return;
|
||||
}
|
||||
|
||||
static void transmit_chars(struct serial_state *info)
|
||||
@@ -813,7 +811,7 @@ static void rs_flush_buffer(struct tty_struct *tty)
|
||||
* This function is used to send a high-priority XON/XOFF character to
|
||||
* the device
|
||||
*/
|
||||
static void rs_send_xchar(struct tty_struct *tty, char ch)
|
||||
static void rs_send_xchar(struct tty_struct *tty, u8 ch)
|
||||
{
|
||||
struct serial_state *info = tty->driver_data;
|
||||
unsigned long flags;
|
||||
|
||||
@@ -49,7 +49,7 @@ struct ehv_bc_data {
|
||||
unsigned int tx_irq;
|
||||
|
||||
spinlock_t lock; /* lock for transmit buffer */
|
||||
unsigned char buf[BUF_SIZE]; /* transmit circular buffer */
|
||||
u8 buf[BUF_SIZE]; /* transmit circular buffer */
|
||||
unsigned int head; /* circular buffer head */
|
||||
unsigned int tail; /* circular buffer tail */
|
||||
|
||||
@@ -138,14 +138,17 @@ static int find_console_handle(void)
|
||||
|
||||
static unsigned int local_ev_byte_channel_send(unsigned int handle,
|
||||
unsigned int *count,
|
||||
const char *p)
|
||||
const u8 *p)
|
||||
{
|
||||
char buffer[EV_BYTE_CHANNEL_MAX_BYTES];
|
||||
u8 buffer[EV_BYTE_CHANNEL_MAX_BYTES];
|
||||
unsigned int c = *count;
|
||||
|
||||
/*
|
||||
* ev_byte_channel_send() expects at least EV_BYTE_CHANNEL_MAX_BYTES
|
||||
* (16 B) in the buffer. Fake it using a local buffer if needed.
|
||||
*/
|
||||
if (c < sizeof(buffer)) {
|
||||
memcpy(buffer, p, c);
|
||||
memset(&buffer[c], 0, sizeof(buffer) - c);
|
||||
memcpy_and_pad(buffer, sizeof(buffer), p, c, 0);
|
||||
p = buffer;
|
||||
}
|
||||
return ev_byte_channel_send(handle, count, p);
|
||||
@@ -163,7 +166,7 @@ static unsigned int local_ev_byte_channel_send(unsigned int handle,
|
||||
* has been sent, or if some error has occurred.
|
||||
*
|
||||
*/
|
||||
static void byte_channel_spin_send(const char data)
|
||||
static void byte_channel_spin_send(const u8 data)
|
||||
{
|
||||
int ret, count;
|
||||
|
||||
@@ -471,8 +474,7 @@ static ssize_t ehv_bc_tty_write(struct tty_struct *ttys, const u8 *s,
|
||||
{
|
||||
struct ehv_bc_data *bc = ttys->driver_data;
|
||||
unsigned long flags;
|
||||
unsigned int len;
|
||||
unsigned int written = 0;
|
||||
size_t len, written = 0;
|
||||
|
||||
while (1) {
|
||||
spin_lock_irqsave(&bc->lock, flags);
|
||||
|
||||
+8
-15
@@ -50,10 +50,8 @@ static u32 goldfish_tty_line_count = 8;
|
||||
static u32 goldfish_tty_current_line_count;
|
||||
static struct goldfish_tty *goldfish_ttys;
|
||||
|
||||
static void do_rw_io(struct goldfish_tty *qtty,
|
||||
unsigned long address,
|
||||
unsigned int count,
|
||||
int is_write)
|
||||
static void do_rw_io(struct goldfish_tty *qtty, unsigned long address,
|
||||
size_t count, bool is_write)
|
||||
{
|
||||
unsigned long irq_flags;
|
||||
void __iomem *base = qtty->base;
|
||||
@@ -73,10 +71,8 @@ static void do_rw_io(struct goldfish_tty *qtty,
|
||||
spin_unlock_irqrestore(&qtty->lock, irq_flags);
|
||||
}
|
||||
|
||||
static void goldfish_tty_rw(struct goldfish_tty *qtty,
|
||||
unsigned long addr,
|
||||
unsigned int count,
|
||||
int is_write)
|
||||
static void goldfish_tty_rw(struct goldfish_tty *qtty, unsigned long addr,
|
||||
size_t count, bool is_write)
|
||||
{
|
||||
dma_addr_t dma_handle;
|
||||
enum dma_data_direction dma_dir;
|
||||
@@ -125,20 +121,18 @@ static void goldfish_tty_rw(struct goldfish_tty *qtty,
|
||||
}
|
||||
}
|
||||
|
||||
static void goldfish_tty_do_write(int line, const u8 *buf, unsigned int count)
|
||||
static void goldfish_tty_do_write(int line, const u8 *buf, size_t count)
|
||||
{
|
||||
struct goldfish_tty *qtty = &goldfish_ttys[line];
|
||||
unsigned long address = (unsigned long)(void *)buf;
|
||||
|
||||
goldfish_tty_rw(qtty, address, count, 1);
|
||||
goldfish_tty_rw(qtty, (unsigned long)buf, count, true);
|
||||
}
|
||||
|
||||
static irqreturn_t goldfish_tty_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
struct goldfish_tty *qtty = dev_id;
|
||||
void __iomem *base = qtty->base;
|
||||
unsigned long address;
|
||||
unsigned char *buf;
|
||||
u8 *buf;
|
||||
u32 count;
|
||||
|
||||
count = gf_ioread32(base + GOLDFISH_TTY_REG_BYTES_READY);
|
||||
@@ -147,8 +141,7 @@ static irqreturn_t goldfish_tty_interrupt(int irq, void *dev_id)
|
||||
|
||||
count = tty_prepare_flip_string(&qtty->port, &buf, count);
|
||||
|
||||
address = (unsigned long)(void *)buf;
|
||||
goldfish_tty_rw(qtty, address, count, 0);
|
||||
goldfish_tty_rw(qtty, (unsigned long)buf, count, false);
|
||||
|
||||
tty_flip_buffer_push(&qtty->port);
|
||||
return IRQ_HANDLED;
|
||||
|
||||
@@ -922,8 +922,7 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data,
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
hp = kzalloc(ALIGN(sizeof(*hp), sizeof(long)) + outbuf_size,
|
||||
GFP_KERNEL);
|
||||
hp = kzalloc(struct_size(hp, outbuf, outbuf_size), GFP_KERNEL);
|
||||
if (!hp)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
@@ -931,7 +930,6 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data,
|
||||
hp->data = data;
|
||||
hp->ops = ops;
|
||||
hp->outbuf_size = outbuf_size;
|
||||
hp->outbuf = &((char *)hp)[ALIGN(sizeof(*hp), sizeof(long))];
|
||||
|
||||
tty_port_init(&hp->port);
|
||||
hp->port.ops = &hvc_port_ops;
|
||||
@@ -976,7 +974,7 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(hvc_alloc);
|
||||
|
||||
int hvc_remove(struct hvc_struct *hp)
|
||||
void hvc_remove(struct hvc_struct *hp)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct tty_struct *tty;
|
||||
@@ -1010,7 +1008,6 @@ int hvc_remove(struct hvc_struct *hp)
|
||||
tty_vhangup(tty);
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(hvc_remove);
|
||||
|
||||
|
||||
@@ -37,7 +37,6 @@ struct hvc_struct {
|
||||
spinlock_t lock;
|
||||
int index;
|
||||
int do_wakeup;
|
||||
char *outbuf;
|
||||
int outbuf_size;
|
||||
int n_outbuf;
|
||||
uint32_t vtermno;
|
||||
@@ -48,12 +47,13 @@ struct hvc_struct {
|
||||
struct work_struct tty_resize;
|
||||
struct list_head next;
|
||||
unsigned long flags;
|
||||
u8 outbuf[] __aligned(sizeof(long));
|
||||
};
|
||||
|
||||
/* implemented by a low level driver */
|
||||
struct hv_ops {
|
||||
int (*get_chars)(uint32_t vtermno, char *buf, int count);
|
||||
int (*put_chars)(uint32_t vtermno, const char *buf, int count);
|
||||
ssize_t (*get_chars)(uint32_t vtermno, u8 *buf, size_t count);
|
||||
ssize_t (*put_chars)(uint32_t vtermno, const u8 *buf, size_t count);
|
||||
int (*flush)(uint32_t vtermno, bool wait);
|
||||
|
||||
/* Callbacks for notification. Called in open, close and hangup */
|
||||
@@ -77,7 +77,7 @@ extern int hvc_instantiate(uint32_t vtermno, int index,
|
||||
extern struct hvc_struct * hvc_alloc(uint32_t vtermno, int data,
|
||||
const struct hv_ops *ops, int outbuf_size);
|
||||
/* remove a vterm from hvc tty operation (module_exit or hotplug remove) */
|
||||
extern int hvc_remove(struct hvc_struct *hp);
|
||||
extern void hvc_remove(struct hvc_struct *hp);
|
||||
|
||||
/* data available */
|
||||
int hvc_poll(struct hvc_struct *hp);
|
||||
|
||||
+20
-12
@@ -34,10 +34,10 @@ module_param(enable, bool, 0444);
|
||||
/* Lock to serialize access to DCC fifo */
|
||||
static DEFINE_SPINLOCK(dcc_lock);
|
||||
|
||||
static DEFINE_KFIFO(inbuf, unsigned char, DCC_INBUF_SIZE);
|
||||
static DEFINE_KFIFO(outbuf, unsigned char, DCC_OUTBUF_SIZE);
|
||||
static DEFINE_KFIFO(inbuf, u8, DCC_INBUF_SIZE);
|
||||
static DEFINE_KFIFO(outbuf, u8, DCC_OUTBUF_SIZE);
|
||||
|
||||
static void dcc_uart_console_putchar(struct uart_port *port, unsigned char ch)
|
||||
static void dcc_uart_console_putchar(struct uart_port *port, u8 ch)
|
||||
{
|
||||
while (__dcc_getstatus() & DCC_STATUS_TX)
|
||||
cpu_relax();
|
||||
@@ -55,6 +55,14 @@ static void dcc_early_write(struct console *con, const char *s, unsigned n)
|
||||
static int __init dcc_early_console_setup(struct earlycon_device *device,
|
||||
const char *opt)
|
||||
{
|
||||
unsigned int count = 0x4000000;
|
||||
|
||||
while (--count && (__dcc_getstatus() & DCC_STATUS_TX))
|
||||
cpu_relax();
|
||||
|
||||
if (__dcc_getstatus() & DCC_STATUS_TX)
|
||||
return -ENODEV;
|
||||
|
||||
device->con->write = dcc_early_write;
|
||||
|
||||
return 0;
|
||||
@@ -62,9 +70,9 @@ static int __init dcc_early_console_setup(struct earlycon_device *device,
|
||||
|
||||
EARLYCON_DECLARE(dcc, dcc_early_console_setup);
|
||||
|
||||
static int hvc_dcc_put_chars(uint32_t vt, const char *buf, int count)
|
||||
static ssize_t hvc_dcc_put_chars(uint32_t vt, const u8 *buf, size_t count)
|
||||
{
|
||||
int i;
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
while (__dcc_getstatus() & DCC_STATUS_TX)
|
||||
@@ -76,9 +84,9 @@ static int hvc_dcc_put_chars(uint32_t vt, const char *buf, int count)
|
||||
return count;
|
||||
}
|
||||
|
||||
static int hvc_dcc_get_chars(uint32_t vt, char *buf, int count)
|
||||
static ssize_t hvc_dcc_get_chars(uint32_t vt, u8 *buf, size_t count)
|
||||
{
|
||||
int i;
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < count; ++i)
|
||||
if (__dcc_getstatus() & DCC_STATUS_RX)
|
||||
@@ -157,8 +165,8 @@ static DECLARE_WORK(dcc_pwork, dcc_put_work);
|
||||
*/
|
||||
static void dcc_get_work(struct work_struct *work)
|
||||
{
|
||||
unsigned char ch;
|
||||
unsigned long irqflags;
|
||||
u8 ch;
|
||||
|
||||
/*
|
||||
* Read characters from DCC and put them into the input FIFO, as
|
||||
@@ -180,10 +188,10 @@ static DECLARE_WORK(dcc_gwork, dcc_get_work);
|
||||
* Write characters directly to the DCC if we're on core 0 and the FIFO
|
||||
* is empty, or write them to the FIFO if we're not.
|
||||
*/
|
||||
static int hvc_dcc0_put_chars(u32 vt, const char *buf, int count)
|
||||
static ssize_t hvc_dcc0_put_chars(u32 vt, const u8 *buf, size_t count)
|
||||
{
|
||||
int len;
|
||||
unsigned long irqflags;
|
||||
ssize_t len;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_HVC_DCC_SERIALIZE_SMP))
|
||||
return hvc_dcc_put_chars(vt, buf, count);
|
||||
@@ -219,10 +227,10 @@ static int hvc_dcc0_put_chars(u32 vt, const char *buf, int count)
|
||||
* Read characters directly from the DCC if we're on core 0 and the FIFO
|
||||
* is empty, or read them from the FIFO if we're not.
|
||||
*/
|
||||
static int hvc_dcc0_get_chars(u32 vt, char *buf, int count)
|
||||
static ssize_t hvc_dcc0_get_chars(u32 vt, u8 *buf, size_t count)
|
||||
{
|
||||
int len;
|
||||
unsigned long irqflags;
|
||||
ssize_t len;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_HVC_DCC_SERIALIZE_SMP))
|
||||
return hvc_dcc_get_chars(vt, buf, count);
|
||||
|
||||
@@ -215,11 +215,11 @@ static void destroy_tty_buffer_list(struct list_head *list)
|
||||
* If the IUCV path has been severed, then -EPIPE is returned to cause a
|
||||
* hang up (that is issued by the HVC layer).
|
||||
*/
|
||||
static int hvc_iucv_write(struct hvc_iucv_private *priv,
|
||||
char *buf, int count, int *has_more_data)
|
||||
static ssize_t hvc_iucv_write(struct hvc_iucv_private *priv,
|
||||
u8 *buf, size_t count, int *has_more_data)
|
||||
{
|
||||
struct iucv_tty_buffer *rb;
|
||||
int written;
|
||||
ssize_t written;
|
||||
int rc;
|
||||
|
||||
/* immediately return if there is no IUCV connection */
|
||||
@@ -312,10 +312,10 @@ out_written:
|
||||
* the routine locks the struct hvc_iucv_private->lock to call
|
||||
* helper functions.
|
||||
*/
|
||||
static int hvc_iucv_get_chars(uint32_t vtermno, char *buf, int count)
|
||||
static ssize_t hvc_iucv_get_chars(uint32_t vtermno, u8 *buf, size_t count)
|
||||
{
|
||||
struct hvc_iucv_private *priv = hvc_iucv_get_private(vtermno);
|
||||
int written;
|
||||
ssize_t written;
|
||||
int has_more_data;
|
||||
|
||||
if (count <= 0)
|
||||
@@ -352,8 +352,8 @@ static int hvc_iucv_get_chars(uint32_t vtermno, char *buf, int count)
|
||||
* If an existing IUCV communicaton path has been severed, -EPIPE is returned
|
||||
* (that can be passed to HVC layer to cause a tty hangup).
|
||||
*/
|
||||
static int hvc_iucv_queue(struct hvc_iucv_private *priv, const char *buf,
|
||||
int count)
|
||||
static ssize_t hvc_iucv_queue(struct hvc_iucv_private *priv, const u8 *buf,
|
||||
size_t count)
|
||||
{
|
||||
size_t len;
|
||||
|
||||
@@ -455,12 +455,12 @@ static void hvc_iucv_sndbuf_work(struct work_struct *work)
|
||||
* Locking: The method gets called under an irqsave() spinlock; and
|
||||
* locks struct hvc_iucv_private->lock.
|
||||
*/
|
||||
static int hvc_iucv_put_chars(uint32_t vtermno, const char *buf, int count)
|
||||
static ssize_t hvc_iucv_put_chars(uint32_t vtermno, const u8 *buf, size_t count)
|
||||
{
|
||||
struct hvc_iucv_private *priv = hvc_iucv_get_private(vtermno);
|
||||
int queued;
|
||||
|
||||
if (count <= 0)
|
||||
if (!count)
|
||||
return 0;
|
||||
|
||||
if (!priv)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user