* [PATCH 1/3] input/touchscreen: imagis: Clarify the usage of protocol_b
From: Raymond Hackley @ 2024-06-12 3:21 UTC (permalink / raw)
To: linux-kernel
Cc: Markuss Broks, Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Stephan Gerhold, Nikita Travkin, linux-input,
devicetree, ~postmarketos/upstreaming
In-Reply-To: <20240612032036.33103-1-raymondhackley@protonmail.com>
protocol_b is a property, which tells Imagis panel to use a different
format for coordinates.
IST30XXC series is known for using protocol B, while the other series
aren't. Note this could be confusing, unlike the model name implies.
Adjust the usage of protocol_b to avoid confusion.
Signed-off-by: Raymond Hackley <raymondhackley@protonmail.com>
---
drivers/input/touchscreen/imagis.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/drivers/input/touchscreen/imagis.c b/drivers/input/touchscreen/imagis.c
index 074dd6c342ec..886bcfc8497a 100644
--- a/drivers/input/touchscreen/imagis.c
+++ b/drivers/input/touchscreen/imagis.c
@@ -120,12 +120,12 @@ static irqreturn_t imagis_interrupt(int irq, void *dev_id)
for (i = 0; i < finger_count; i++) {
if (ts->tdata->protocol_b)
- error = imagis_i2c_read_reg(ts,
- ts->tdata->touch_coord_cmd, &finger_status);
- else
error = imagis_i2c_read_reg(ts,
ts->tdata->touch_coord_cmd + (i * 4),
&finger_status);
+ else
+ error = imagis_i2c_read_reg(ts,
+ ts->tdata->touch_coord_cmd, &finger_status);
if (error) {
dev_err(&ts->client->dev,
"failed to read coordinates for finger %d: %d\n",
@@ -394,6 +394,7 @@ static const struct imagis_properties imagis_3032c_data = {
.whoami_cmd = IST3038C_REG_CHIPID,
.whoami_val = IST3032C_WHOAMI,
.touch_keys_supported = true,
+ .protocol_b = true,
};
static const struct imagis_properties imagis_3038b_data = {
@@ -401,7 +402,6 @@ static const struct imagis_properties imagis_3038b_data = {
.touch_coord_cmd = IST3038B_REG_STATUS,
.whoami_cmd = IST3038B_REG_CHIPID,
.whoami_val = IST3038B_WHOAMI,
- .protocol_b = true,
};
static const struct imagis_properties imagis_3038c_data = {
@@ -409,6 +409,7 @@ static const struct imagis_properties imagis_3038c_data = {
.touch_coord_cmd = IST3038C_REG_TOUCH_COORD,
.whoami_cmd = IST3038C_REG_CHIPID,
.whoami_val = IST3038C_WHOAMI,
+ .protocol_b = true,
};
#ifdef CONFIG_OF
--
2.39.2
^ permalink raw reply related
* [PATCH 2/3] input/touchscreen: imagis: Add supports for Imagis IST3038
From: Raymond Hackley @ 2024-06-12 3:21 UTC (permalink / raw)
To: linux-kernel
Cc: Markuss Broks, Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Stephan Gerhold, Nikita Travkin, linux-input,
devicetree, ~postmarketos/upstreaming
In-Reply-To: <20240612032036.33103-1-raymondhackley@protonmail.com>
Imagis IST3038 is another variant of Imagis IST3038 IC, which has
a different register interface from IST3038C (possibly firmware defined).
Unlike IST3038C/IST3032C, IST3038 has different registers for commands,
which means IST3038 doesn't use protocol B.
Similar to IST3032C and maybe the other variants, IST3038 has touch keys
support, which provides KEY_APPSELECT and KEY_BACK.
Add support for IST3038 with touch keys.
Signed-off-by: Raymond Hackley <raymondhackley@protonmail.com>
---
drivers/input/touchscreen/imagis.c | 23 +++++++++++++++++++----
1 file changed, 19 insertions(+), 4 deletions(-)
diff --git a/drivers/input/touchscreen/imagis.c b/drivers/input/touchscreen/imagis.c
index 886bcfc8497a..b2f4bc60721d 100644
--- a/drivers/input/touchscreen/imagis.c
+++ b/drivers/input/touchscreen/imagis.c
@@ -12,9 +12,16 @@
#include <linux/property.h>
#include <linux/regulator/consumer.h>
+#define IST30XX_REG_STATUS 0x20
+#define IST30XX_REG_CHIPID (0x40000000 | IST3038C_DIRECT_ACCESS)
+#define IST30XX_WHOAMI 0x30003000
+#define IST30XXA_WHOAMI 0x300a300a
+#define IST30XXB_WHOAMI 0x300b300b
+#define IST3038_WHOAMI 0x30383038
+
#define IST3032C_WHOAMI 0x32c
+#define IST3038C_WHOAMI 0x38c
-#define IST3038B_REG_STATUS 0x20
#define IST3038B_REG_CHIPID 0x30
#define IST3038B_WHOAMI 0x30380b
@@ -25,7 +32,6 @@
#define IST3038C_REG_TOUCH_STATUS (IST3038C_REG_HIB_BASE | IST3038C_HIB_ACCESS)
#define IST3038C_REG_TOUCH_COORD (IST3038C_REG_HIB_BASE | IST3038C_HIB_ACCESS | 0x8)
#define IST3038C_REG_INTR_MESSAGE (IST3038C_REG_HIB_BASE | IST3038C_HIB_ACCESS | 0x4)
-#define IST3038C_WHOAMI 0x38c
#define IST3038C_CHIP_ON_DELAY_MS 60
#define IST3038C_I2C_RETRY_COUNT 3
#define IST3038C_MAX_FINGER_NUM 10
@@ -397,9 +403,17 @@ static const struct imagis_properties imagis_3032c_data = {
.protocol_b = true,
};
+static const struct imagis_properties imagis_3038_data = {
+ .interrupt_msg_cmd = IST30XX_REG_STATUS,
+ .touch_coord_cmd = IST30XX_REG_STATUS,
+ .whoami_cmd = IST30XX_REG_CHIPID,
+ .whoami_val = IST3038_WHOAMI,
+ .touch_keys_supported = true,
+};
+
static const struct imagis_properties imagis_3038b_data = {
- .interrupt_msg_cmd = IST3038B_REG_STATUS,
- .touch_coord_cmd = IST3038B_REG_STATUS,
+ .interrupt_msg_cmd = IST30XX_REG_STATUS,
+ .touch_coord_cmd = IST30XX_REG_STATUS,
.whoami_cmd = IST3038B_REG_CHIPID,
.whoami_val = IST3038B_WHOAMI,
};
@@ -415,6 +429,7 @@ static const struct imagis_properties imagis_3038c_data = {
#ifdef CONFIG_OF
static const struct of_device_id imagis_of_match[] = {
{ .compatible = "imagis,ist3032c", .data = &imagis_3032c_data },
+ { .compatible = "imagis,ist3038", .data = &imagis_3038_data },
{ .compatible = "imagis,ist3038b", .data = &imagis_3038b_data },
{ .compatible = "imagis,ist3038c", .data = &imagis_3038c_data },
{ },
--
2.39.2
^ permalink raw reply related
* [PATCH 3/3] dt-bindings: input/touchscreen: imagis: Document ist3038
From: Raymond Hackley @ 2024-06-12 3:21 UTC (permalink / raw)
To: linux-kernel
Cc: Markuss Broks, Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Stephan Gerhold, Nikita Travkin, linux-input,
devicetree, ~postmarketos/upstreaming
In-Reply-To: <20240612032036.33103-1-raymondhackley@protonmail.com>
Imagis IST3038 is a variant of Imagis touchscreen IC. Document it in
imagis,ist3038c bindings.
Signed-off-by: Raymond Hackley <raymondhackley@protonmail.com>
---
.../devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml b/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
index 77ba280b3bdc..2aea21bfe6ac 100644
--- a/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
+++ b/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
@@ -15,6 +15,7 @@ properties:
compatible:
enum:
+ - imagis,ist3038
- imagis,ist3032c
- imagis,ist3038b
- imagis,ist3038c
--
2.39.2
^ permalink raw reply related
* [PATCH v2] Input: adc-joystick - move axes data into the main structure
From: Dmitry Torokhov @ 2024-06-12 5:00 UTC (permalink / raw)
To: linux-input, Dan Carpenter; +Cc: Artur Rojek, Chris Morgan, linux-kernel
There is no need to allocate axes information separately from the main
joystick structure so let's fold the allocation and also drop members
(such as range, flat and fuzz) that are only used during initialization
of the device.
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
v2:
- fixed issue with uninitialized "axes" in adc_joystick_set_axes()
pointed out by Dan Carpenter
- fixed issue with checking wrong variable in adc_joystick_probe()
pointed out by Dan Carpenter
drivers/input/joystick/adc-joystick.c | 113 ++++++++++++++------------
1 file changed, 60 insertions(+), 53 deletions(-)
diff --git a/drivers/input/joystick/adc-joystick.c b/drivers/input/joystick/adc-joystick.c
index 916e78e4dc9f..1e30cbcd8c61 100644
--- a/drivers/input/joystick/adc-joystick.c
+++ b/drivers/input/joystick/adc-joystick.c
@@ -15,19 +15,15 @@
struct adc_joystick_axis {
u32 code;
- s32 range[2];
- s32 fuzz;
- s32 flat;
bool inverted;
};
struct adc_joystick {
struct input_dev *input;
struct iio_cb_buffer *buffer;
- struct adc_joystick_axis *axes;
struct iio_channel *chans;
- int num_chans;
- bool polled;
+ unsigned int num_chans;
+ struct adc_joystick_axis axes[] __counted_by(num_chans);
};
static int adc_joystick_invert(struct input_dev *dev,
@@ -135,9 +131,11 @@ static void adc_joystick_cleanup(void *data)
static int adc_joystick_set_axes(struct device *dev, struct adc_joystick *joy)
{
- struct adc_joystick_axis *axes;
+ struct adc_joystick_axis *axes = joy->axes;
struct fwnode_handle *child;
- int num_axes, error, i;
+ s32 range[2], fuzz, flat;
+ unsigned int num_axes;
+ int error, i;
num_axes = device_get_child_node_count(dev);
if (!num_axes) {
@@ -151,10 +149,6 @@ static int adc_joystick_set_axes(struct device *dev, struct adc_joystick *joy)
return -EINVAL;
}
- axes = devm_kmalloc_array(dev, num_axes, sizeof(*axes), GFP_KERNEL);
- if (!axes)
- return -ENOMEM;
-
device_for_each_child_node(dev, child) {
error = fwnode_property_read_u32(child, "reg", &i);
if (error) {
@@ -176,29 +170,25 @@ static int adc_joystick_set_axes(struct device *dev, struct adc_joystick *joy)
}
error = fwnode_property_read_u32_array(child, "abs-range",
- axes[i].range, 2);
+ range, 2);
if (error) {
dev_err(dev, "abs-range invalid or missing\n");
goto err_fwnode_put;
}
- if (axes[i].range[0] > axes[i].range[1]) {
+ if (range[0] > range[1]) {
dev_dbg(dev, "abs-axis %d inverted\n", i);
axes[i].inverted = true;
- swap(axes[i].range[0], axes[i].range[1]);
+ swap(range[0], range[1]);
}
- fwnode_property_read_u32(child, "abs-fuzz", &axes[i].fuzz);
- fwnode_property_read_u32(child, "abs-flat", &axes[i].flat);
+ fwnode_property_read_u32(child, "abs-fuzz", &fuzz);
+ fwnode_property_read_u32(child, "abs-flat", &flat);
input_set_abs_params(joy->input, axes[i].code,
- axes[i].range[0], axes[i].range[1],
- axes[i].fuzz, axes[i].flat);
- input_set_capability(joy->input, EV_ABS, axes[i].code);
+ range[0], range[1], fuzz, flat);
}
- joy->axes = axes;
-
return 0;
err_fwnode_put:
@@ -206,23 +196,49 @@ static int adc_joystick_set_axes(struct device *dev, struct adc_joystick *joy)
return error;
}
+
+/*
+ * Count how many channels we got. NULL terminated.
+ * Do not check the storage size if using polling.
+ */
+static int adc_joystick_count_channels(struct device *dev,
+ const struct iio_channel *chans,
+ bool polled,
+ unsigned int *num_chans)
+{
+ int bits;
+ int i;
+
+ for (i = 0; chans[i].indio_dev; i++) {
+ if (polled)
+ continue;
+ bits = chans[i].channel->scan_type.storagebits;
+ if (!bits || bits > 16) {
+ dev_err(dev, "Unsupported channel storage size\n");
+ return -EINVAL;
+ }
+ if (bits != chans[0].channel->scan_type.storagebits) {
+ dev_err(dev, "Channels must have equal storage size\n");
+ return -EINVAL;
+ }
+ }
+
+ return i;
+}
+
static int adc_joystick_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
+ struct iio_channel *chans;
struct adc_joystick *joy;
struct input_dev *input;
+ unsigned int poll_interval = 0;
+ unsigned int num_chans;
int error;
- int bits;
- int i;
- unsigned int poll_interval;
-
- joy = devm_kzalloc(dev, sizeof(*joy), GFP_KERNEL);
- if (!joy)
- return -ENOMEM;
- joy->chans = devm_iio_channel_get_all(dev);
- if (IS_ERR(joy->chans)) {
- error = PTR_ERR(joy->chans);
+ chans = devm_iio_channel_get_all(dev);
+ error = PTR_ERR_OR_ZERO(chans);
+ if (error) {
if (error != -EPROBE_DEFER)
dev_err(dev, "Unable to get IIO channels");
return error;
@@ -236,28 +252,19 @@ static int adc_joystick_probe(struct platform_device *pdev)
} else if (poll_interval == 0) {
dev_err(dev, "Unable to get poll-interval\n");
return -EINVAL;
- } else {
- joy->polled = true;
}
- /*
- * Count how many channels we got. NULL terminated.
- * Do not check the storage size if using polling.
- */
- for (i = 0; joy->chans[i].indio_dev; i++) {
- if (joy->polled)
- continue;
- bits = joy->chans[i].channel->scan_type.storagebits;
- if (!bits || bits > 16) {
- dev_err(dev, "Unsupported channel storage size\n");
- return -EINVAL;
- }
- if (bits != joy->chans[0].channel->scan_type.storagebits) {
- dev_err(dev, "Channels must have equal storage size\n");
- return -EINVAL;
- }
- }
- joy->num_chans = i;
+ error = adc_joystick_count_channels(dev, chans, poll_interval != 0,
+ &num_chans);
+ if (error)
+ return error;
+
+ joy = devm_kzalloc(dev, struct_size(joy, axes, num_chans), GFP_KERNEL);
+ if (!joy)
+ return -ENOMEM;
+
+ joy->chans = chans;
+ joy->num_chans = num_chans;
input = devm_input_allocate_device(dev);
if (!input) {
@@ -273,7 +280,7 @@ static int adc_joystick_probe(struct platform_device *pdev)
if (error)
return error;
- if (joy->polled) {
+ if (poll_interval != 0) {
input_setup_polling(input, adc_joystick_poll);
input_set_poll_interval(input, poll_interval);
} else {
--
2.45.2.505.gda0bf45e8d-goog
--
Dmitry
^ permalink raw reply related
* [PATCH] Input: wacom_w8001 - use "guard" notation when acquiring mutex
From: Dmitry Torokhov @ 2024-06-12 5:31 UTC (permalink / raw)
To: linux-input, Jason Gerecke; +Cc: linux-kernel
Switch the driver to use guard notation when acquiring mutex to
have it released automatically.
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/input/touchscreen/wacom_w8001.c | 22 ++++++++++------------
1 file changed, 10 insertions(+), 12 deletions(-)
diff --git a/drivers/input/touchscreen/wacom_w8001.c b/drivers/input/touchscreen/wacom_w8001.c
index c8abb9557ee8..ed2ca8a689d5 100644
--- a/drivers/input/touchscreen/wacom_w8001.c
+++ b/drivers/input/touchscreen/wacom_w8001.c
@@ -380,30 +380,28 @@ static int w8001_open(struct input_dev *dev)
struct w8001 *w8001 = input_get_drvdata(dev);
int err;
- err = mutex_lock_interruptible(&w8001->mutex);
- if (err)
- return err;
+ scoped_guard(mutex_intr, &w8001->mutex) {
+ if (w8001->open_count == 0) {
+ err = w8001_command(w8001, W8001_CMD_START, false);
+ if (err)
+ return err;
+ }
- if (w8001->open_count++ == 0) {
- err = w8001_command(w8001, W8001_CMD_START, false);
- if (err)
- w8001->open_count--;
+ w8001->open_count++;
+ return 0;
}
- mutex_unlock(&w8001->mutex);
- return err;
+ return -EINTR;
}
static void w8001_close(struct input_dev *dev)
{
struct w8001 *w8001 = input_get_drvdata(dev);
- mutex_lock(&w8001->mutex);
+ guard(mutex)(&w8001->mutex);
if (--w8001->open_count == 0)
w8001_command(w8001, W8001_CMD_STOP, false);
-
- mutex_unlock(&w8001->mutex);
}
static int w8001_detect(struct w8001 *w8001)
--
2.45.2.505.gda0bf45e8d-goog
--
Dmitry
^ permalink raw reply related
* [PATCH] Input: goodix_berlin - use __free() cleanup in SPI transport
From: Dmitry Torokhov @ 2024-06-12 5:42 UTC (permalink / raw)
To: Neil Armstrong; +Cc: linux-input, linux-kernel
Switch the driver to use __free(kfree) cleanup facility instead of
freeing memory by hand.
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/input/touchscreen/goodix_berlin_spi.c | 24 ++++++++++---------
1 file changed, 13 insertions(+), 11 deletions(-)
diff --git a/drivers/input/touchscreen/goodix_berlin_spi.c b/drivers/input/touchscreen/goodix_berlin_spi.c
index fe57390975ee..a2d80e84391b 100644
--- a/drivers/input/touchscreen/goodix_berlin_spi.c
+++ b/drivers/input/touchscreen/goodix_berlin_spi.c
@@ -36,13 +36,14 @@ static int goodix_berlin_spi_read(void *context, const void *reg_buf,
struct spi_transfer xfers;
struct spi_message spi_msg;
const u32 *reg = reg_buf; /* reg is stored as native u32 at start of buffer */
- u8 *buf;
int error;
if (reg_size != GOODIX_BERLIN_REGISTER_WIDTH)
return -EINVAL;
- buf = kzalloc(GOODIX_BERLIN_SPI_READ_PREFIX_LEN + val_size, GFP_KERNEL);
+ u8 *buf __free(kfree) =
+ kzalloc(GOODIX_BERLIN_SPI_READ_PREFIX_LEN + val_size,
+ GFP_KERNEL);
if (!buf)
return -ENOMEM;
@@ -62,12 +63,12 @@ static int goodix_berlin_spi_read(void *context, const void *reg_buf,
spi_message_add_tail(&xfers, &spi_msg);
error = spi_sync(spi, &spi_msg);
- if (error < 0)
+ if (error < 0) {
dev_err(&spi->dev, "spi transfer error, %d", error);
- else
- memcpy(val_buf, buf + GOODIX_BERLIN_SPI_READ_PREFIX_LEN, val_size);
+ return error;
+ }
- kfree(buf);
+ memcpy(val_buf, buf + GOODIX_BERLIN_SPI_READ_PREFIX_LEN, val_size);
return error;
}
@@ -79,10 +80,10 @@ static int goodix_berlin_spi_write(void *context, const void *data,
struct spi_transfer xfers;
struct spi_message spi_msg;
const u32 *reg = data; /* reg is stored as native u32 at start of buffer */
- u8 *buf;
int error;
- buf = kzalloc(GOODIX_BERLIN_SPI_WRITE_PREFIX_LEN + len, GFP_KERNEL);
+ u8 *buf __free(kfree) =
+ kzalloc(GOODIX_BERLIN_SPI_WRITE_PREFIX_LEN + len, GFP_KERNEL);
if (!buf)
return -ENOMEM;
@@ -100,11 +101,12 @@ static int goodix_berlin_spi_write(void *context, const void *data,
spi_message_add_tail(&xfers, &spi_msg);
error = spi_sync(spi, &spi_msg);
- if (error < 0)
+ if (error < 0) {
dev_err(&spi->dev, "spi transfer error, %d", error);
+ return error;
+ }
- kfree(buf);
- return error;
+ return 0;
}
static const struct regmap_config goodix_berlin_spi_regmap_conf = {
--
2.45.2.505.gda0bf45e8d-goog
--
Dmitry
^ permalink raw reply related
* Re: [RFC] HID: ishtp-hid-client: replace fake-flex arrays with flex-array members
From: srinivas pandruvada @ 2024-06-12 6:26 UTC (permalink / raw)
To: Erick Archer
Cc: Jiri Kosina, Benjamin Tissoires, Justin Stitt, Kees Cook,
Gustavo A. R. Silva, linux-input, linux-kernel, linux-hardening
In-Reply-To: <AS8PR02MB723798FF6CEF28DCB62FAC958BC42@AS8PR02MB7237.eurprd02.prod.outlook.com>
On Sat, 2024-06-08 at 11:56 +0200, Erick Archer wrote:
> Hi Srinivas,
> First of all, thanks for looking at this ;)
>
> On Sat, Jun 08, 2024 at 01:42:54AM -0700, srinivas pandruvada wrote:
> > On Sun, 2024-05-26 at 15:32 +0200, Erick Archer wrote:
> > > One-element arrays as fake flex arrays are deprecated [1] and we
> > > are
> > > moving towards adopting C99 flexible-array members, instead. This
> > > case
> > > also has more complexity because it is a flexible array of
> > > flexible
> > > arrays and this patch needs to be ready to enable the new
> > > compiler
> > > flag
> > > -Wflex-array-member-not-at-end (coming in GCC-14) globally.
> > >
> > > So, define a new struct type for the single reports:
> > >
> > > struct report {
> > > uint16_t size;
> > > struct hostif_msg_hdr msg;
> > > } __packed;
> > >
> > > but without the payload (flex array) in it. And add this payload
> > > to
> > > the
> > > "hostif_msg" structure. This way, in the "report_list" structure
> > > we
> > > can
> > > declare a flex array of single reports which now do not contain
> > > another
> > > flex array.
> > >
> > > struct report_list {
> > > [...]
> > > struct report reports[];
> > > } __packed;
> > >
> > > Also, use "container_of()" whenever we need to retrieve a pointer
> > > to
> > > the flexible structure, through which we can access the flexible
> > > array
> > > if needed.
> > >
> > > Moreover, refactor the code accordingly to use the new structures
> > > and
> > > take advantage of this avoiding some pointer arithmetic and using
> > > the
> > > "struct_size" helper when possible.
> > >
> > > This way, the code is more readable and safer.
> >
> > Applied and tested, atleast didn't break anything.
> >
> > But the explanation above didn't give me enough clue. You have
> > added a
> > payload[] in the struct hostif_msg {} then using that as a message
> > pointer following the header. I think this description needs to be
> > better.
>
> Yeah, I will try to improve the commit message. What do you think
> about
> the following parragrafs?
>
> [I have copied part of the message to show where the new info will
> be]
> > > declare a flex array of single reports which now do not contain
> > > another flex array.
> > >
> > > struct report_list {
> > > [...]
> > > struct report reports[];
> > > } __packed;
>
> Therefore, the "struct hostif_msg" is now made up of a header and a
> payload. And the "struct report" uses only the "hostif_msg" header.
> The perfect solution would be for the "report" structure to use the
> whole "hostif_msg" structure but this is not possible due to nested
> flexible arrays. Anyway, the end result is equivalent since this
> patch
> does attemp to change the behaviour of the code.
>
> Now as well, we have more clarity after the cast from the raw bytes
> to
> the new structures.
>
> > >
> > > Also, use "container_of()" whenever we need to retrieve a pointer
> > > to
> > > the flexible structure, through which we can access the flexible
> > > array
> > > if needed.
>
> I would like to know if it is enough :)
The apporoach is fine. But I don't like clubbing other changes like
struct_size(). That make code difficult to follow.
Thanks,
Srinivas
>
> Regards,
> Erick
> >
> > Thanks,
> > Srinivas
^ permalink raw reply
* Re: [PATCH 2/3] input/touchscreen: imagis: Add supports for Imagis IST3038
From: Krzysztof Kozlowski @ 2024-06-12 8:03 UTC (permalink / raw)
To: Raymond Hackley, linux-kernel
Cc: Markuss Broks, Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Stephan Gerhold, Nikita Travkin, linux-input,
devicetree, ~postmarketos/upstreaming
In-Reply-To: <20240612032036.33103-3-raymondhackley@protonmail.com>
On 12/06/2024 05:21, Raymond Hackley wrote:
> +
> static const struct imagis_properties imagis_3038b_data = {
> - .interrupt_msg_cmd = IST3038B_REG_STATUS,
> - .touch_coord_cmd = IST3038B_REG_STATUS,
> + .interrupt_msg_cmd = IST30XX_REG_STATUS,
> + .touch_coord_cmd = IST30XX_REG_STATUS,
> .whoami_cmd = IST3038B_REG_CHIPID,
> .whoami_val = IST3038B_WHOAMI,
> };
> @@ -415,6 +429,7 @@ static const struct imagis_properties imagis_3038c_data = {
> #ifdef CONFIG_OF
> static const struct of_device_id imagis_of_match[] = {
> { .compatible = "imagis,ist3032c", .data = &imagis_3032c_data },
> + { .compatible = "imagis,ist3038", .data = &imagis_3038_data },
Where is the binding? Compatibles must be documented BEFORE they are used.
Best regards,
Krzysztof
^ permalink raw reply
* Re: [PATCH 3/3] dt-bindings: input/touchscreen: imagis: Document ist3038
From: Krzysztof Kozlowski @ 2024-06-12 8:03 UTC (permalink / raw)
To: Raymond Hackley, linux-kernel
Cc: Markuss Broks, Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Stephan Gerhold, Nikita Travkin, linux-input,
devicetree, ~postmarketos/upstreaming
In-Reply-To: <20240612032036.33103-4-raymondhackley@protonmail.com>
On 12/06/2024 05:21, Raymond Hackley wrote:
> Imagis IST3038 is a variant of Imagis touchscreen IC. Document it in
> imagis,ist3038c bindings.
>
> Signed-off-by: Raymond Hackley <raymondhackley@protonmail.com>
> ---
> .../devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml b/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
> index 77ba280b3bdc..2aea21bfe6ac 100644
> --- a/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
> +++ b/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
> @@ -15,6 +15,7 @@ properties:
>
> compatible:
> enum:
> + - imagis,ist3038
> - imagis,ist3032c
Don't add entries in random order. Keep alphabetical order.
Best regards,
Krzysztof
^ permalink raw reply
* Re: [PATCH v3] HID: hid-goodix: Add Goodix HID-over-SPI driver
From: Charles Wang @ 2024-06-12 10:30 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: jikos, bentiss, hbarnor, dianders, linux-input, linux-kernel
In-Reply-To: <ZmNYepAl9mdz9hKG@google.com>
Hi Dmitry,
Thank you very much for your kind review and advice.
On Fri, Jun 07, 2024 at 11:59:06AM -0700, Dmitry Torokhov wrote:
> > +struct goodix_ts_data {
> > + struct device *dev;
> > + struct spi_device *spi;
> > + struct hid_device *hid;
> > + struct goodix_hid_desc hid_desc;
> > +
> > + struct gpio_desc *reset_gpio;
> > + u32 hid_report_addr;
> > +
> > + /* lock for hid raw request operation */
> > + struct mutex hid_request_lock;
> > + /* lock for reg read write operations */
> > + struct mutex reg_rw_lock;
> > + u32 spi_xfer_max_sz;
> > + /* buffer used to store hid report event */
> > + u8 event_buf[SZ_4K] ____cacheline_aligned;
>
> Why does this have to be cacheline aligned? I do not think it is
> directly involved in the transfers.
>
Yes, you are right; sorry for the misuse.
> Also, 4K is quite a bit of data. How often does the device send more
> than 1 report? Maybe you should do what i2c-hid does and scan reports
> for the maximum report size and use it to allocate sufficiently sized
> buffer(s)? See drivers/hid/i2c-hid/i2c-hid-core.c::i2c_hid_start().
>
The device sends heatmap data along with touch reports whenever there is a
touch event. The length of the heatmap data is not fixed; it varies depending
on the screen size and the number of touch points. Even though we know the
input data length won't exceed 4K bytes, parsing the reports to determine
the maximum length seems more reasonable. I will change this to allocate
memory accordingly, rather than using the fixed 4K length.
> > + /* buffer used to do spi data transfer */
> > + u8 xfer_buf[GOODIX_HID_MAX_PKG_SIZE] ____cacheline_aligned;
> > +};
> > +
> > +static int goodix_spi_read(struct goodix_ts_data *ts, u32 addr,
> > + u8 *data, unsigned int len)
>
> Maybe make data void * so callers do not need to cast? Also maybe size_t
> for len?
>
Ack.
> > +{
> > + struct spi_device *spi = to_spi_device(&ts->spi->dev);
> > + struct spi_transfer xfers;
> > + struct spi_message spi_msg;
> > + int error;
> > +
> > + if (GOODIX_SPI_READ_PREFIX_LEN + len > ts->spi_xfer_max_sz) {
> > + dev_err(ts->dev, "read data len exceed limit %d",
> > + ts->spi_xfer_max_sz - GOODIX_SPI_READ_PREFIX_LEN);
> > + return -EINVAL;
> > + }
> > +
> > + mutex_lock(&ts->reg_rw_lock);
>
> This can be written as
>
> guard(mutex)(&ts->reg_rw_lock);
>
> and you do not need to explicitly unlock the mutex at the end of the
> function. You can also safely return early and the mutex will be
> unlocked.
>
Ack, this is great.
> > + /* buffer format: 0xF1 + addr(4bytes) + dummy(3bytes) + data */
> > + ts->xfer_buf[0] = GOODIX_SPI_READ_FLAG;
> > + put_unaligned_be32(addr, ts->xfer_buf + GOODIX_SPI_TRANS_PREFIX_LEN);
> > +
> > + spi_message_init(&spi_msg);
> > + memset(&xfers, 0, sizeof(xfers));
> > + xfers.tx_buf = ts->xfer_buf;
> > + xfers.rx_buf = ts->xfer_buf;
> > + xfers.len = GOODIX_SPI_READ_PREFIX_LEN + len;
> > + spi_message_add_tail(&xfers, &spi_msg);
> > +
> > + error = spi_sync(spi, &spi_msg);
> > + if (error)
> > + dev_err(ts->dev, "spi transfer error:%d", error);
>
> "error: %d"
>
Ack.
> > + else
> > + memcpy(data, ts->xfer_buf + GOODIX_SPI_READ_PREFIX_LEN, len);
> > +
> > + mutex_unlock(&ts->reg_rw_lock);
> > + return error;
> > +}
> > +
> > +static int goodix_spi_write(struct goodix_ts_data *ts, u32 addr,
> > + u8 *data, unsigned int len)
>
> const void *data
>
Ack.
> > +{
> > + struct spi_device *spi = to_spi_device(&ts->spi->dev);
> > + struct spi_transfer xfers;
> > + struct spi_message spi_msg;
> > + int error;
> > +
> > + if (GOODIX_SPI_WRITE_PREFIX_LEN + len > ts->spi_xfer_max_sz) {
> > + dev_err(ts->dev, "write data len exceed limit %d",
> > + ts->spi_xfer_max_sz - GOODIX_SPI_WRITE_PREFIX_LEN);
> > + return -EINVAL;
> > + }
> > +
> > + mutex_lock(&ts->reg_rw_lock);
>
> guard(mutex)(&ts->reg_rw_lock);
>
Ack.
> > + /* buffer format: 0xF0 + addr(4bytes) + data */
> > + ts->xfer_buf[0] = GOODIX_SPI_WRITE_FLAG;
> > + put_unaligned_be32(addr, ts->xfer_buf + GOODIX_SPI_TRANS_PREFIX_LEN);
> > + memcpy(ts->xfer_buf + GOODIX_SPI_WRITE_PREFIX_LEN, data, len);
> > +
> > + spi_message_init(&spi_msg);
> > + memset(&xfers, 0, sizeof(xfers));
> > + xfers.tx_buf = ts->xfer_buf;
> > + xfers.len = GOODIX_SPI_WRITE_PREFIX_LEN + len;
> > + spi_message_add_tail(&xfers, &spi_msg);
> > +
> > + error = spi_sync(spi, &spi_msg);
> > + if (error)
> > + dev_err(ts->dev, "spi transfer error:%d", error);
> > +
> > + mutex_unlock(&ts->reg_rw_lock);
> > + return error;
> > +}
> > +
> > +static int goodix_dev_confirm(struct goodix_ts_data *ts)
> > +{
> > + u8 tx_buf[8], rx_buf[8];
> > + int retry = 3;
> > + int error;
> > +
> > + gpiod_set_value_cansleep(ts->reset_gpio, 0);
> > + usleep_range(4000, 4100);
> > +
> > + memset(tx_buf, GOODIX_DEV_CONFIRM_VAL, sizeof(tx_buf));
> > + while (retry--) {
> > + error = goodix_spi_write(ts, GOODIX_DEV_CONFIRM_ADDR,
> > + tx_buf, sizeof(tx_buf));
> > + if (error)
> > + return error;
> > +
> > + error = goodix_spi_read(ts, GOODIX_DEV_CONFIRM_ADDR,
> > + rx_buf, sizeof(rx_buf));
> > + if (error)
> > + return error;
> > +
> > + if (!memcmp(tx_buf, rx_buf, sizeof(tx_buf)))
> > + return 0;
> > +
> > + usleep_range(5000, 5100);
> > + }
> > +
> > + dev_err(ts->dev, "device confirm failed, rx_buf:%*ph", 8, rx_buf);
> > + return -EINVAL;
> > +}
> > +
> > +/**
> > + * goodix_hid_parse() - hid-core .parse() callback
> > + * @hid: hid device instance
> > + *
> > + * This function gets called during call to hid_add_device
> > + *
> > + * Return: 0 on success and non zero on error
> > + */
> > +static int goodix_hid_parse(struct hid_device *hid)
> > +{
> > + struct goodix_ts_data *ts = hid->driver_data;
> > + u8 *rdesc __free(kfree);
>
> This is not proper use of this. rdesc will contain garbage (not NULL),
> so if rsize check below failed we'll get a nasty surprise.
>
Ack, thanks.
> > + u16 rsize;
> > + int error;
> > +
> > + rsize = le16_to_cpu(ts->hid_desc.report_desc_lenght);
> > + if (!rsize || rsize > HID_MAX_DESCRIPTOR_SIZE) {
> > + dev_err(ts->dev, "invalid report desc size %d", rsize);
> > + return -EINVAL;
> > + }
> > +
> > + rdesc = kzalloc(rsize, GFP_KERNEL);
> > + if (!rdesc)
> > + return -ENOMEM;
>
> Linus said that for pointers annotated with __free() he prefers
> combining declaration with allocation, like this:
>
> u8 *rdesc __free(kfree) = kzalloc(rsize, GFP_KERNEL);
> if (!rdesc)
> return -ENOMEM;
>
Ack.
> > +
> > + error = goodix_spi_read(ts, GOODIX_HID_REPORT_DESC_ADDR, rdesc, rsize);
> > + if (error) {
> > + dev_err(ts->dev, "failed get report desc, %d", error);
> > + return error;
> > + }
> > +
> > + error = hid_parse_report(hid, rdesc, rsize);
> > + if (error)
> > + dev_err(ts->dev, "failed parse report, %d", error);
> > +
> > + return error;
>
> I am not sure what Benjamin and Jiri prefer, but my preference is to
> explicitly return error or 0 instead of returning "error" in both
> success and failure cases, especially when there are multiple failure
> points in a function. So:
>
> error = hid_parse_report(hid, rdesc, rsize);
> if (error) {
> dev_err(ts->dev, "failed parse report, %d", error);
> return error;
> }
>
> return 0;
>
Ack. Return 0 here seems clearer than returning "error".
> > +}
> > +
> > +/* Empty callbacks with success return code */
> > +static int goodix_hid_start(struct hid_device *hid)
> > +{
> > + return 0;
> > +}
> > +
> > +static void goodix_hid_stop(struct hid_device *hid)
> > +{
> > +}
> > +
> > +static int goodix_hid_open(struct hid_device *hid)
> > +{
> > + return 0;
> > +}
> > +
> > +static void goodix_hid_close(struct hid_device *hid)
> > +{
> > +}
> > +
> > +/* Return date length of response data */
> > +static int goodix_hid_check_ack_status(struct goodix_ts_data *ts)
> > +{
> > + struct goodix_hid_report_header hdr;
> > + int retry = 20;
> > + int error;
> > +
> > + while (retry--) {
> > + /*
> > + * 3 bytes of hid request response data
> > + * - byte 0: Ack flag, value of 1 for data ready
> > + * - bytes 1-2: Response data length
> > + */
> > + error = goodix_spi_read(ts, ts->hid_report_addr,
> > + (u8 *)&hdr, sizeof(hdr));
> > + if (!error && (hdr.flag & GOODIX_HID_ACK_READY_FLAG))
> > + return le16_to_cpu(hdr.size);
> > +
> > + /* Wait 10ms for another try */
> > + usleep_range(10000, 11000);
> > + }
> > +
> > + return -EINVAL;
> > +}
> > +
> > +/**
> > + * goodix_hid_get_raw_report() - Process hidraw GET REPORT operation
> > + * @hid: hid device instance
> > + * @reportnum: Report ID
> > + * @buf: Buffer for store the reprot date
> > + * @len: Length fo reprot data
> > + * @report_type: Report type
> > + *
> > + * The function for hid_ll_driver.get_raw_report to handle the HIDRAW ioctl
> > + * get report request. The transmitted data follows the standard i2c-hid
> > + * protocol with a specified header.
> > + *
> > + * Return: The length of the data in the buf on success, negative error code
> > + */
> > +static int goodix_hid_get_raw_report(struct hid_device *hid,
> > + unsigned char reportnum,
> > + __u8 *buf, size_t len,
> > + unsigned char report_type)
>
> I think u8 for report type is better. It is not a character but a
> number.
>
Ack.
> > +{
> > + struct goodix_ts_data *ts = hid->driver_data;
> > + u16 data_register = le16_to_cpu(ts->hid_desc.data_register);
> > + u16 cmd_register = le16_to_cpu(ts->hid_desc.cmd_register);
> > + u8 tmp_buf[GOODIX_HID_MAX_INBUF_SIZE];
> > + int tx_len = 0, args_len = 0;
> > + int response_data_len;
> > + u8 args[3];
> > + int error;
> > +
> > + if (report_type == HID_OUTPUT_REPORT)
> > + return -EINVAL;
> > +
> > + if (reportnum == 3) {
> > + /* Get win8 signature data */
> > + error = goodix_spi_read(ts, GOODIX_HID_SIGN_ADDR, buf, len);
> > + if (error) {
> > + dev_err(ts->dev, "failed get win8 sign:%d", error);
> > + return -EINVAL;
> > + }
> > + return len;
> > + }
> > +
> > + if (reportnum >= 0x0F)
> > + args[args_len++] = reportnum;
> > +
> > + put_unaligned_le16(data_register, args + args_len);
> > + args_len += sizeof(data_register);
> > +
> > + /* Clean 3 bytes of hid ack header data */
> > + memset(tmp_buf, 0, GOODIX_HID_ACK_HEADER_SIZE);
> > + tx_len += GOODIX_HID_ACK_HEADER_SIZE;
> > +
> > + put_unaligned_le16(cmd_register, tmp_buf + tx_len);
> > + tx_len += sizeof(cmd_register);
> > +
> > + tmp_buf[tx_len] = (report_type == HID_FEATURE_REPORT ? 0x03 : 0x01) << 4;
> > + tmp_buf[tx_len] |= reportnum >= 0x0F ? 0x0F : reportnum;
> > + tx_len++;
> > +
> > + tmp_buf[tx_len++] = GOODIX_HID_GET_REPORT_CMD;
> > +
> > + memcpy(tmp_buf + tx_len, args, args_len);
> > + tx_len += args_len;
> > +
> > + /* Step1: write report request info */
> > + error = goodix_spi_write(ts, ts->hid_report_addr, tmp_buf, tx_len);
> > + if (error) {
> > + dev_err(ts->dev, "failed send read feature cmd, %d", error);
> > + return error;
> > + }
> > +
> > + /* No need read response data */
> > + if (!len)
> > + return 0;
> > +
> > + /* Step2: check response data status */
> > + response_data_len = goodix_hid_check_ack_status(ts);
> > + if (response_data_len <= GOODIX_HID_PKG_LEN_SIZE)
> > + return -EINVAL;
> > +
> > + len = min(len, response_data_len - GOODIX_HID_PKG_LEN_SIZE);
> > + /* Step3: read response data(skip 2bytes of hid pkg length) */
> > + error = goodix_spi_read(ts, ts->hid_report_addr +
> > + GOODIX_HID_ACK_HEADER_SIZE +
> > + GOODIX_HID_PKG_LEN_SIZE, buf, len);
> > + if (error) {
> > + dev_err(ts->dev, "failed read hid response data, %d", error);
> > + return error;
> > + }
> > +
> > + if (buf[0] != reportnum) {
> > + dev_err(ts->dev, "incorrect reprot (%d vs %d expected)",
>
> s/reprot/report/
>
Ack.
> > + buf[0], reportnum);
> > + return -EINVAL;
> > + }
> > + return len;
> > +}
> > +
> > +/**
> > + * goodix_hid_set_raw_report() - process hidraw SET REPORT operation
> > + * @hid: HID device
> > + * @reportnum: Report ID
> > + * @buf: Buffer for communication
> > + * @len: Length of data in the buffer
> > + * @report_type: Report type
> > + *
> > + * The function for hid_ll_driver.get_raw_report to handle the HIDRAW ioctl
> > + * set report request. The transmitted data follows the standard i2c-hid
> > + * protocol with a specified header.
> > + *
> > + * Return: The length of the data sent, negative error code on failure
> > + */
> > +static int goodix_hid_set_raw_report(struct hid_device *hid,
> > + unsigned char reportnum,
> > + __u8 *buf, size_t len,
> > + unsigned char report_type)
> > +{
> > + struct goodix_ts_data *ts = hid->driver_data;
> > + u16 data_register = le16_to_cpu(ts->hid_desc.data_register);
> > + u16 cmd_register = le16_to_cpu(ts->hid_desc.cmd_register);
> > + int tx_len = 0, args_len = 0;
> > + u8 tmp_buf[GOODIX_HID_MAX_INBUF_SIZE];
> > + u8 args[5];
> > + int error;
> > +
> > + if (reportnum >= 0x0F) {
> > + args[args_len++] = reportnum;
> > + reportnum = 0x0F;
> > + }
> > +
> > + put_unaligned_le16(data_register, args + args_len);
> > + args_len += sizeof(data_register);
> > +
> > + put_unaligned_le16(GOODIX_HID_PKG_LEN_SIZE + len, args + args_len);
> > + args_len += GOODIX_HID_PKG_LEN_SIZE;
> > +
> > + /* Clean 3 bytes of hid ack header data */
> > + memset(tmp_buf, 0, GOODIX_HID_ACK_HEADER_SIZE);
> > + tx_len += GOODIX_HID_ACK_HEADER_SIZE;
> > +
> > + put_unaligned_le16(cmd_register, tmp_buf + tx_len);
> > + tx_len += sizeof(cmd_register);
> > +
> > + tmp_buf[tx_len++] = ((report_type == HID_FEATURE_REPORT ? 0x03 : 0x02) << 4) | reportnum;
> > + tmp_buf[tx_len++] = GOODIX_HID_SET_REPORT_CMD;
> > +
> > + memcpy(tmp_buf + tx_len, args, args_len);
> > + tx_len += args_len;
> > +
> > + memcpy(tmp_buf + tx_len, buf, len);
> > + tx_len += len;
> > +
> > + error = goodix_spi_write(ts, ts->hid_report_addr, tmp_buf, tx_len);
> > + if (error) {
> > + dev_err(ts->dev, "failed send report %*ph", tx_len, tmp_buf);
> > + return error;
> > + }
> > + return len;
> > +}
> > +
> > +static int goodix_hid_raw_request(struct hid_device *hid,
> > + unsigned char reportnum,
> > + __u8 *buf, size_t len,
> > + unsigned char rtype, int reqtype)
> > +{
> > + struct goodix_ts_data *ts = hid->driver_data;
> > + int error = -EINVAL;
> > +
> > + mutex_lock(&ts->hid_request_lock);
>
> guard(mutex)(&ts->hid_request_lock);
>
Ack.
> > + switch (reqtype) {
> > + case HID_REQ_GET_REPORT:
> > + error = goodix_hid_get_raw_report(hid, reportnum, buf,
> > + len, rtype);
> > + break;
> > + case HID_REQ_SET_REPORT:
> > + if (buf[0] == reportnum)
> > + error = goodix_hid_set_raw_report(hid, reportnum,
> > + buf, len, rtype);
> > + break;
> > + default:
> > + break;
> > + }
> > + mutex_unlock(&ts->hid_request_lock);
> > +
> > + return error;
> > +}
> > +
> > +static struct hid_ll_driver goodix_hid_ll_driver = {
> > + .parse = goodix_hid_parse,
> > + .start = goodix_hid_start,
> > + .stop = goodix_hid_stop,
> > + .open = goodix_hid_open,
> > + .close = goodix_hid_close,
> > + .raw_request = goodix_hid_raw_request
> > +};
> > +
> > +static irqreturn_t goodix_hid_irq(int irq, void *data)
> > +{
> > + struct goodix_ts_data *ts = data;
> > + struct goodix_hid_report_event event;
> > + struct goodix_hid_report_package *pkg;
> > + u16 report_size;
> > + int error;
> > +
> > + /*
> > + * First, read buffer with space for header and coordinate package:
> > + * - event header = 3 bytes
> > + * - coordinate event = GOODIX_HID_COOR_PKG_LEN bytes
> > + *
> > + * If the data size info in the event header exceeds
> > + * GOODIX_HID_COOR_PKG_LEN, it means that there are other packages
> > + * besides the coordinate package.
> > + */
> > + error = goodix_spi_read(ts, ts->hid_report_addr, (u8 *)&event,
>
> Drop cast.
>
Ack.
> > + sizeof(event));
> > + if (error) {
> > + dev_err(ts->dev, "failed get coordinate data, %d", error);
> > + return IRQ_HANDLED;
> > + }
> > +
> > + /* Check coordinate data valid falg */
> > + if (event.hdr.flag != GOODIX_HID_REPORT_READY_FLAG) {
> > + dev_err(ts->dev, "invalid event flag 0x%x", event.hdr.flag);
> > + return IRQ_HANDLED;
> > + }
> > +
> > + pkg = (struct goodix_hid_report_package *)event.data;
> > + hid_input_report(ts->hid, HID_INPUT_REPORT, pkg->data,
> > + le16_to_cpu(pkg->size) - GOODIX_HID_PKG_LEN_SIZE, 1);
> > +
> > + report_size = le16_to_cpu(event.hdr.size);
> > + /* Check if there are other packages */
> > + if (report_size <= GOODIX_HID_COOR_PKG_LEN)
> > + return IRQ_HANDLED;
> > +
> > + if (report_size - GOODIX_HID_COOR_PKG_LEN > sizeof(ts->event_buf)) {
> > + dev_err(ts->dev, "invalid package size, %d", report_size);
> > + return IRQ_HANDLED;
> > + }
> > +
> > + /* Read the package behind the coordinate data */
> > + error = goodix_spi_read(ts, ts->hid_report_addr + sizeof(event),
> > + ts->event_buf,
> > + report_size - GOODIX_HID_COOR_PKG_LEN);
> > + if (error) {
> > + dev_err(ts->dev, "failed read data, %d", error);
> > + return IRQ_HANDLED;
> > + }
> > +
> > + pkg = (struct goodix_hid_report_package *)ts->event_buf;
> > + hid_input_report(ts->hid, HID_INPUT_REPORT, pkg->data,
> > + le16_to_cpu(pkg->size) - GOODIX_HID_PKG_LEN_SIZE, 1);
> > +
> > + return IRQ_HANDLED;
> > +}
> > +
> > +static int goodix_hid_init(struct goodix_ts_data *ts)
> > +{
> > + struct hid_device *hid;
> > + int error;
> > +
> > + /* Get hid descriptor */
> > + error = goodix_spi_read(ts, GOODIX_HID_DESC_ADDR, (u8 *)&ts->hid_desc,
>
> Drop cast.
>
Ack.
> > + sizeof(ts->hid_desc));
> > + if (error) {
> > + dev_err(ts->dev, "failed get hid desc, %d", error);
> > + return error;
> > + }
> > +
> > + hid = hid_allocate_device();
> > + if (IS_ERR(hid))
> > + return PTR_ERR(hid);
> > +
> > + hid->driver_data = ts;
> > + hid->ll_driver = &goodix_hid_ll_driver;
> > + hid->bus = BUS_SPI;
> > + hid->dev.parent = &ts->spi->dev;
> > +
> > + hid->version = le16_to_cpu(ts->hid_desc.bcd_version);
> > + hid->vendor = le16_to_cpu(ts->hid_desc.vendor_id);
> > + hid->product = le16_to_cpu(ts->hid_desc.product_id);
> > + snprintf(hid->name, sizeof(hid->name), "%s %04X:%04X", "hid-gdix",
> > + hid->vendor, hid->product);
> > +
> > + error = hid_add_device(hid);
> > + if (error) {
> > + dev_err(ts->dev, "failed add hid device, %d", error);
> > + hid_destroy_device(hid);
> > + return error;
> > + }
> > +
> > + ts->hid = hid;
> > + return 0;
> > +}
> > +
> > +static int goodix_spi_probe(struct spi_device *spi)
> > +{
> > + struct device *dev = &spi->dev;
> > + struct goodix_ts_data *ts;
> > + int error;
> > +
> > + /* init spi_device */
> > + spi->mode = SPI_MODE_0;
> > + spi->bits_per_word = 8;
> > + error = spi_setup(spi);
> > + if (error)
> > + return error;
> > +
> > + ts = devm_kzalloc(dev, sizeof(*ts), GFP_KERNEL);
> > + if (!ts)
> > + return -ENOMEM;
> > +
> > + mutex_init(&ts->hid_request_lock);
> > + mutex_init(&ts->reg_rw_lock);
> > + spi_set_drvdata(spi, ts);
> > + if (spi->controller->max_transfer_size)
> > + ts->spi_xfer_max_sz = spi->controller->max_transfer_size(spi);
> > + else
> > + ts->spi_xfer_max_sz = GOODIX_HID_MAX_PKG_SIZE;
> > +
> > + ts->spi_xfer_max_sz = min(GOODIX_HID_MAX_PKG_SIZE, ts->spi_xfer_max_sz);
> > + ts->spi = spi;
> > + ts->dev = dev;
> > + ts->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
> > + if (IS_ERR(ts->reset_gpio))
> > + return dev_err_probe(dev, PTR_ERR(ts->reset_gpio),
> > + "failed to request reset gpio\n");
> > +
> > + error = device_property_read_u32(dev, "hid-report-addr",
> > + &ts->hid_report_addr);
>
> This will require device binding document. Well, we needed it anyway to
> describe the reset GPIO. You should add regulator handling as well.
>
Ack. I will add the reset GPIO and "hid-report-addr" to the device binding
document. However, regarding the regulator handling, on my x86 platform,
the device regulator is controlled through ACPI. I think we can address
the regulator information in the future when it becomes necessary to control
it within the driver.
> > + if (error)
> > + return dev_err_probe(dev, error,
> > + "failed get hid report addr\n");
> > +
> > + error = goodix_dev_confirm(ts);
> > + if (error)
> > + return error;
> > +
> > + /* Waits 150ms for firmware to fully boot */
> > + msleep(GOODIX_NORMAL_RESET_DELAY_MS);
> > +
> > + error = goodix_hid_init(ts);
> > + if (error) {
> > + dev_err(dev, "failed init hid device");
> > + return error;
> > + }
> > +
> > + error = devm_request_threaded_irq(&ts->spi->dev, ts->spi->irq,
> > + NULL, goodix_hid_irq, IRQF_ONESHOT,
> > + "goodix_spi_hid", ts);
>
> I think we still have an issue. The hid device is "added" to hid bus in
> goodix_hid_init(). Immediately HID bus will attempt to match the HID
> device and HID driver, start the low level transport (i.e. us), and try
> to interrogate and initiate the device. That means that interrupts need
> to be working already. However we only request IRQ after returning from
> goodix_hid_init(), which is too late.
>
> Please take a look at how i2c-hid driver allocates HID device, requests
> IRQ, and then calls to hid_add_device(). Also see how it checks for
> I2C_HID_STARTED flags in the interrupt routine to see of the data needs
> to be reported to the HID subsystem.
>
After re-checking the i2c-hid driver, I found that there is only one scenario
where interrupts need to be functional already, which is while waiting for
the hardware reset done event.
In our case, this confirmation mechanism is not necessary. Once the
GOODIX_NORMAL_RESET_DELAY_MS delay is complete, the device is fully ready
without requiring an additional hardware reset to confirm its status.
Therefore, enabling the IRQ service after hid_add_device() should be safe.
> > + if (error < 0) {
>
> if (error)
>
Ack.
> > + dev_err(ts->dev, "could not register interrupt, irq = %d, %d",
> > + ts->spi->irq, error);
> > + goto err_destroy_hid;
> > + }
> > +
> > + return 0;
> > +
> > +err_destroy_hid:
> > + hid_destroy_device(ts->hid);
> > + return error;
> > +}
> > +
> > +static void goodix_spi_remove(struct spi_device *spi)
> > +{
> > + struct goodix_ts_data *ts = spi_get_drvdata(spi);
> > +
> > + disable_irq(spi->irq);
> > + hid_destroy_device(ts->hid);
>
> Here we again need to make sure interrupts are working while the device
> is being used but the HID subsystem, but make sure we are not trying to
> service interrupts once device is fully gone.
>
Same as above. I think keeping the interrupts working is unnecessary in
this case.
> > +}
> > +
> > +static void goodix_spi_shutdown(struct spi_device *spi)
> > +{
> > + struct goodix_ts_data *ts = spi_get_drvdata(spi);
> > +
> > + disable_irq(spi->irq);
> > + hid_destroy_device(ts->hid);
>
> Same as above.
>
Same as above.
> > +}
> > +
> > +#ifdef CONFIG_ACPI
> > +static const struct acpi_device_id goodix_spi_acpi_match[] = {
> > + { "GXTS7986" },
> > + { },
> > +};
> > +MODULE_DEVICE_TABLE(acpi, goodix_spi_acpi_match);
> > +#endif
> > +
> > +static struct spi_driver goodix_spi_driver = {
> > + .driver = {
> > + .name = "goodix-spi-hid",
> > + .acpi_match_table = ACPI_PTR(goodix_spi_acpi_match),
> > + },
> > + .probe = goodix_spi_probe,
> > + .remove = goodix_spi_remove,
> > + .shutdown = goodix_spi_shutdown,
> > +};
> > +module_spi_driver(goodix_spi_driver);
> > +
> > +MODULE_DESCRIPTION("Goodix SPI driver for HID touchscreen");
> > +MODULE_AUTHOR("Goodix, Inc.");
> > +MODULE_LICENSE("GPL");
> > --
> > 2.43.0
> >
>
Thanks
Charles
^ permalink raw reply
* Re: [PATCH v3] HID: hid-goodix: Add Goodix HID-over-SPI driver
From: Charles Wang @ 2024-06-12 10:43 UTC (permalink / raw)
To: Dan Carpenter
Cc: dmitry.torokhov, jikos, bentiss, lkp, oe-kbuild-all, hbarnor,
dianders, linux-input, linux-kernel
In-Reply-To: <030b639e-f5d1-40a2-8980-f436ca686e6e@moroto.mountain>
Hi Dan,
Thank you. Dmitry has pointed this out.
Charles.
On Mon, Jun 10, 2024 at 12:39:54PM +0300, Dan Carpenter wrote:
> Hi Charles,
>
> kernel test robot noticed the following build warnings:
>
> https://git-scm.com/docs/git-format-patch#_base_tree_information]
>
> url: https://github.com/intel-lab-lkp/linux/commits/Charles-Wang/HID-hid-goodix-Add-Goodix-HID-over-SPI-driver/20240607-214042
> base: https://git.kernel.org/pub/scm/linux/kernel/git/hid/hid.git for-next
> patch link: https://lore.kernel.org/r/20240607133709.3518-1-charles.goodix%40gmail.com
> patch subject: [PATCH v3] HID: hid-goodix: Add Goodix HID-over-SPI driver
> config: sparc64-randconfig-r071-20240609 (https://download.01.org/0day-ci/archive/20240610/202406101633.1RJnij1Y-lkp@intel.com/config)
> compiler: sparc64-linux-gcc (GCC) 13.2.0
>
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
> | Closes: https://lore.kernel.org/r/202406101633.1RJnij1Y-lkp@intel.com/
>
> smatch warnings:
> drivers/hid/hid-goodix-spi.c:217 goodix_hid_parse() error: uninitialized symbol 'rdesc'.
>
> vim +/rdesc +217 drivers/hid/hid-goodix-spi.c
>
> bb11c3a1740813 Charles Wang 2024-06-07 214 static int goodix_hid_parse(struct hid_device *hid)
> bb11c3a1740813 Charles Wang 2024-06-07 215 {
> bb11c3a1740813 Charles Wang 2024-06-07 216 struct goodix_ts_data *ts = hid->driver_data;
> bb11c3a1740813 Charles Wang 2024-06-07 @217 u8 *rdesc __free(kfree);
> bb11c3a1740813 Charles Wang 2024-06-07 218 u16 rsize;
> bb11c3a1740813 Charles Wang 2024-06-07 219 int error;
> bb11c3a1740813 Charles Wang 2024-06-07 220
> bb11c3a1740813 Charles Wang 2024-06-07 221 rsize = le16_to_cpu(ts->hid_desc.report_desc_lenght);
> bb11c3a1740813 Charles Wang 2024-06-07 222 if (!rsize || rsize > HID_MAX_DESCRIPTOR_SIZE) {
> bb11c3a1740813 Charles Wang 2024-06-07 223 dev_err(ts->dev, "invalid report desc size %d", rsize);
> bb11c3a1740813 Charles Wang 2024-06-07 224 return -EINVAL;
> ^^^^^^^^^^^^^^^
> rdesc isn't initialized here. It should be declared as:
>
> u8 *rdesc __free(kfree) = NULL;
>
> bb11c3a1740813 Charles Wang 2024-06-07 225 }
> bb11c3a1740813 Charles Wang 2024-06-07 226
> bb11c3a1740813 Charles Wang 2024-06-07 227 rdesc = kzalloc(rsize, GFP_KERNEL);
>
> Or it could be declared here instead.
>
> u8 *rdesc __free(kfree) = kzalloc(rsize, GFP_KERNEL);
>
> bb11c3a1740813 Charles Wang 2024-06-07 228 if (!rdesc)
> bb11c3a1740813 Charles Wang 2024-06-07 229 return -ENOMEM;
> bb11c3a1740813 Charles Wang 2024-06-07 230
> bb11c3a1740813 Charles Wang 2024-06-07 231 error = goodix_spi_read(ts, GOODIX_HID_REPORT_DESC_ADDR, rdesc, rsize);
> bb11c3a1740813 Charles Wang 2024-06-07 232 if (error) {
> bb11c3a1740813 Charles Wang 2024-06-07 233 dev_err(ts->dev, "failed get report desc, %d", error);
> bb11c3a1740813 Charles Wang 2024-06-07 234 return error;
> bb11c3a1740813 Charles Wang 2024-06-07 235 }
> bb11c3a1740813 Charles Wang 2024-06-07 236
> bb11c3a1740813 Charles Wang 2024-06-07 237 error = hid_parse_report(hid, rdesc, rsize);
> bb11c3a1740813 Charles Wang 2024-06-07 238 if (error)
> bb11c3a1740813 Charles Wang 2024-06-07 239 dev_err(ts->dev, "failed parse report, %d", error);
> bb11c3a1740813 Charles Wang 2024-06-07 240
> bb11c3a1740813 Charles Wang 2024-06-07 241 return error;
> bb11c3a1740813 Charles Wang 2024-06-07 242 }
>
> --
> 0-DAY CI Kernel Test Service
> https://github.com/intel/lkp-tests/wiki
>
^ permalink raw reply
* [PATCH] dt-bindings: input: ti,nspire-keypad: convert to YAML format
From: Andrew Davis @ 2024-06-12 15:07 UTC (permalink / raw)
To: Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: linux-input, devicetree, linux-kernel, Andrew Davis
Convert TI-NSPIRE Keypad controller bindings to DT schema.
Signed-off-by: Andrew Davis <afd@ti.com>
---
.../bindings/input/ti,nspire-keypad.txt | 60 ---------------
.../bindings/input/ti,nspire-keypad.yaml | 74 +++++++++++++++++++
2 files changed, 74 insertions(+), 60 deletions(-)
delete mode 100644 Documentation/devicetree/bindings/input/ti,nspire-keypad.txt
create mode 100644 Documentation/devicetree/bindings/input/ti,nspire-keypad.yaml
diff --git a/Documentation/devicetree/bindings/input/ti,nspire-keypad.txt b/Documentation/devicetree/bindings/input/ti,nspire-keypad.txt
deleted file mode 100644
index 513d94d6e899e..0000000000000
--- a/Documentation/devicetree/bindings/input/ti,nspire-keypad.txt
+++ /dev/null
@@ -1,60 +0,0 @@
-TI-NSPIRE Keypad
-
-Required properties:
-- compatible: Compatible property value should be "ti,nspire-keypad".
-
-- reg: Physical base address of the peripheral and length of memory mapped
- region.
-
-- interrupts: The interrupt number for the peripheral.
-
-- scan-interval: How often to scan in us. Based on a APB speed of 33MHz, the
- maximum and minimum delay time is ~2000us and ~500us respectively
-
-- row-delay: How long to wait before scanning each row.
-
-- clocks: The clock this peripheral is attached to.
-
-- linux,keymap: The keymap to use
- (see Documentation/devicetree/bindings/input/matrix-keymap.txt)
-
-Optional properties:
-- active-low: Specify that the keypad is active low (i.e. logical low signifies
- a key press).
-
-Example:
-
-input {
- compatible = "ti,nspire-keypad";
- reg = <0x900E0000 0x1000>;
- interrupts = <16>;
-
- scan-interval = <1000>;
- row-delay = <200>;
-
- clocks = <&apb_pclk>;
-
- linux,keymap = <
- 0x0000001c 0x0001001c 0x00040039
- 0x0005002c 0x00060015 0x0007000b
- 0x0008000f 0x0100002d 0x01010011
- 0x0102002f 0x01030004 0x01040016
- 0x01050014 0x0106001f 0x01070002
- 0x010a006a 0x02000013 0x02010010
- 0x02020019 0x02030007 0x02040018
- 0x02050031 0x02060032 0x02070005
- 0x02080028 0x0209006c 0x03000026
- 0x03010025 0x03020024 0x0303000a
- 0x03040017 0x03050023 0x03060022
- 0x03070008 0x03080035 0x03090069
- 0x04000021 0x04010012 0x04020020
- 0x0404002e 0x04050030 0x0406001e
- 0x0407000d 0x04080037 0x04090067
- 0x05010038 0x0502000c 0x0503001b
- 0x05040034 0x0505001a 0x05060006
- 0x05080027 0x0509000e 0x050a006f
- 0x0600002b 0x0602004e 0x06030068
- 0x06040003 0x0605006d 0x06060009
- 0x06070001 0x0609000f 0x0708002a
- 0x0709001d 0x070a0033 >;
-};
diff --git a/Documentation/devicetree/bindings/input/ti,nspire-keypad.yaml b/Documentation/devicetree/bindings/input/ti,nspire-keypad.yaml
new file mode 100644
index 0000000000000..ed3cfff13addc
--- /dev/null
+++ b/Documentation/devicetree/bindings/input/ti,nspire-keypad.yaml
@@ -0,0 +1,74 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/input/ti,nspire-keypad.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: TI-NSPIRE Keypad
+
+maintainers:
+ - Andrew Davis <afd@ti.com>
+
+allOf:
+ - $ref: input.yaml#
+ - $ref: matrix-keymap.yaml#
+
+properties:
+ compatible:
+ enum:
+ - ti,nspire-keypad
+
+ reg:
+ maxItems: 1
+
+ interrupts:
+ maxItems: 1
+
+ clocks:
+ maxItems: 1
+
+ scan-interval:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ description: How often to scan in us. Based on a APB speed of 33MHz, the
+ maximum and minimum delay time is ~2000us and ~500us respectively
+
+ row-delay:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ description: How long to wait between scanning each row in us.
+
+ active-low:
+ description: Specify that the keypad is active low.
+
+required:
+ - compatible
+ - reg
+ - interrupts
+ - clocks
+ - scan-interval
+ - row-delay
+ - linux,keymap
+
+unevaluatedProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/input/input.h>
+ keypad@900e0000 {
+ compatible = "ti,nspire-keypad";
+ reg = <0x900e0000 0x1000>;
+ interrupts = <16>;
+
+ clocks = <&apb_pclk>;
+
+ scan-interval = <1000>;
+ row-delay = <200>;
+
+ linux,keymap = <
+ MATRIX_KEY(0, 0, KEY_ENTER)
+ MATRIX_KEY(0, 1, KEY_ENTER)
+ MATRIX_KEY(0, 4, KEY_SPACE)
+ MATRIX_KEY(0, 5, KEY_Z)
+ MATRIX_KEY(0, 6, KEY_Y)
+ MATRIX_KEY(0, 7, KEY_0)
+ >;
+ };
--
2.39.2
^ permalink raw reply related
* Re: [PATCH] dt-bindings: input: ti,nspire-keypad: convert to YAML format
From: Conor Dooley @ 2024-06-12 16:23 UTC (permalink / raw)
To: Andrew Davis
Cc: Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
linux-input, devicetree, linux-kernel
In-Reply-To: <20240612150711.26706-1-afd@ti.com>
[-- Attachment #1: Type: text/plain, Size: 1031 bytes --]
On Wed, Jun 12, 2024 at 10:07:11AM -0500, Andrew Davis wrote:
> diff --git a/Documentation/devicetree/bindings/input/ti,nspire-keypad.yaml b/Documentation/devicetree/bindings/input/ti,nspire-keypad.yaml
> new file mode 100644
> index 0000000000000..ed3cfff13addc
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/input/ti,nspire-keypad.yaml
> @@ -0,0 +1,74 @@
> +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/input/ti,nspire-keypad.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: TI-NSPIRE Keypad
> +
> +maintainers:
> + - Andrew Davis <afd@ti.com>
> +
> +allOf:
> + - $ref: input.yaml#
> + - $ref: matrix-keymap.yaml#
> +
> +properties:
> + compatible:
> + enum:
> + - ti,nspire-keypad
Since there's unlikely to be another device after all this time, this
should probably be a const, but that's a nit in an otherwise okay
looking conversion.
Reviewed-by: Conor Dooley <conor.dooley@microchip.com>
Thanks,
Conor.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply
* Re: [PATCH 2/3] input/touchscreen: imagis: Add supports for Imagis IST3038
From: kernel test robot @ 2024-06-12 18:44 UTC (permalink / raw)
To: Raymond Hackley, linux-kernel
Cc: llvm, oe-kbuild-all, Markuss Broks, Dmitry Torokhov, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Stephan Gerhold,
Nikita Travkin, linux-input, devicetree,
~postmarketos/upstreaming
In-Reply-To: <20240612032036.33103-3-raymondhackley@protonmail.com>
Hi Raymond,
kernel test robot noticed the following build warnings:
[auto build test WARNING on dtor-input/next]
[also build test WARNING on robh/for-next linus/master v6.10-rc3 next-20240612]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Raymond-Hackley/input-touchscreen-imagis-Clarify-the-usage-of-protocol_b/20240612-112300
base: https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git next
patch link: https://lore.kernel.org/r/20240612032036.33103-3-raymondhackley%40protonmail.com
patch subject: [PATCH 2/3] input/touchscreen: imagis: Add supports for Imagis IST3038
config: x86_64-buildonly-randconfig-006-20240612 (https://download.01.org/0day-ci/archive/20240613/202406130224.G2LpMsby-lkp@intel.com/config)
compiler: clang version 18.1.5 (https://github.com/llvm/llvm-project 617a15a9eac96088ae5e9134248d8236e34b91b1)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240613/202406130224.G2LpMsby-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202406130224.G2LpMsby-lkp@intel.com/
All warnings (new ones prefixed by >>):
drivers/input/touchscreen/imagis.c:397:39: warning: unused variable 'imagis_3032c_data' [-Wunused-const-variable]
397 | static const struct imagis_properties imagis_3032c_data = {
| ^~~~~~~~~~~~~~~~~
>> drivers/input/touchscreen/imagis.c:406:39: warning: unused variable 'imagis_3038_data' [-Wunused-const-variable]
406 | static const struct imagis_properties imagis_3038_data = {
| ^~~~~~~~~~~~~~~~
drivers/input/touchscreen/imagis.c:414:39: warning: unused variable 'imagis_3038b_data' [-Wunused-const-variable]
414 | static const struct imagis_properties imagis_3038b_data = {
| ^~~~~~~~~~~~~~~~~
drivers/input/touchscreen/imagis.c:421:39: warning: unused variable 'imagis_3038c_data' [-Wunused-const-variable]
421 | static const struct imagis_properties imagis_3038c_data = {
| ^~~~~~~~~~~~~~~~~
4 warnings generated.
vim +/imagis_3038_data +406 drivers/input/touchscreen/imagis.c
405
> 406 static const struct imagis_properties imagis_3038_data = {
407 .interrupt_msg_cmd = IST30XX_REG_STATUS,
408 .touch_coord_cmd = IST30XX_REG_STATUS,
409 .whoami_cmd = IST30XX_REG_CHIPID,
410 .whoami_val = IST3038_WHOAMI,
411 .touch_keys_supported = true,
412 };
413
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply
* Re: [PATCH 2/3] input/touchscreen: imagis: Add supports for Imagis IST3038
From: kernel test robot @ 2024-06-12 19:18 UTC (permalink / raw)
To: Raymond Hackley, linux-kernel
Cc: oe-kbuild-all, Markuss Broks, Dmitry Torokhov, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Stephan Gerhold,
Nikita Travkin, linux-input, devicetree,
~postmarketos/upstreaming
In-Reply-To: <20240612032036.33103-3-raymondhackley@protonmail.com>
Hi Raymond,
kernel test robot noticed the following build warnings:
[auto build test WARNING on dtor-input/next]
[also build test WARNING on dtor-input/for-linus robh/for-next linus/master v6.10-rc3 next-20240612]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Raymond-Hackley/input-touchscreen-imagis-Clarify-the-usage-of-protocol_b/20240612-112300
base: https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git next
patch link: https://lore.kernel.org/r/20240612032036.33103-3-raymondhackley%40protonmail.com
patch subject: [PATCH 2/3] input/touchscreen: imagis: Add supports for Imagis IST3038
config: i386-randconfig-061-20240612 (https://download.01.org/0day-ci/archive/20240613/202406130336.wSgshW3L-lkp@intel.com/config)
compiler: gcc-13 (Ubuntu 13.2.0-4ubuntu3) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240613/202406130336.wSgshW3L-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202406130336.wSgshW3L-lkp@intel.com/
All warnings (new ones prefixed by >>):
drivers/input/touchscreen/imagis.c:421:39: warning: 'imagis_3038c_data' defined but not used [-Wunused-const-variable=]
421 | static const struct imagis_properties imagis_3038c_data = {
| ^~~~~~~~~~~~~~~~~
drivers/input/touchscreen/imagis.c:414:39: warning: 'imagis_3038b_data' defined but not used [-Wunused-const-variable=]
414 | static const struct imagis_properties imagis_3038b_data = {
| ^~~~~~~~~~~~~~~~~
>> drivers/input/touchscreen/imagis.c:406:39: warning: 'imagis_3038_data' defined but not used [-Wunused-const-variable=]
406 | static const struct imagis_properties imagis_3038_data = {
| ^~~~~~~~~~~~~~~~
drivers/input/touchscreen/imagis.c:397:39: warning: 'imagis_3032c_data' defined but not used [-Wunused-const-variable=]
397 | static const struct imagis_properties imagis_3032c_data = {
| ^~~~~~~~~~~~~~~~~
vim +/imagis_3038_data +406 drivers/input/touchscreen/imagis.c
405
> 406 static const struct imagis_properties imagis_3038_data = {
407 .interrupt_msg_cmd = IST30XX_REG_STATUS,
408 .touch_coord_cmd = IST30XX_REG_STATUS,
409 .whoami_cmd = IST30XX_REG_CHIPID,
410 .whoami_val = IST3038_WHOAMI,
411 .touch_keys_supported = true,
412 };
413
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply
* [dtor-input:next] BUILD SUCCESS 9b9247397e2e20016031e59f76dae563b79b6ee2
From: kernel test robot @ 2024-06-12 19:39 UTC (permalink / raw)
To: Dmitry Torokhov; +Cc: linux-input
tree/branch: https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git next
branch HEAD: 9b9247397e2e20016031e59f76dae563b79b6ee2 Input: adxl34x - switch to using "guard" notation
elapsed time: 1451m
configs tested: 102
configs skipped: 3
The following configs have been built successfully.
More configs may be tested in the coming days.
tested configs:
alpha allnoconfig gcc-13.2.0
alpha allyesconfig gcc-13.2.0
alpha defconfig gcc-13.2.0
arc allnoconfig gcc-13.2.0
arc defconfig gcc-13.2.0
arc randconfig-001-20240612 gcc-13.2.0
arc randconfig-002-20240612 gcc-13.2.0
arm allnoconfig clang-19
arm defconfig clang-14
arm randconfig-001-20240612 gcc-13.2.0
arm randconfig-002-20240612 gcc-13.2.0
arm randconfig-003-20240612 clang-19
arm randconfig-004-20240612 clang-14
arm64 allnoconfig gcc-13.2.0
arm64 defconfig gcc-13.2.0
arm64 randconfig-001-20240612 gcc-13.2.0
arm64 randconfig-002-20240612 gcc-13.2.0
arm64 randconfig-003-20240612 gcc-13.2.0
arm64 randconfig-004-20240612 clang-19
csky allnoconfig gcc-13.2.0
csky defconfig gcc-13.2.0
csky randconfig-001-20240612 gcc-13.2.0
csky randconfig-002-20240612 gcc-13.2.0
hexagon allmodconfig clang-19
hexagon allnoconfig clang-19
hexagon allyesconfig clang-19
hexagon defconfig clang-19
hexagon randconfig-001-20240612 clang-19
hexagon randconfig-002-20240612 clang-19
i386 buildonly-randconfig-001-20240612 gcc-13
i386 buildonly-randconfig-002-20240612 gcc-8
i386 buildonly-randconfig-003-20240612 gcc-13
i386 buildonly-randconfig-004-20240612 clang-18
i386 buildonly-randconfig-005-20240612 gcc-13
i386 buildonly-randconfig-006-20240612 clang-18
i386 randconfig-001-20240612 gcc-8
i386 randconfig-002-20240612 clang-18
i386 randconfig-003-20240612 clang-18
i386 randconfig-004-20240612 clang-18
i386 randconfig-005-20240612 gcc-13
i386 randconfig-006-20240612 clang-18
i386 randconfig-011-20240612 clang-18
i386 randconfig-012-20240612 clang-18
i386 randconfig-013-20240612 clang-18
i386 randconfig-014-20240612 gcc-7
i386 randconfig-015-20240612 gcc-13
i386 randconfig-016-20240612 gcc-7
loongarch allnoconfig gcc-13.2.0
loongarch defconfig gcc-13.2.0
loongarch randconfig-001-20240612 gcc-13.2.0
loongarch randconfig-002-20240612 gcc-13.2.0
m68k allnoconfig gcc-13.2.0
m68k defconfig gcc-13.2.0
microblaze allnoconfig gcc-13.2.0
microblaze defconfig gcc-13.2.0
mips allnoconfig gcc-13.2.0
nios2 allnoconfig gcc-13.2.0
nios2 defconfig gcc-13.2.0
nios2 randconfig-001-20240612 gcc-13.2.0
nios2 randconfig-002-20240612 gcc-13.2.0
openrisc allnoconfig gcc-13.2.0
openrisc defconfig gcc-13.2.0
parisc allnoconfig gcc-13.2.0
parisc defconfig gcc-13.2.0
parisc randconfig-001-20240612 gcc-13.2.0
parisc randconfig-002-20240612 gcc-13.2.0
parisc64 defconfig gcc-13.2.0
powerpc allnoconfig gcc-13.2.0
powerpc randconfig-001-20240612 gcc-13.2.0
powerpc randconfig-002-20240612 gcc-13.2.0
powerpc randconfig-003-20240612 clang-19
powerpc64 randconfig-001-20240612 gcc-13.2.0
powerpc64 randconfig-002-20240612 gcc-13.2.0
powerpc64 randconfig-003-20240612 clang-14
riscv allnoconfig gcc-13.2.0
riscv defconfig clang-19
riscv randconfig-001-20240612 gcc-13.2.0
riscv randconfig-002-20240612 gcc-13.2.0
s390 allnoconfig clang-19
s390 defconfig clang-19
s390 randconfig-001-20240612 clang-19
s390 randconfig-002-20240612 clang-19
sh allnoconfig gcc-13.2.0
sh defconfig gcc-13.2.0
sh randconfig-001-20240612 gcc-13.2.0
sh randconfig-002-20240612 gcc-13.2.0
sparc allnoconfig gcc-13.2.0
sparc defconfig gcc-13.2.0
sparc64 defconfig gcc-13.2.0
sparc64 randconfig-001-20240612 gcc-13.2.0
sparc64 randconfig-002-20240612 gcc-13.2.0
um allmodconfig clang-19
um allnoconfig clang-17
um allyesconfig gcc-13
um defconfig clang-19
um i386_defconfig gcc-13
um randconfig-001-20240612 gcc-13
um randconfig-002-20240612 clang-16
um x86_64_defconfig clang-15
xtensa allnoconfig gcc-13.2.0
xtensa randconfig-001-20240612 gcc-13.2.0
xtensa randconfig-002-20240612 gcc-13.2.0
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply
* [linux-next:master] BUILD REGRESSION 03d44168cbd7fc57d5de56a3730427db758fc7f6
From: kernel test robot @ 2024-06-12 20:41 UTC (permalink / raw)
To: Andrew Morton
Cc: Linux Memory Management List, amd-gfx, dri-devel, intel-gfx,
intel-xe, linux-arm-kernel, linux-gpio, linux-input, linux-pm,
linux-trace-kernel
tree/branch: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
branch HEAD: 03d44168cbd7fc57d5de56a3730427db758fc7f6 Add linux-next specific files for 20240612
Error/Warning reports:
https://lore.kernel.org/oe-kbuild-all/202406130139.TV8i316r-lkp@intel.com
Error/Warning: (recently discovered and may have been fixed)
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-kbox-a-230-ls.dtb: dma-controller@8380000: Unevaluated properties are not allowed ('compatible' was unexpected)
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-kbox-a-230-ls.dtb: dma-controller@8380000: compatible: ['fsl,ls1028a-qdma', 'fsl,ls1021a-qdma'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-kbox-a-230-ls.dtb: dma-controller@8380000: interrupt-names: ['qdma-error', 'qdma-queue0', 'qdma-queue1', 'qdma-queue2', 'qdma-queue3'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-kbox-a-230-ls.dtb: dma-controller@8380000: interrupts: [[0, 43, 4], [0, 251, 4], [0, 252, 4], [0, 253, 4], [0, 254, 4]] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var1.dtb: dma-controller@8380000: Unevaluated properties are not allowed ('compatible' was unexpected)
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var1.dtb: dma-controller@8380000: compatible: ['fsl,ls1028a-qdma', 'fsl,ls1021a-qdma'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var1.dtb: dma-controller@8380000: interrupt-names: ['qdma-error', 'qdma-queue0', 'qdma-queue1', 'qdma-queue2', 'qdma-queue3'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var1.dtb: dma-controller@8380000: interrupts: [[0, 43, 4], [0, 251, 4], [0, 252, 4], [0, 253, 4], [0, 254, 4]] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var2.dtb: dma-controller@8380000: Unevaluated properties are not allowed ('compatible' was unexpected)
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var2.dtb: dma-controller@8380000: compatible: ['fsl,ls1028a-qdma', 'fsl,ls1021a-qdma'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var2.dtb: dma-controller@8380000: interrupt-names: ['qdma-error', 'qdma-queue0', 'qdma-queue1', 'qdma-queue2', 'qdma-queue3'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var2.dtb: dma-controller@8380000: interrupts: [[0, 43, 4], [0, 251, 4], [0, 252, 4], [0, 253, 4], [0, 254, 4]] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var3-ads2.dtb: dma-controller@8380000: Unevaluated properties are not allowed ('compatible' was unexpected)
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var3-ads2.dtb: dma-controller@8380000: compatible: ['fsl,ls1028a-qdma', 'fsl,ls1021a-qdma'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var3-ads2.dtb: dma-controller@8380000: interrupt-names: ['qdma-error', 'qdma-queue0', 'qdma-queue1', 'qdma-queue2', 'qdma-queue3'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var3-ads2.dtb: dma-controller@8380000: interrupts: [[0, 43, 4], [0, 251, 4], [0, 252, 4], [0, 253, 4], [0, 254, 4]] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var3.dtb: dma-controller@8380000: Unevaluated properties are not allowed ('compatible' was unexpected)
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var3.dtb: dma-controller@8380000: compatible: ['fsl,ls1028a-qdma', 'fsl,ls1021a-qdma'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var3.dtb: dma-controller@8380000: interrupt-names: ['qdma-error', 'qdma-queue0', 'qdma-queue1', 'qdma-queue2', 'qdma-queue3'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var3.dtb: dma-controller@8380000: interrupts: [[0, 43, 4], [0, 251, 4], [0, 252, 4], [0, 253, 4], [0, 254, 4]] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var4.dtb: dma-controller@8380000: Unevaluated properties are not allowed ('compatible' was unexpected)
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var4.dtb: dma-controller@8380000: compatible: ['fsl,ls1028a-qdma', 'fsl,ls1021a-qdma'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var4.dtb: dma-controller@8380000: interrupt-names: ['qdma-error', 'qdma-queue0', 'qdma-queue1', 'qdma-queue2', 'qdma-queue3'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var4.dtb: dma-controller@8380000: interrupts: [[0, 43, 4], [0, 251, 4], [0, 252, 4], [0, 253, 4], [0, 254, 4]] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28.dtb: dma-controller@8380000: Unevaluated properties are not allowed ('compatible' was unexpected)
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28.dtb: dma-controller@8380000: compatible: ['fsl,ls1028a-qdma', 'fsl,ls1021a-qdma'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28.dtb: dma-controller@8380000: interrupt-names: ['qdma-error', 'qdma-queue0', 'qdma-queue1', 'qdma-queue2', 'qdma-queue3'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28.dtb: dma-controller@8380000: interrupts: [[0, 43, 4], [0, 251, 4], [0, 252, 4], [0, 253, 4], [0, 254, 4]] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-qds.dtb: dma-controller@8380000: Unevaluated properties are not allowed ('compatible' was unexpected)
arch/arm64/boot/dts/freescale/fsl-ls1028a-qds.dtb: dma-controller@8380000: compatible: ['fsl,ls1028a-qdma', 'fsl,ls1021a-qdma'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-qds.dtb: dma-controller@8380000: interrupt-names: ['qdma-error', 'qdma-queue0', 'qdma-queue1', 'qdma-queue2', 'qdma-queue3'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-qds.dtb: dma-controller@8380000: interrupts: [[0, 43, 4], [0, 251, 4], [0, 252, 4], [0, 253, 4], [0, 254, 4]] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-rdb.dtb: dma-controller@8380000: Unevaluated properties are not allowed ('compatible' was unexpected)
arch/arm64/boot/dts/freescale/fsl-ls1028a-rdb.dtb: dma-controller@8380000: compatible: ['fsl,ls1028a-qdma', 'fsl,ls1021a-qdma'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-rdb.dtb: dma-controller@8380000: interrupt-names: ['qdma-error', 'qdma-queue0', 'qdma-queue1', 'qdma-queue2', 'qdma-queue3'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1028a-rdb.dtb: dma-controller@8380000: interrupts: [[0, 43, 4], [0, 251, 4], [0, 252, 4], [0, 253, 4], [0, 254, 4]] is too long
arch/arm64/boot/dts/freescale/fsl-ls1043a-qds.dtb: dma-controller@8380000: Unevaluated properties are not allowed ('compatible' was unexpected)
arch/arm64/boot/dts/freescale/fsl-ls1043a-qds.dtb: dma-controller@8380000: compatible: ['fsl,ls1021a-qdma', 'fsl,ls1043a-qdma'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1043a-qds.dtb: dma-controller@8380000: interrupt-names: ['qdma-error', 'qdma-queue0', 'qdma-queue1', 'qdma-queue2', 'qdma-queue3'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1043a-qds.dtb: dma-controller@8380000: interrupts: [[0, 153, 4], [0, 39, 4], [0, 40, 4], [0, 41, 4], [0, 42, 4]] is too long
arch/arm64/boot/dts/freescale/fsl-ls1043a-rdb.dtb: dma-controller@8380000: Unevaluated properties are not allowed ('compatible' was unexpected)
arch/arm64/boot/dts/freescale/fsl-ls1043a-rdb.dtb: dma-controller@8380000: compatible: ['fsl,ls1021a-qdma', 'fsl,ls1043a-qdma'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1043a-rdb.dtb: dma-controller@8380000: interrupt-names: ['qdma-error', 'qdma-queue0', 'qdma-queue1', 'qdma-queue2', 'qdma-queue3'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1043a-rdb.dtb: dma-controller@8380000: interrupts: [[0, 153, 4], [0, 39, 4], [0, 40, 4], [0, 41, 4], [0, 42, 4]] is too long
arch/arm64/boot/dts/freescale/fsl-ls1043a-tqmls1043a-mbls10xxa.dtb: dma-controller@8380000: Unevaluated properties are not allowed ('compatible' was unexpected)
arch/arm64/boot/dts/freescale/fsl-ls1043a-tqmls1043a-mbls10xxa.dtb: dma-controller@8380000: compatible: ['fsl,ls1021a-qdma', 'fsl,ls1043a-qdma'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1043a-tqmls1043a-mbls10xxa.dtb: dma-controller@8380000: interrupt-names: ['qdma-error', 'qdma-queue0', 'qdma-queue1', 'qdma-queue2', 'qdma-queue3'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1043a-tqmls1043a-mbls10xxa.dtb: dma-controller@8380000: interrupts: [[0, 153, 4], [0, 39, 4], [0, 40, 4], [0, 41, 4], [0, 42, 4]] is too long
arch/arm64/boot/dts/freescale/fsl-ls1046a-frwy.dtb: dma-controller@8380000: Unevaluated properties are not allowed ('compatible' was unexpected)
arch/arm64/boot/dts/freescale/fsl-ls1046a-frwy.dtb: dma-controller@8380000: compatible: ['fsl,ls1046a-qdma', 'fsl,ls1021a-qdma'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1046a-frwy.dtb: dma-controller@8380000: interrupt-names: ['qdma-error', 'qdma-queue0', 'qdma-queue1', 'qdma-queue2', 'qdma-queue3'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1046a-frwy.dtb: dma-controller@8380000: interrupts: [[0, 153, 4], [0, 39, 4], [0, 40, 4], [0, 41, 4], [0, 42, 4]] is too long
arch/arm64/boot/dts/freescale/fsl-ls1046a-qds.dtb: dma-controller@8380000: Unevaluated properties are not allowed ('compatible' was unexpected)
arch/arm64/boot/dts/freescale/fsl-ls1046a-qds.dtb: dma-controller@8380000: compatible: ['fsl,ls1046a-qdma', 'fsl,ls1021a-qdma'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1046a-qds.dtb: dma-controller@8380000: interrupt-names: ['qdma-error', 'qdma-queue0', 'qdma-queue1', 'qdma-queue2', 'qdma-queue3'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1046a-qds.dtb: dma-controller@8380000: interrupts: [[0, 153, 4], [0, 39, 4], [0, 40, 4], [0, 41, 4], [0, 42, 4]] is too long
arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dtb: dma-controller@8380000: Unevaluated properties are not allowed ('compatible' was unexpected)
arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dtb: dma-controller@8380000: compatible: ['fsl,ls1046a-qdma', 'fsl,ls1021a-qdma'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dtb: dma-controller@8380000: interrupt-names: ['qdma-error', 'qdma-queue0', 'qdma-queue1', 'qdma-queue2', 'qdma-queue3'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dtb: dma-controller@8380000: interrupts: [[0, 153, 4], [0, 39, 4], [0, 40, 4], [0, 41, 4], [0, 42, 4]] is too long
arch/arm64/boot/dts/freescale/fsl-ls1046a-tqmls1046a-mbls10xxa.dtb: dma-controller@8380000: Unevaluated properties are not allowed ('compatible' was unexpected)
arch/arm64/boot/dts/freescale/fsl-ls1046a-tqmls1046a-mbls10xxa.dtb: dma-controller@8380000: compatible: ['fsl,ls1046a-qdma', 'fsl,ls1021a-qdma'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1046a-tqmls1046a-mbls10xxa.dtb: dma-controller@8380000: interrupt-names: ['qdma-error', 'qdma-queue0', 'qdma-queue1', 'qdma-queue2', 'qdma-queue3'] is too long
arch/arm64/boot/dts/freescale/fsl-ls1046a-tqmls1046a-mbls10xxa.dtb: dma-controller@8380000: interrupts: [[0, 153, 4], [0, 39, 4], [0, 40, 4], [0, 41, 4], [0, 42, 4]] is too long
Error/Warning ids grouped by kconfigs:
gcc_recent_errors
|-- arm64-randconfig-001-20240612
| `-- drivers-pinctrl-pinctrl-keembay.c:error:struct-function_desc-has-no-member-named-name
|-- arm64-randconfig-003-20240612
| `-- drivers-pinctrl-pinctrl-keembay.c:error:struct-function_desc-has-no-member-named-name
|-- csky-randconfig-002-20240612
| |-- kernel-trace-fgraph.c:warning:fgraph_pid_func-defined-but-not-used
| |-- kernel-trace-fgraph.c:warning:unused-variable-gops
| `-- kernel-trace-fgraph.c:warning:unused-variable-op
|-- i386-randconfig-061-20240612
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-B-got-struct-ftrace_hash-noderef-__rcu-filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-B-got-struct-ftrace_hash-noderef-__rcu-notrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-new_hash-got-struct-ftrace_hash-noderef-__rcu-filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-new_hash1-got-struct-ftrace_hash-noderef-__rcu-filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-new_hash2-got-struct-ftrace_hash-noderef-__rcu-filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-new_hash2-got-struct-ftrace_hash-noderef-__rcu-notrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-orig_hash-got-struct-ftrace_hash-noderef-__rcu
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-src-got-struct-ftrace_hash-noderef-__rcu-filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-src-got-struct-ftrace_hash-noderef-__rcu-notrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-noderef-__rcu-filter_hash-got-struct-ftrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-noderef-__rcu-filter_hash-got-struct-ftrace_hash-assigned-filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-noderef-__rcu-filter_hash-got-struct-ftrace_hash-save_filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-noderef-__rcu-notrace_hash-got-struct-ftrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-noderef-__rcu-notrace_hash-got-struct-ftrace_hash-assigned-notrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-noderef-__rcu-notrace_hash-got-struct-ftrace_hash-save_notrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-notrace_hash-got-struct-ftrace_hash-noderef-__rcu-notrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-save_filter_hash-got-struct-ftrace_hash-noderef-__rcu-filter_hash
| `-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-save_notrace_hash-got-struct-ftrace_hash-noderef-__rcu-notrace_hash
|-- loongarch-defconfig
| |-- drivers-gpu-drm-amd-amdgpu-..-display-dc-hubbub-dcn401-dcn401_hubbub.o:warning:objtool:unexpected-relocation-symbol-type-in-.rela.discard.reachable
| `-- drivers-thermal-thermal_trip.o:warning:objtool:unexpected-relocation-symbol-type-in-.rela.discard.reachable
|-- powerpc64-randconfig-r121-20240612
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-B-got-struct-ftrace_hash-noderef-__rcu-filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-B-got-struct-ftrace_hash-noderef-__rcu-notrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-new_hash-got-struct-ftrace_hash-noderef-__rcu-filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-new_hash1-got-struct-ftrace_hash-noderef-__rcu-filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-new_hash2-got-struct-ftrace_hash-noderef-__rcu-filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-new_hash2-got-struct-ftrace_hash-noderef-__rcu-notrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-orig_hash-got-struct-ftrace_hash-noderef-__rcu
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-src-got-struct-ftrace_hash-noderef-__rcu-filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-src-got-struct-ftrace_hash-noderef-__rcu-notrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-noderef-__rcu-filter_hash-got-struct-ftrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-noderef-__rcu-filter_hash-got-struct-ftrace_hash-assigned-filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-noderef-__rcu-filter_hash-got-struct-ftrace_hash-save_filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-noderef-__rcu-notrace_hash-got-struct-ftrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-noderef-__rcu-notrace_hash-got-struct-ftrace_hash-assigned-notrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-noderef-__rcu-notrace_hash-got-struct-ftrace_hash-save_notrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-notrace_hash-got-struct-ftrace_hash-noderef-__rcu-notrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-save_filter_hash-got-struct-ftrace_hash-noderef-__rcu-filter_hash
| `-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-save_notrace_hash-got-struct-ftrace_hash-noderef-__rcu-notrace_hash
|-- riscv-randconfig-001-20240612
| |-- kernel-trace-fgraph.c:warning:fgraph_pid_func-defined-but-not-used
| |-- kernel-trace-fgraph.c:warning:unused-variable-gops
| `-- kernel-trace-fgraph.c:warning:unused-variable-op
|-- sh-randconfig-001-20240612
| |-- kernel-trace-fgraph.c:warning:fgraph_pid_func-defined-but-not-used
| |-- kernel-trace-fgraph.c:warning:unused-variable-gops
| `-- kernel-trace-fgraph.c:warning:unused-variable-op
`-- x86_64-buildonly-randconfig-001-20240612
|-- drivers-input-touchscreen-wacom_w8001.c:warning:Finger-directive-output-may-be-truncated-writing-bytes-into-a-region-of-size-between-and
`-- drivers-input-touchscreen-wacom_w8001.c:warning:Pen-directive-output-may-be-truncated-writing-bytes-into-a-region-of-size-between-and
clang_recent_errors
|-- arm64-randconfig-051-20240612
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-kbox-a-ls.dtb:dma-controller:Unevaluated-properties-are-not-allowed-(-compatible-was-unexpected)
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-kbox-a-ls.dtb:dma-controller:compatible:fsl-ls1028a-qdma-fsl-ls1021a-qdma-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-kbox-a-ls.dtb:dma-controller:interrupt-names:qdma-error-qdma-queue0-qdma-queue1-qdma-queue2-qdma-queue3-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-kbox-a-ls.dtb:dma-controller:interrupts:is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-sl28-var1.dtb:dma-controller:Unevaluated-properties-are-not-allowed-(-compatible-was-unexpected)
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-sl28-var1.dtb:dma-controller:compatible:fsl-ls1028a-qdma-fsl-ls1021a-qdma-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-sl28-var1.dtb:dma-controller:interrupt-names:qdma-error-qdma-queue0-qdma-queue1-qdma-queue2-qdma-queue3-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-sl28-var1.dtb:dma-controller:interrupts:is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-sl28-var2.dtb:dma-controller:Unevaluated-properties-are-not-allowed-(-compatible-was-unexpected)
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-sl28-var2.dtb:dma-controller:compatible:fsl-ls1028a-qdma-fsl-ls1021a-qdma-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-sl28-var2.dtb:dma-controller:interrupt-names:qdma-error-qdma-queue0-qdma-queue1-qdma-queue2-qdma-queue3-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-sl28-var2.dtb:dma-controller:interrupts:is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-sl28-var3-ads2.dtb:dma-controller:Unevaluated-properties-are-not-allowed-(-compatible-was-unexpected)
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-sl28-var3-ads2.dtb:dma-controller:compatible:fsl-ls1028a-qdma-fsl-ls1021a-qdma-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-sl28-var3-ads2.dtb:dma-controller:interrupt-names:qdma-error-qdma-queue0-qdma-queue1-qdma-queue2-qdma-queue3-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-sl28-var3-ads2.dtb:dma-controller:interrupts:is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-sl28-var3.dtb:dma-controller:Unevaluated-properties-are-not-allowed-(-compatible-was-unexpected)
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-sl28-var3.dtb:dma-controller:compatible:fsl-ls1028a-qdma-fsl-ls1021a-qdma-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-sl28-var3.dtb:dma-controller:interrupt-names:qdma-error-qdma-queue0-qdma-queue1-qdma-queue2-qdma-queue3-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-sl28-var3.dtb:dma-controller:interrupts:is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-sl28-var4.dtb:dma-controller:Unevaluated-properties-are-not-allowed-(-compatible-was-unexpected)
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-sl28-var4.dtb:dma-controller:compatible:fsl-ls1028a-qdma-fsl-ls1021a-qdma-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-sl28-var4.dtb:dma-controller:interrupt-names:qdma-error-qdma-queue0-qdma-queue1-qdma-queue2-qdma-queue3-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-sl28-var4.dtb:dma-controller:interrupts:is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-sl28.dtb:dma-controller:Unevaluated-properties-are-not-allowed-(-compatible-was-unexpected)
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-sl28.dtb:dma-controller:compatible:fsl-ls1028a-qdma-fsl-ls1021a-qdma-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-sl28.dtb:dma-controller:interrupt-names:qdma-error-qdma-queue0-qdma-queue1-qdma-queue2-qdma-queue3-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-kontron-sl28.dtb:dma-controller:interrupts:is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-qds.dtb:dma-controller:Unevaluated-properties-are-not-allowed-(-compatible-was-unexpected)
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-qds.dtb:dma-controller:compatible:fsl-ls1028a-qdma-fsl-ls1021a-qdma-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-qds.dtb:dma-controller:interrupt-names:qdma-error-qdma-queue0-qdma-queue1-qdma-queue2-qdma-queue3-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-qds.dtb:dma-controller:interrupts:is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-rdb.dtb:dma-controller:Unevaluated-properties-are-not-allowed-(-compatible-was-unexpected)
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-rdb.dtb:dma-controller:compatible:fsl-ls1028a-qdma-fsl-ls1021a-qdma-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-rdb.dtb:dma-controller:interrupt-names:qdma-error-qdma-queue0-qdma-queue1-qdma-queue2-qdma-queue3-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1028a-rdb.dtb:dma-controller:interrupts:is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1043a-qds.dtb:dma-controller:Unevaluated-properties-are-not-allowed-(-compatible-was-unexpected)
| |-- arch-arm64-boot-dts-freescale-fsl-ls1043a-qds.dtb:dma-controller:compatible:fsl-ls1021a-qdma-fsl-ls1043a-qdma-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1043a-qds.dtb:dma-controller:interrupt-names:qdma-error-qdma-queue0-qdma-queue1-qdma-queue2-qdma-queue3-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1043a-qds.dtb:dma-controller:interrupts:is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1043a-rdb.dtb:dma-controller:Unevaluated-properties-are-not-allowed-(-compatible-was-unexpected)
| |-- arch-arm64-boot-dts-freescale-fsl-ls1043a-rdb.dtb:dma-controller:compatible:fsl-ls1021a-qdma-fsl-ls1043a-qdma-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1043a-rdb.dtb:dma-controller:interrupt-names:qdma-error-qdma-queue0-qdma-queue1-qdma-queue2-qdma-queue3-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1043a-rdb.dtb:dma-controller:interrupts:is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1043a-tqmls1043a-mbls1xa.dtb:dma-controller:Unevaluated-properties-are-not-allowed-(-compatible-was-unexpected)
| |-- arch-arm64-boot-dts-freescale-fsl-ls1043a-tqmls1043a-mbls1xa.dtb:dma-controller:compatible:fsl-ls1021a-qdma-fsl-ls1043a-qdma-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1043a-tqmls1043a-mbls1xa.dtb:dma-controller:interrupt-names:qdma-error-qdma-queue0-qdma-queue1-qdma-queue2-qdma-queue3-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1043a-tqmls1043a-mbls1xa.dtb:dma-controller:interrupts:is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1046a-frwy.dtb:dma-controller:Unevaluated-properties-are-not-allowed-(-compatible-was-unexpected)
| |-- arch-arm64-boot-dts-freescale-fsl-ls1046a-frwy.dtb:dma-controller:compatible:fsl-ls1046a-qdma-fsl-ls1021a-qdma-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1046a-frwy.dtb:dma-controller:interrupt-names:qdma-error-qdma-queue0-qdma-queue1-qdma-queue2-qdma-queue3-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1046a-frwy.dtb:dma-controller:interrupts:is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1046a-qds.dtb:dma-controller:Unevaluated-properties-are-not-allowed-(-compatible-was-unexpected)
| |-- arch-arm64-boot-dts-freescale-fsl-ls1046a-qds.dtb:dma-controller:compatible:fsl-ls1046a-qdma-fsl-ls1021a-qdma-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1046a-qds.dtb:dma-controller:interrupt-names:qdma-error-qdma-queue0-qdma-queue1-qdma-queue2-qdma-queue3-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1046a-qds.dtb:dma-controller:interrupts:is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1046a-rdb.dtb:dma-controller:Unevaluated-properties-are-not-allowed-(-compatible-was-unexpected)
| |-- arch-arm64-boot-dts-freescale-fsl-ls1046a-rdb.dtb:dma-controller:compatible:fsl-ls1046a-qdma-fsl-ls1021a-qdma-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1046a-rdb.dtb:dma-controller:interrupt-names:qdma-error-qdma-queue0-qdma-queue1-qdma-queue2-qdma-queue3-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1046a-rdb.dtb:dma-controller:interrupts:is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1046a-tqmls1046a-mbls1xa.dtb:dma-controller:Unevaluated-properties-are-not-allowed-(-compatible-was-unexpected)
| |-- arch-arm64-boot-dts-freescale-fsl-ls1046a-tqmls1046a-mbls1xa.dtb:dma-controller:compatible:fsl-ls1046a-qdma-fsl-ls1021a-qdma-is-too-long
| |-- arch-arm64-boot-dts-freescale-fsl-ls1046a-tqmls1046a-mbls1xa.dtb:dma-controller:interrupt-names:qdma-error-qdma-queue0-qdma-queue1-qdma-queue2-qdma-queue3-is-too-long
| `-- arch-arm64-boot-dts-freescale-fsl-ls1046a-tqmls1046a-mbls1xa.dtb:dma-controller:interrupts:is-too-long
|-- arm64-randconfig-r131-20240612
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-B-got-struct-ftrace_hash-noderef-__rcu-filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-B-got-struct-ftrace_hash-noderef-__rcu-notrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-new_hash-got-struct-ftrace_hash-noderef-__rcu-filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-new_hash1-got-struct-ftrace_hash-noderef-__rcu-filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-new_hash2-got-struct-ftrace_hash-noderef-__rcu-filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-new_hash2-got-struct-ftrace_hash-noderef-__rcu-notrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-orig_hash-got-struct-ftrace_hash-noderef-__rcu
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-src-got-struct-ftrace_hash-noderef-__rcu-filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-src-got-struct-ftrace_hash-noderef-__rcu-notrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-noderef-__rcu-filter_hash-got-struct-ftrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-noderef-__rcu-filter_hash-got-struct-ftrace_hash-assigned-filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-noderef-__rcu-filter_hash-got-struct-ftrace_hash-save_filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-noderef-__rcu-notrace_hash-got-struct-ftrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-noderef-__rcu-notrace_hash-got-struct-ftrace_hash-assigned-notrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-noderef-__rcu-notrace_hash-got-struct-ftrace_hash-save_notrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-notrace_hash-got-struct-ftrace_hash-noderef-__rcu-notrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-save_filter_hash-got-struct-ftrace_hash-noderef-__rcu-filter_hash
| `-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-save_notrace_hash-got-struct-ftrace_hash-noderef-__rcu-notrace_hash
|-- i386-randconfig-006-20240612
| `-- drivers-gpu-drm-drm_mm.c:error:function-drm_mm_node_scanned_block-is-not-needed-and-will-not-be-emitted-Werror-Wunneeded-internal-declaration
|-- x86_64-randconfig-123-20240612
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-B-got-struct-ftrace_hash-noderef-__rcu-filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-B-got-struct-ftrace_hash-noderef-__rcu-notrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-new_hash-got-struct-ftrace_hash-noderef-__rcu-filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-new_hash1-got-struct-ftrace_hash-noderef-__rcu-filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-new_hash2-got-struct-ftrace_hash-noderef-__rcu-filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-new_hash2-got-struct-ftrace_hash-noderef-__rcu-notrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-orig_hash-got-struct-ftrace_hash-noderef-__rcu
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-src-got-struct-ftrace_hash-noderef-__rcu-filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-argument-(different-address-spaces)-expected-struct-ftrace_hash-src-got-struct-ftrace_hash-noderef-__rcu-notrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-noderef-__rcu-filter_hash-got-struct-ftrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-noderef-__rcu-filter_hash-got-struct-ftrace_hash-assigned-filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-noderef-__rcu-filter_hash-got-struct-ftrace_hash-save_filter_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-noderef-__rcu-notrace_hash-got-struct-ftrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-noderef-__rcu-notrace_hash-got-struct-ftrace_hash-assigned-notrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-noderef-__rcu-notrace_hash-got-struct-ftrace_hash-save_notrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-notrace_hash-got-struct-ftrace_hash-noderef-__rcu-notrace_hash
| |-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-save_filter_hash-got-struct-ftrace_hash-noderef-__rcu-filter_hash
| `-- kernel-trace-ftrace.c:sparse:sparse:incorrect-type-in-assignment-(different-address-spaces)-expected-struct-ftrace_hash-save_notrace_hash-got-struct-ftrace_hash-noderef-__rcu-notrace_hash
`-- x86_64-randconfig-161-20240612
|-- drivers-gpu-drm-amd-amdgpu-amdgpu_vm.c-amdgpu_vm_bo_update()-error:we-previously-assumed-bo-could-be-null-(see-line-)
|-- drivers-gpu-drm-i915-display-intel_dpt.c-intel_dpt_pin_to_ggtt()-error:uninitialized-symbol-vma-.
|-- drivers-gpu-drm-i915-display-intel_fb_pin.c-intel_fb_pin_to_dpt()-error:uninitialized-symbol-vma-.
`-- drivers-gpu-drm-i915-display-intel_fb_pin.c-intel_fb_pin_to_dpt()-error:vma-dereferencing-possible-ERR_PTR()
elapsed time: 777m
configs tested: 179
configs skipped: 3
tested configs:
alpha allnoconfig gcc-13.2.0
alpha allyesconfig gcc-13.2.0
alpha defconfig gcc-13.2.0
arc allmodconfig gcc-13.2.0
arc allnoconfig gcc-13.2.0
arc allyesconfig gcc-13.2.0
arc defconfig gcc-13.2.0
arc hsdk_defconfig gcc-13.2.0
arc randconfig-001-20240612 gcc-13.2.0
arc randconfig-002-20240612 gcc-13.2.0
arm allmodconfig gcc-13.2.0
arm allnoconfig clang-19
arm allyesconfig gcc-13.2.0
arm defconfig clang-14
arm lpc32xx_defconfig clang-19
arm nhk8815_defconfig clang-19
arm pxa168_defconfig clang-19
arm randconfig-001-20240612 gcc-13.2.0
arm randconfig-002-20240612 gcc-13.2.0
arm randconfig-003-20240612 clang-19
arm randconfig-004-20240612 clang-14
arm sunxi_defconfig gcc-13.2.0
arm64 allmodconfig clang-19
arm64 allnoconfig gcc-13.2.0
arm64 defconfig gcc-13.2.0
arm64 randconfig-001-20240612 gcc-13.2.0
arm64 randconfig-002-20240612 gcc-13.2.0
arm64 randconfig-003-20240612 gcc-13.2.0
arm64 randconfig-004-20240612 clang-19
csky allmodconfig gcc-13.2.0
csky allnoconfig gcc-13.2.0
csky allyesconfig gcc-13.2.0
csky defconfig gcc-13.2.0
csky randconfig-001-20240612 gcc-13.2.0
csky randconfig-002-20240612 gcc-13.2.0
hexagon allmodconfig clang-19
hexagon allnoconfig clang-19
hexagon allyesconfig clang-19
hexagon defconfig clang-19
hexagon randconfig-001-20240612 clang-19
hexagon randconfig-002-20240612 clang-19
i386 allmodconfig gcc-13
i386 allnoconfig gcc-13
i386 allyesconfig gcc-13
i386 buildonly-randconfig-001-20240612 gcc-13
i386 buildonly-randconfig-002-20240612 gcc-8
i386 buildonly-randconfig-003-20240612 gcc-13
i386 buildonly-randconfig-004-20240612 clang-18
i386 buildonly-randconfig-005-20240612 gcc-13
i386 buildonly-randconfig-006-20240612 clang-18
i386 defconfig clang-18
i386 randconfig-001-20240612 gcc-8
i386 randconfig-002-20240612 clang-18
i386 randconfig-003-20240612 clang-18
i386 randconfig-004-20240612 clang-18
i386 randconfig-005-20240612 gcc-13
i386 randconfig-006-20240612 clang-18
i386 randconfig-011-20240612 clang-18
i386 randconfig-012-20240612 clang-18
i386 randconfig-013-20240612 clang-18
i386 randconfig-014-20240612 gcc-7
i386 randconfig-015-20240612 gcc-13
i386 randconfig-016-20240612 gcc-7
loongarch allmodconfig gcc-13.2.0
loongarch allnoconfig gcc-13.2.0
loongarch defconfig gcc-13.2.0
loongarch randconfig-001-20240612 gcc-13.2.0
loongarch randconfig-002-20240612 gcc-13.2.0
m68k allmodconfig gcc-13.2.0
m68k allnoconfig gcc-13.2.0
m68k allyesconfig gcc-13.2.0
m68k defconfig gcc-13.2.0
microblaze allmodconfig gcc-13.2.0
microblaze allnoconfig gcc-13.2.0
microblaze allyesconfig gcc-13.2.0
microblaze defconfig gcc-13.2.0
mips allnoconfig gcc-13.2.0
mips allyesconfig gcc-13.2.0
mips bmips_stb_defconfig clang-19
mips decstation_defconfig gcc-13.2.0
mips maltasmvp_defconfig gcc-13.2.0
mips rs90_defconfig gcc-13.2.0
nios2 allmodconfig gcc-13.2.0
nios2 allnoconfig gcc-13.2.0
nios2 allyesconfig gcc-13.2.0
nios2 defconfig gcc-13.2.0
nios2 randconfig-001-20240612 gcc-13.2.0
nios2 randconfig-002-20240612 gcc-13.2.0
openrisc allnoconfig gcc-13.2.0
openrisc allyesconfig gcc-13.2.0
openrisc defconfig gcc-13.2.0
parisc allmodconfig gcc-13.2.0
parisc allnoconfig gcc-13.2.0
parisc allyesconfig gcc-13.2.0
parisc defconfig gcc-13.2.0
parisc generic-64bit_defconfig gcc-13.2.0
parisc randconfig-001-20240612 gcc-13.2.0
parisc randconfig-002-20240612 gcc-13.2.0
parisc64 defconfig gcc-13.2.0
powerpc allmodconfig gcc-13.2.0
powerpc allnoconfig gcc-13.2.0
powerpc allyesconfig clang-19
powerpc cm5200_defconfig clang-19
powerpc katmai_defconfig clang-19
powerpc motionpro_defconfig clang-17
powerpc ppc40x_defconfig clang-19
powerpc randconfig-001-20240612 gcc-13.2.0
powerpc randconfig-002-20240612 gcc-13.2.0
powerpc randconfig-003-20240612 clang-19
powerpc64 randconfig-001-20240612 gcc-13.2.0
powerpc64 randconfig-002-20240612 gcc-13.2.0
powerpc64 randconfig-003-20240612 clang-14
riscv allmodconfig clang-19
riscv allnoconfig gcc-13.2.0
riscv allyesconfig clang-19
riscv defconfig clang-19
riscv randconfig-001-20240612 gcc-13.2.0
riscv randconfig-002-20240612 gcc-13.2.0
s390 allmodconfig clang-19
s390 allnoconfig clang-19
s390 allyesconfig gcc-13.2.0
s390 defconfig clang-19
s390 randconfig-001-20240612 clang-19
s390 randconfig-002-20240612 clang-19
sh alldefconfig gcc-13.2.0
sh allmodconfig gcc-13.2.0
sh allnoconfig gcc-13.2.0
sh allyesconfig gcc-13.2.0
sh defconfig gcc-13.2.0
sh randconfig-001-20240612 gcc-13.2.0
sh randconfig-002-20240612 gcc-13.2.0
sh se7750_defconfig gcc-13.2.0
sparc allmodconfig gcc-13.2.0
sparc allnoconfig gcc-13.2.0
sparc defconfig gcc-13.2.0
sparc64 allmodconfig gcc-13.2.0
sparc64 allyesconfig gcc-13.2.0
sparc64 defconfig gcc-13.2.0
sparc64 randconfig-001-20240612 gcc-13.2.0
sparc64 randconfig-002-20240612 gcc-13.2.0
um allmodconfig clang-19
um allnoconfig clang-17
um allyesconfig gcc-13
um defconfig clang-19
um i386_defconfig gcc-13
um randconfig-001-20240612 gcc-13
um randconfig-002-20240612 clang-16
um x86_64_defconfig clang-15
x86_64 allnoconfig clang-18
x86_64 allyesconfig clang-18
x86_64 buildonly-randconfig-001-20240612 gcc-8
x86_64 buildonly-randconfig-002-20240612 clang-18
x86_64 buildonly-randconfig-003-20240612 clang-18
x86_64 buildonly-randconfig-004-20240612 gcc-12
x86_64 buildonly-randconfig-005-20240612 gcc-13
x86_64 buildonly-randconfig-006-20240612 clang-18
x86_64 defconfig gcc-13
x86_64 randconfig-001-20240612 clang-18
x86_64 randconfig-002-20240612 clang-18
x86_64 randconfig-003-20240612 gcc-13
x86_64 randconfig-004-20240612 gcc-13
x86_64 randconfig-005-20240612 gcc-13
x86_64 randconfig-006-20240612 clang-18
x86_64 randconfig-011-20240612 gcc-10
x86_64 randconfig-012-20240612 clang-18
x86_64 randconfig-013-20240612 gcc-10
x86_64 randconfig-014-20240612 clang-18
x86_64 randconfig-015-20240612 clang-18
x86_64 randconfig-016-20240612 clang-18
x86_64 randconfig-071-20240612 clang-18
x86_64 randconfig-072-20240612 gcc-13
x86_64 randconfig-073-20240612 gcc-10
x86_64 randconfig-074-20240612 gcc-13
x86_64 randconfig-075-20240612 gcc-8
x86_64 randconfig-076-20240612 gcc-13
x86_64 rhel-8.3-rust clang-18
xtensa allnoconfig gcc-13.2.0
xtensa randconfig-001-20240612 gcc-13.2.0
xtensa randconfig-002-20240612 gcc-13.2.0
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply
* Re: [PATCH v11 1/8] x86/vmware: Introduce VMware hypercall API
From: Alexey Makhalov @ 2024-06-12 22:11 UTC (permalink / raw)
To: linux-kernel, virtualization, bp, hpa, dave.hansen, mingo, tglx
Cc: x86, netdev, richardcochran, linux-input, dmitry.torokhov, zackr,
linux-graphics-maintainer, pv-drivers, timothym, akaher,
dri-devel, daniel, airlied, tzimmermann, mripard,
maarten.lankhorst, horms, kirill.shutemov
In-Reply-To: <20240606232334.41384-1-alexey.makhalov@broadcom.com>
Borislav, please review v11 implementation of 1/8 based on your proposal.
I'm waiting for your feedback before sending full v11 patchset.
Thanks,
--Alexey
On 6/6/24 4:23 PM, Alexey Makhalov wrote:
> Introduce vmware_hypercall family of functions. It is a common
> implementation to be used by the VMware guest code and virtual
> device drivers in architecture independent manner.
>
> The API consists of vmware_hypercallX and vmware_hypercall_hb_{out,in}
> set of functions by analogy with KVM hypercall API. Architecture
> specific implementation is hidden inside.
>
> It will simplify future enhancements in VMware hypercalls such
> as SEV-ES and TDX related changes without needs to modify a
> caller in device drivers code.
>
> Current implementation extends an idea from commit bac7b4e84323
> ("x86/vmware: Update platform detection code for VMCALL/VMMCALL
> hypercalls") to have a slow, but safe path vmware_hypercall_slow()
> earlier during the boot when alternatives are not yet applied.
> The code inherits VMWARE_CMD logic from the commit mentioned above.
>
> Move common macros from vmware.c to vmware.h.
>
> Signed-off-by: Alexey Makhalov <alexey.makhalov@broadcom.com>
> ---
> arch/x86/include/asm/vmware.h | 279 ++++++++++++++++++++++++++++++++--
> arch/x86/kernel/cpu/vmware.c | 58 ++++++-
> 2 files changed, 315 insertions(+), 22 deletions(-)
>
> diff --git a/arch/x86/include/asm/vmware.h b/arch/x86/include/asm/vmware.h
> index ac9fc51e2b18..724c8b9b4b8d 100644
> --- a/arch/x86/include/asm/vmware.h
> +++ b/arch/x86/include/asm/vmware.h
> @@ -7,26 +7,277 @@
> #include <linux/stringify.h>
>
> /*
> - * The hypercall definitions differ in the low word of the %edx argument
> - * in the following way: the old port base interface uses the port
> - * number to distinguish between high- and low bandwidth versions.
> + * VMware hypercall ABI.
> + *
> + * - Low bandwidth (LB) hypercalls (I/O port based, vmcall and vmmcall)
> + * have up to 6 input and 6 output arguments passed and returned using
> + * registers: %eax (arg0), %ebx (arg1), %ecx (arg2), %edx (arg3),
> + * %esi (arg4), %edi (arg5).
> + * The following input arguments must be initialized by the caller:
> + * arg0 - VMWARE_HYPERVISOR_MAGIC
> + * arg2 - Hypercall command
> + * arg3 bits [15:0] - Port number, LB and direction flags
> + *
> + * - High bandwidth (HB) hypercalls are I/O port based only. They have
> + * up to 7 input and 7 output arguments passed and returned using
> + * registers: %eax (arg0), %ebx (arg1), %ecx (arg2), %edx (arg3),
> + * %esi (arg4), %edi (arg5), %ebp (arg6).
> + * The following input arguments must be initialized by the caller:
> + * arg0 - VMWARE_HYPERVISOR_MAGIC
> + * arg1 - Hypercall command
> + * arg3 bits [15:0] - Port number, HB and direction flags
> + *
> + * For compatibility purposes, x86_64 systems use only lower 32 bits
> + * for input and output arguments.
> + *
> + * The hypercall definitions differ in the low word of the %edx (arg3)
> + * in the following way: the old I/O port based interface uses the port
> + * number to distinguish between high- and low bandwidth versions, and
> + * uses IN/OUT instructions to define transfer direction.
> *
> * The new vmcall interface instead uses a set of flags to select
> * bandwidth mode and transfer direction. The flags should be loaded
> - * into %dx by any user and are automatically replaced by the port
> - * number if the VMWARE_HYPERVISOR_PORT method is used.
> - *
> - * In short, new driver code should strictly use the new definition of
> - * %dx content.
> + * into arg3 by any user and are automatically replaced by the port
> + * number if the I/O port method is used.
> + */
> +
> +#define VMWARE_HYPERVISOR_HB BIT(0)
> +#define VMWARE_HYPERVISOR_OUT BIT(1)
> +
> +#define VMWARE_HYPERVISOR_PORT 0x5658
> +#define VMWARE_HYPERVISOR_PORT_HB (VMWARE_HYPERVISOR_PORT | \
> + VMWARE_HYPERVISOR_HB)
> +
> +#define VMWARE_HYPERVISOR_MAGIC 0x564d5868U
> +
> +#define VMWARE_CMD_GETVERSION 10
> +#define VMWARE_CMD_GETHZ 45
> +#define VMWARE_CMD_GETVCPU_INFO 68
> +#define VMWARE_CMD_STEALCLOCK 91
> +
> +#define CPUID_VMWARE_FEATURES_ECX_VMMCALL BIT(0)
> +#define CPUID_VMWARE_FEATURES_ECX_VMCALL BIT(1)
> +
> +extern unsigned long vmware_hypercall_slow(unsigned long cmd,
> + unsigned long in1, unsigned long in3,
> + unsigned long in4, unsigned long in5,
> + u32 *out1, u32 *out2, u32 *out3,
> + u32 *out4, u32 *out5);
> +
> +/*
> + * The low bandwidth call. The low word of %edx is presumed to have OUT bit
> + * set. The high word of %edx may contain input data from the caller.
> */
> +#define VMWARE_HYPERCALL \
> + ALTERNATIVE_2("movw %[port], %%dx\n\t" \
> + "inl (%%dx), %%eax", \
> + "vmcall", X86_FEATURE_VMCALL, \
> + "vmmcall", X86_FEATURE_VMW_VMMCALL)
> +
> +static inline
> +unsigned long vmware_hypercall1(unsigned long cmd, unsigned long in1)
> +{
> + unsigned long out0;
> +
> + if (unlikely(!alternatives_patched) && !__is_defined(MODULE))
> + return vmware_hypercall_slow(cmd, in1, 0, 0, 0,
> + NULL, NULL, NULL, NULL, NULL);
> +
> + asm_inline volatile (VMWARE_HYPERCALL
> + : "=a" (out0)
> + : [port] "i" (VMWARE_HYPERVISOR_PORT),
> + "a" (VMWARE_HYPERVISOR_MAGIC),
> + "b" (in1),
> + "c" (cmd),
> + "d" (0)
> + : "cc", "memory");
> + return out0;
> +}
> +
> +static inline
> +unsigned long vmware_hypercall3(unsigned long cmd, unsigned long in1,
> + u32 *out1, u32 *out2)
> +{
> + unsigned long out0;
> +
> + if (unlikely(!alternatives_patched) && !__is_defined(MODULE))
> + return vmware_hypercall_slow(cmd, in1, 0, 0, 0,
> + out1, out2, NULL, NULL, NULL);
> +
> + asm_inline volatile (VMWARE_HYPERCALL
> + : "=a" (out0), "=b" (*out1), "=c" (*out2)
> + : [port] "i" (VMWARE_HYPERVISOR_PORT),
> + "a" (VMWARE_HYPERVISOR_MAGIC),
> + "b" (in1),
> + "c" (cmd),
> + "d" (0)
> + : "cc", "memory");
> + return out0;
> +}
> +
> +static inline
> +unsigned long vmware_hypercall4(unsigned long cmd, unsigned long in1,
> + u32 *out1, u32 *out2, u32 *out3)
> +{
> + unsigned long out0;
> +
> + if (unlikely(!alternatives_patched) && !__is_defined(MODULE))
> + return vmware_hypercall_slow(cmd, in1, 0, 0, 0,
> + out1, out2, out3, NULL, NULL);
> +
> + asm_inline volatile (VMWARE_HYPERCALL
> + : "=a" (out0), "=b" (*out1), "=c" (*out2), "=d" (*out3)
> + : [port] "i" (VMWARE_HYPERVISOR_PORT),
> + "a" (VMWARE_HYPERVISOR_MAGIC),
> + "b" (in1),
> + "c" (cmd),
> + "d" (0)
> + : "cc", "memory");
> + return out0;
> +}
> +
> +static inline
> +unsigned long vmware_hypercall5(unsigned long cmd, unsigned long in1,
> + unsigned long in3, unsigned long in4,
> + unsigned long in5, u32 *out2)
> +{
> + unsigned long out0;
> +
> + if (unlikely(!alternatives_patched) && !__is_defined(MODULE))
> + return vmware_hypercall_slow(cmd, in1, in3, in4, in5,
> + NULL, out2, NULL, NULL, NULL);
> +
> + asm_inline volatile (VMWARE_HYPERCALL
> + : "=a" (out0), "=c" (*out2)
> + : [port] "i" (VMWARE_HYPERVISOR_PORT),
> + "a" (VMWARE_HYPERVISOR_MAGIC),
> + "b" (in1),
> + "c" (cmd),
> + "d" (in3),
> + "S" (in4),
> + "D" (in5)
> + : "cc", "memory");
> + return out0;
> +}
> +
> +static inline
> +unsigned long vmware_hypercall6(unsigned long cmd, unsigned long in1,
> + unsigned long in3, u32 *out2,
> + u32 *out3, u32 *out4, u32 *out5)
> +{
> + unsigned long out0;
> +
> + if (unlikely(!alternatives_patched) && !__is_defined(MODULE))
> + return vmware_hypercall_slow(cmd, in1, in3, 0, 0,
> + NULL, out2, out3, out4, out5);
> +
> + asm_inline volatile (VMWARE_HYPERCALL
> + : "=a" (out0), "=c" (*out2), "=d" (*out3), "=S" (*out4),
> + "=D" (*out5)
> + : [port] "i" (VMWARE_HYPERVISOR_PORT),
> + "a" (VMWARE_HYPERVISOR_MAGIC),
> + "b" (in1),
> + "c" (cmd),
> + "d" (in3)
> + : "cc", "memory");
> + return out0;
> +}
> +
> +static inline
> +unsigned long vmware_hypercall7(unsigned long cmd, unsigned long in1,
> + unsigned long in3, unsigned long in4,
> + unsigned long in5, u32 *out1,
> + u32 *out2, u32 *out3)
> +{
> + unsigned long out0;
> +
> + if (unlikely(!alternatives_patched) && !__is_defined(MODULE))
> + return vmware_hypercall_slow(cmd, in1, in3, in4, in5,
> + out1, out2, out3, NULL, NULL);
> +
> + asm_inline volatile (VMWARE_HYPERCALL
> + : "=a" (out0), "=b" (*out1), "=c" (*out2), "=d" (*out3)
> + : [port] "i" (VMWARE_HYPERVISOR_PORT),
> + "a" (VMWARE_HYPERVISOR_MAGIC),
> + "b" (in1),
> + "c" (cmd),
> + "d" (in3),
> + "S" (in4),
> + "D" (in5)
> + : "cc", "memory");
> + return out0;
> +}
> +
> +#ifdef CONFIG_X86_64
> +#define VMW_BP_CONSTRAINT "r"
> +#else
> +#define VMW_BP_CONSTRAINT "m"
> +#endif
> +
> +/*
> + * High bandwidth calls are not supported on encrypted memory guests.
> + * The caller should check cc_platform_has(CC_ATTR_MEM_ENCRYPT) and use
> + * low bandwidth hypercall if memory encryption is set.
> + * This assumption simplifies HB hypercall implementation to just I/O port
> + * based approach without alternative patching.
> + */
> +static inline
> +unsigned long vmware_hypercall_hb_out(unsigned long cmd, unsigned long in2,
> + unsigned long in3, unsigned long in4,
> + unsigned long in5, unsigned long in6,
> + u32 *out1)
> +{
> + unsigned long out0;
> +
> + asm_inline volatile (
> + UNWIND_HINT_SAVE
> + "push %%" _ASM_BP "\n\t"
> + UNWIND_HINT_UNDEFINED
> + "mov %[in6], %%" _ASM_BP "\n\t"
> + "rep outsb\n\t"
> + "pop %%" _ASM_BP "\n\t"
> + UNWIND_HINT_RESTORE
> + : "=a" (out0), "=b" (*out1)
> + : "a" (VMWARE_HYPERVISOR_MAGIC),
> + "b" (cmd),
> + "c" (in2),
> + "d" (in3 | VMWARE_HYPERVISOR_PORT_HB),
> + "S" (in4),
> + "D" (in5),
> + [in6] VMW_BP_CONSTRAINT (in6)
> + : "cc", "memory");
> + return out0;
> +}
>
> -/* Old port-based version */
> -#define VMWARE_HYPERVISOR_PORT 0x5658
> -#define VMWARE_HYPERVISOR_PORT_HB 0x5659
> +static inline
> +unsigned long vmware_hypercall_hb_in(unsigned long cmd, unsigned long in2,
> + unsigned long in3, unsigned long in4,
> + unsigned long in5, unsigned long in6,
> + u32 *out1)
> +{
> + unsigned long out0;
>
> -/* Current vmcall / vmmcall version */
> -#define VMWARE_HYPERVISOR_HB BIT(0)
> -#define VMWARE_HYPERVISOR_OUT BIT(1)
> + asm_inline volatile (
> + UNWIND_HINT_SAVE
> + "push %%" _ASM_BP "\n\t"
> + UNWIND_HINT_UNDEFINED
> + "mov %[in6], %%" _ASM_BP "\n\t"
> + "rep insb\n\t"
> + "pop %%" _ASM_BP "\n\t"
> + UNWIND_HINT_RESTORE
> + : "=a" (out0), "=b" (*out1)
> + : "a" (VMWARE_HYPERVISOR_MAGIC),
> + "b" (cmd),
> + "c" (in2),
> + "d" (in3 | VMWARE_HYPERVISOR_PORT_HB),
> + "S" (in4),
> + "D" (in5),
> + [in6] VMW_BP_CONSTRAINT (in6)
> + : "cc", "memory");
> + return out0;
> +}
> +#undef VMW_BP_CONSTRAINT
> +#undef VMWARE_HYPERCALL
>
> /* The low bandwidth call. The low word of edx is presumed clear. */
> #define VMWARE_HYPERCALL \
> diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c
> index 11f83d07925e..533ac2d1de88 100644
> --- a/arch/x86/kernel/cpu/vmware.c
> +++ b/arch/x86/kernel/cpu/vmware.c
> @@ -41,17 +41,9 @@
>
> #define CPUID_VMWARE_INFO_LEAF 0x40000000
> #define CPUID_VMWARE_FEATURES_LEAF 0x40000010
> -#define CPUID_VMWARE_FEATURES_ECX_VMMCALL BIT(0)
> -#define CPUID_VMWARE_FEATURES_ECX_VMCALL BIT(1)
>
> -#define VMWARE_HYPERVISOR_MAGIC 0x564D5868
> -
> -#define VMWARE_CMD_GETVERSION 10
> -#define VMWARE_CMD_GETHZ 45
> -#define VMWARE_CMD_GETVCPU_INFO 68
> #define VMWARE_CMD_LEGACY_X2APIC 3
> #define VMWARE_CMD_VCPU_RESERVED 31
> -#define VMWARE_CMD_STEALCLOCK 91
>
> #define STEALCLOCK_NOT_AVAILABLE (-1)
> #define STEALCLOCK_DISABLED 0
> @@ -110,6 +102,56 @@ struct vmware_steal_time {
> static unsigned long vmware_tsc_khz __ro_after_init;
> static u8 vmware_hypercall_mode __ro_after_init;
>
> +unsigned long vmware_hypercall_slow(unsigned long cmd,
> + unsigned long in1, unsigned long in3,
> + unsigned long in4, unsigned long in5,
> + u32 *out1, u32 *out2, u32 *out3,
> + u32 *out4, u32 *out5)
> +{
> + unsigned long out0;
> +
> + switch (vmware_hypercall_mode) {
> + case CPUID_VMWARE_FEATURES_ECX_VMCALL:
> + asm_inline volatile ("vmcall"
> + : "=a" (out0), "=b" (*out1), "=c" (*out2),
> + "=d" (*out3), "=S" (*out4), "=D" (*out5)
> + : "a" (VMWARE_HYPERVISOR_MAGIC),
> + "b" (in1),
> + "c" (cmd),
> + "d" (in3),
> + "S" (in4),
> + "D" (in5)
> + : "cc", "memory");
> + break;
> + case CPUID_VMWARE_FEATURES_ECX_VMMCALL:
> + asm_inline volatile ("vmmcall"
> + : "=a" (out0), "=b" (*out1), "=c" (*out2),
> + "=d" (*out3), "=S" (*out4), "=D" (*out5)
> + : "a" (VMWARE_HYPERVISOR_MAGIC),
> + "b" (in1),
> + "c" (cmd),
> + "d" (in3),
> + "S" (in4),
> + "D" (in5)
> + : "cc", "memory");
> + break;
> + default:
> + asm_inline volatile ("movw %[port], %%dx; inl (%%dx), %%eax"
> + : "=a" (out0), "=b" (*out1), "=c" (*out2),
> + "=d" (*out3), "=S" (*out4), "=D" (*out5)
> + : [port] "i" (VMWARE_HYPERVISOR_PORT),
> + "a" (VMWARE_HYPERVISOR_MAGIC),
> + "b" (in1),
> + "c" (cmd),
> + "d" (in3),
> + "S" (in4),
> + "D" (in5)
> + : "cc", "memory");
> + break;
> + }
> + return out0;
> +}
> +
> static inline int __vmware_platform(void)
> {
> uint32_t eax, ebx, ecx, edx;
^ permalink raw reply
* [PATCH v2 0/3] Add support for Imagis IST3038 and clarify the usage of protocol_b
From: Raymond Hackley @ 2024-06-13 2:56 UTC (permalink / raw)
To: linux-kernel
Cc: Markuss Broks, Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Stephan Gerhold, Nikita Travkin, linux-input,
devicetree, ~postmarketos/upstreaming
Imagis IST3038 is another variant of Imagis IST3038 IC, which has
a different register interface from IST3038C (possibly firmware defined).
Unlike IST3038C/IST3032C, IST3038 has different registers for commands,
which means IST3038 doesn't use protocol B.
Similar to IST3032C and maybe the other variants, IST3038 has touch keys
support, which provides KEY_APPSELECT and KEY_BACK.
Add support for IST3038 with touch keys.
protocol_b is a property, which tells Imagis panel to use a different
format for coordinates.
IST30XXC series is known for using protocol B, while the other series
aren't. Note this could be confusing, unlike the model name implies.
Adjust the usage of protocol_b to avoid confusion.
---
v2: Sort the compatible enties in alphabetical order.
Document the binding before using in the driver.
^ permalink raw reply
* [PATCH v2 1/3] input/touchscreen: imagis: Clarify the usage of protocol_b
From: Raymond Hackley @ 2024-06-13 2:56 UTC (permalink / raw)
To: linux-kernel
Cc: Markuss Broks, Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Stephan Gerhold, Nikita Travkin, linux-input,
devicetree, ~postmarketos/upstreaming
In-Reply-To: <20240613025631.5425-1-raymondhackley@protonmail.com>
protocol_b is a property, which tells Imagis panel to use a different
format for coordinates.
IST30XXC series is known for using protocol B, while the other series
aren't. Note this could be confusing, unlike the model name implies.
Adjust the usage of protocol_b to avoid confusion.
Signed-off-by: Raymond Hackley <raymondhackley@protonmail.com>
---
drivers/input/touchscreen/imagis.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/drivers/input/touchscreen/imagis.c b/drivers/input/touchscreen/imagis.c
index 074dd6c342ec..886bcfc8497a 100644
--- a/drivers/input/touchscreen/imagis.c
+++ b/drivers/input/touchscreen/imagis.c
@@ -120,12 +120,12 @@ static irqreturn_t imagis_interrupt(int irq, void *dev_id)
for (i = 0; i < finger_count; i++) {
if (ts->tdata->protocol_b)
- error = imagis_i2c_read_reg(ts,
- ts->tdata->touch_coord_cmd, &finger_status);
- else
error = imagis_i2c_read_reg(ts,
ts->tdata->touch_coord_cmd + (i * 4),
&finger_status);
+ else
+ error = imagis_i2c_read_reg(ts,
+ ts->tdata->touch_coord_cmd, &finger_status);
if (error) {
dev_err(&ts->client->dev,
"failed to read coordinates for finger %d: %d\n",
@@ -394,6 +394,7 @@ static const struct imagis_properties imagis_3032c_data = {
.whoami_cmd = IST3038C_REG_CHIPID,
.whoami_val = IST3032C_WHOAMI,
.touch_keys_supported = true,
+ .protocol_b = true,
};
static const struct imagis_properties imagis_3038b_data = {
@@ -401,7 +402,6 @@ static const struct imagis_properties imagis_3038b_data = {
.touch_coord_cmd = IST3038B_REG_STATUS,
.whoami_cmd = IST3038B_REG_CHIPID,
.whoami_val = IST3038B_WHOAMI,
- .protocol_b = true,
};
static const struct imagis_properties imagis_3038c_data = {
@@ -409,6 +409,7 @@ static const struct imagis_properties imagis_3038c_data = {
.touch_coord_cmd = IST3038C_REG_TOUCH_COORD,
.whoami_cmd = IST3038C_REG_CHIPID,
.whoami_val = IST3038C_WHOAMI,
+ .protocol_b = true,
};
#ifdef CONFIG_OF
--
2.39.2
^ permalink raw reply related
* [PATCH v2 2/3] dt-bindings: input/touchscreen: imagis: Document ist3038
From: Raymond Hackley @ 2024-06-13 2:57 UTC (permalink / raw)
To: linux-kernel
Cc: Markuss Broks, Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Stephan Gerhold, Nikita Travkin, linux-input,
devicetree, ~postmarketos/upstreaming
In-Reply-To: <20240613025631.5425-1-raymondhackley@protonmail.com>
Imagis IST3038 is a variant of Imagis touchscreen IC. Document it in
imagis,ist3038c bindings.
Signed-off-by: Raymond Hackley <raymondhackley@protonmail.com>
---
.../devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml b/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
index 77ba280b3bdc..e24cbd960993 100644
--- a/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
+++ b/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
@@ -16,6 +16,7 @@ properties:
compatible:
enum:
- imagis,ist3032c
+ - imagis,ist3038
- imagis,ist3038b
- imagis,ist3038c
--
2.39.2
^ permalink raw reply related
* [PATCH v2 3/3] input/touchscreen: imagis: Add supports for Imagis IST3038
From: Raymond Hackley @ 2024-06-13 2:57 UTC (permalink / raw)
To: linux-kernel
Cc: Markuss Broks, Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Stephan Gerhold, Nikita Travkin, linux-input,
devicetree, ~postmarketos/upstreaming
In-Reply-To: <20240613025631.5425-1-raymondhackley@protonmail.com>
Imagis IST3038 is another variant of Imagis IST3038 IC, which has
a different register interface from IST3038C (possibly firmware defined).
Unlike IST3038C/IST3032C, IST3038 has different registers for commands,
which means IST3038 doesn't use protocol B.
Similar to IST3032C and maybe the other variants, IST3038 has touch keys
support, which provides KEY_APPSELECT and KEY_BACK.
Add support for IST3038 with touch keys.
Signed-off-by: Raymond Hackley <raymondhackley@protonmail.com>
---
drivers/input/touchscreen/imagis.c | 24 ++++++++++++++++++++----
1 file changed, 20 insertions(+), 4 deletions(-)
diff --git a/drivers/input/touchscreen/imagis.c b/drivers/input/touchscreen/imagis.c
index 886bcfc8497a..aeabf8d057de 100644
--- a/drivers/input/touchscreen/imagis.c
+++ b/drivers/input/touchscreen/imagis.c
@@ -12,9 +12,17 @@
#include <linux/property.h>
#include <linux/regulator/consumer.h>
+#define IST30XX_REG_STATUS 0x20
+#define IST30XX_REG_CHIPID (0x40000000 | IST3038C_DIRECT_ACCESS)
+
+#define IST30XX_WHOAMI 0x30003000
+#define IST30XXA_WHOAMI 0x300a300a
+#define IST30XXB_WHOAMI 0x300b300b
+#define IST3038_WHOAMI 0x30383038
+
#define IST3032C_WHOAMI 0x32c
+#define IST3038C_WHOAMI 0x38c
-#define IST3038B_REG_STATUS 0x20
#define IST3038B_REG_CHIPID 0x30
#define IST3038B_WHOAMI 0x30380b
@@ -25,7 +33,6 @@
#define IST3038C_REG_TOUCH_STATUS (IST3038C_REG_HIB_BASE | IST3038C_HIB_ACCESS)
#define IST3038C_REG_TOUCH_COORD (IST3038C_REG_HIB_BASE | IST3038C_HIB_ACCESS | 0x8)
#define IST3038C_REG_INTR_MESSAGE (IST3038C_REG_HIB_BASE | IST3038C_HIB_ACCESS | 0x4)
-#define IST3038C_WHOAMI 0x38c
#define IST3038C_CHIP_ON_DELAY_MS 60
#define IST3038C_I2C_RETRY_COUNT 3
#define IST3038C_MAX_FINGER_NUM 10
@@ -397,9 +404,17 @@ static const struct imagis_properties imagis_3032c_data = {
.protocol_b = true,
};
+static const struct imagis_properties imagis_3038_data = {
+ .interrupt_msg_cmd = IST30XX_REG_STATUS,
+ .touch_coord_cmd = IST30XX_REG_STATUS,
+ .whoami_cmd = IST30XX_REG_CHIPID,
+ .whoami_val = IST3038_WHOAMI,
+ .touch_keys_supported = true,
+};
+
static const struct imagis_properties imagis_3038b_data = {
- .interrupt_msg_cmd = IST3038B_REG_STATUS,
- .touch_coord_cmd = IST3038B_REG_STATUS,
+ .interrupt_msg_cmd = IST30XX_REG_STATUS,
+ .touch_coord_cmd = IST30XX_REG_STATUS,
.whoami_cmd = IST3038B_REG_CHIPID,
.whoami_val = IST3038B_WHOAMI,
};
@@ -415,6 +430,7 @@ static const struct imagis_properties imagis_3038c_data = {
#ifdef CONFIG_OF
static const struct of_device_id imagis_of_match[] = {
{ .compatible = "imagis,ist3032c", .data = &imagis_3032c_data },
+ { .compatible = "imagis,ist3038", .data = &imagis_3038_data },
{ .compatible = "imagis,ist3038b", .data = &imagis_3038b_data },
{ .compatible = "imagis,ist3038c", .data = &imagis_3038c_data },
{ },
--
2.39.2
^ permalink raw reply related
* Re: [PATCH v11 1/8] x86/vmware: Introduce VMware hypercall API
From: Borislav Petkov @ 2024-06-13 8:03 UTC (permalink / raw)
To: Alexey Makhalov
Cc: linux-kernel, virtualization, hpa, dave.hansen, mingo, tglx, x86,
netdev, richardcochran, linux-input, dmitry.torokhov, zackr,
linux-graphics-maintainer, pv-drivers, timothym, akaher,
dri-devel, daniel, airlied, tzimmermann, mripard,
maarten.lankhorst, horms, kirill.shutemov
In-Reply-To: <d366491d-2f5b-478c-8968-b0a3a298827c@broadcom.com>
On Wed, Jun 12, 2024 at 03:11:54PM -0700, Alexey Makhalov wrote:
> Borislav, please review v11 implementation of 1/8 based on your proposal.
> I'm waiting for your feedback before sending full v11 patchset.
Sorry about that - -ETOOMUCHEMAIL. :-(
Yeah, that patch looks all good and regular now, and at a quick glance you know
what's what. I think that's definitely better than what you started with. :-)
Thx.
--
Regards/Gruss,
Boris.
https://people.kernel.org/tglx/notes-about-netiquette
^ permalink raw reply
* Re: [PATCH v2 2/3] dt-bindings: input/touchscreen: imagis: Document ist3038
From: Krzysztof Kozlowski @ 2024-06-13 9:13 UTC (permalink / raw)
To: Raymond Hackley, linux-kernel
Cc: Markuss Broks, Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Stephan Gerhold, Nikita Travkin, linux-input,
devicetree, ~postmarketos/upstreaming
In-Reply-To: <20240613025631.5425-3-raymondhackley@protonmail.com>
On 13/06/2024 04:57, Raymond Hackley wrote:
> Imagis IST3038 is a variant of Imagis touchscreen IC. Document it in
> imagis,ist3038c bindings.
>
> Signed-off-by: Raymond Hackley <raymondhackley@protonmail.com>
> ---
> .../devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml | 1 +
> 1 file changed, 1 insertion(+)
>
Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Best regards,
Krzysztof
^ permalink raw reply
* Re: [PATCH v3] HID: hid-goodix: Add Goodix HID-over-SPI driver
From: Thomas Weißschuh @ 2024-06-13 10:56 UTC (permalink / raw)
To: Charles Wang
Cc: dmitry.torokhov, jikos, bentiss, hbarnor, dianders, linux-input,
linux-kernel
In-Reply-To: <20240607133709.3518-1-charles.goodix@gmail.com>
On 2024-06-07 21:36:02+0000, Charles Wang wrote:
<snip>
> diff --git a/drivers/hid/hid-goodix-spi.c b/drivers/hid/hid-goodix-spi.c
> new file mode 100644
> index 000000000..7ba7016e1
> --- /dev/null
> +++ b/drivers/hid/hid-goodix-spi.c
> @@ -0,0 +1,687 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Goodix GT7986U SPI Driver Code for HID.
> + *
> + * Copyright (C) 2024 Godix, Inc.
Goodix, Inc
> + */
> +#include <asm/unaligned.h>
> +#include <linux/delay.h>
> +#include <linux/hid.h>
> +#include <linux/interrupt.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/mutex.h>
> +#include <linux/sizes.h>
> +#include <linux/spi/spi.h>
<snip>
> +static struct hid_ll_driver goodix_hid_ll_driver = {
const
> + .parse = goodix_hid_parse,
> + .start = goodix_hid_start,
> + .stop = goodix_hid_stop,
> + .open = goodix_hid_open,
> + .close = goodix_hid_close,
> + .raw_request = goodix_hid_raw_request
comma
> +};
<snip>
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox