* [PATCH v12 0/2] i3c: Add basic HDR mode support (sensor part).
@ 2025-12-15 16:51 Frank Li
2025-12-15 16:51 ` [PATCH v12 1/2] dt-bindings: trivial-devices: add MEMSIC 3-axis magnetometer Frank Li
2025-12-15 16:51 ` [PATCH v12 2/2] iio: magnetometer: Add mmc5633 sensor Frank Li
0 siblings, 2 replies; 7+ messages in thread
From: Frank Li @ 2025-12-15 16:51 UTC (permalink / raw)
To: Alexandre Belloni, Miquel Raynal, Jonathan Cameron, David Lechner,
Nuno Sá, Andy Shevchenko, Rob Herring, Krzysztof Kozlowski,
Conor Dooley
Cc: linux-i3c, linux-kernel, imx, linux-iio, joshua.yeong, devicetree,
linux, Frank Li, Conor Dooley, Carlos Song, Adrian Fluturel,
Andy Shevchenko
I3C part already merged into v6.19-rc1. Just repost sensor part.
Add basic HDR mode support, only support private transfer, not support
CCC command.
Update i3c framework API to allow pass down mode and extend driver callback
function.
Implement HDR transfer in svc i3c master driver.
Simplifed HDR flow is (ref i3c spec line 5514) Figure 129
<-- SDR ---> | <--- HDR
START 0x7E RnW(0) ACK CCC(ENTHDR0) T HDR-CMD(00-7f write, 80--ff read)
----> |
HDR-DATA HDR-CRC HDR-RESTART .... HDR-EXIT
Note: HDR-CMD is 16bit data, which included 7bit slave address and 8bit
read/write command.
svc hardware can auto issue SDR part.
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
Changes in v12:
- rebase to v6.19-rc1
- repost for sensor part.
- Link to v11: https://lore.kernel.org/r/20251106-i3c_ddr-v11-0-33a6a66ed095@nxp.com
Changes in v11:
- Add Andy Shevchenko's reviewed-by tags
- fix some nits at mmc5633, see patch's change log for detail.
- Link to v10: https://lore.kernel.org/r/20251104-i3c_ddr-v10-0-e3e4cbc17034@nxp.com
Changes in v10:
- remove !! at svc patch
- align datasheet register name in mmc5633
- remove reduntant regmap_attach_dev()
- see patch's change log for detail
- Link to v9: https://lore.kernel.org/r/20251031-i3c_ddr-v9-0-f1e523ebaf78@nxp.com
Changes in v9:
- remove reducated check for ops->priv_xfer.
- improve mmc5633 (see patch's change log for detail)
- Link to v8: https://lore.kernel.org/r/20251028-i3c_ddr-v8-0-795ded2db8c2@nxp.com
Changes in v8:
- Add cleanup patch replace framework's i3c_priv_xfer with i3c_xfer
- Link to v7: https://lore.kernel.org/r/20251027-i3c_ddr-v7-0-866a0ff7fc46@nxp.com
Changes in v7:
- add explicit define for I3C_HDR_*
- add missed include files.
- detail see each patches' change log
- CONFIG_DEBUG_ATOMIC_SLEEP=y
- Link to v6: https://lore.kernel.org/r/20251014-i3c_ddr-v6-0-3afe49773107@nxp.com
Changes in v6:
- remove acpi part
- collect Conor Dooley ack tags
- Link to v5: https://lore.kernel.org/r/20251007-i3c_ddr-v5-0-444184f7725e@nxp.com
Changes in v5:
- Just realized missed CC mail list devicetree@vger.kernel.org and resend
- Link to v4: https://lore.kernel.org/r/20251007-i3c_ddr-v4-0-3afea5105775@nxp.com
Changes in v4:
- use master's hdr_cap to check HDR cap.
- add mmc5603 support.
- Link to v3: https://lore.kernel.org/r/20250930-i3c_ddr-v3-0-b627dc2ef172@nxp.com
Changes in v3:
- Add new patch for change rnw to union for svc.
- Detial changes see each patch's change log.
- Link to v2: https://lore.kernel.org/r/20250924-i3c_ddr-v2-0-682a0eb32572@nxp.com
Changes in v2:
- Add sensor driver, which use HDR mode read/write data.
- change priv_xfer to i3c_xfer.
- Link to v1: https://lore.kernel.org/r/20250129-i3c_ddr-v1-0-028a7a5d4324@nxp.com
---
Frank Li (2):
dt-bindings: trivial-devices: add MEMSIC 3-axis magnetometer
iio: magnetometer: Add mmc5633 sensor
.../devicetree/bindings/trivial-devices.yaml | 4 +
drivers/iio/magnetometer/Kconfig | 12 +
drivers/iio/magnetometer/Makefile | 1 +
drivers/iio/magnetometer/mmc5633.c | 585 +++++++++++++++++++++
4 files changed, 602 insertions(+)
---
base-commit: 8f0b4cce4481fb22653697cced8d0d04027cb1e8
change-id: 20250129-i3c_ddr-b15488901eb8
Best regards,
--
Frank Li <Frank.Li@nxp.com>
--
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v12 1/2] dt-bindings: trivial-devices: add MEMSIC 3-axis magnetometer
2025-12-15 16:51 [PATCH v12 0/2] i3c: Add basic HDR mode support (sensor part) Frank Li
@ 2025-12-15 16:51 ` Frank Li
2025-12-15 16:51 ` [PATCH v12 2/2] iio: magnetometer: Add mmc5633 sensor Frank Li
1 sibling, 0 replies; 7+ messages in thread
From: Frank Li @ 2025-12-15 16:51 UTC (permalink / raw)
To: Alexandre Belloni, Miquel Raynal, Jonathan Cameron, David Lechner,
Nuno Sá, Andy Shevchenko, Rob Herring, Krzysztof Kozlowski,
Conor Dooley
Cc: linux-i3c, linux-kernel, imx, linux-iio, joshua.yeong, devicetree,
linux, Frank Li, Conor Dooley
Add compatible string 'memsic,mmc5603' and 'memsic,mmc5633' for
MEMSIC 3-axis magnetometer.
Acked-by: Conor Dooley <conor.dooley@microchip.com>
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
Changes in v7
- none
Changes in v6:
- add Conor Dooley ack tag.
Changes in v5
- none
Changes in v4
- add memsic,mmc5603
Changes from v1 .. v3
- None
---
Documentation/devicetree/bindings/trivial-devices.yaml | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/Documentation/devicetree/bindings/trivial-devices.yaml b/Documentation/devicetree/bindings/trivial-devices.yaml
index d0f7dbf15d6f1d901688b4b529aaf2cf537addd6..055c9e2b7d475cef550ca0ac7d937254eb7c54b9 100644
--- a/Documentation/devicetree/bindings/trivial-devices.yaml
+++ b/Documentation/devicetree/bindings/trivial-devices.yaml
@@ -229,6 +229,10 @@ properties:
- meas,tsys01
# MEMSIC magnetometer
- memsic,mmc35240
+ # MEMSIC 3-axis magnetometer
+ - memsic,mmc5603
+ # MEMSIC 3-axis magnetometer (Support I3C HDR)
+ - memsic,mmc5633
# MEMSIC 3-axis accelerometer
- memsic,mxc4005
# MEMSIC 2-axis 8-bit digital accelerometer
--
2.34.1
--
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v12 2/2] iio: magnetometer: Add mmc5633 sensor
2025-12-15 16:51 [PATCH v12 0/2] i3c: Add basic HDR mode support (sensor part) Frank Li
2025-12-15 16:51 ` [PATCH v12 1/2] dt-bindings: trivial-devices: add MEMSIC 3-axis magnetometer Frank Li
@ 2025-12-15 16:51 ` Frank Li
2025-12-20 14:34 ` kernel test robot
2025-12-21 19:13 ` Jonathan Cameron
1 sibling, 2 replies; 7+ messages in thread
From: Frank Li @ 2025-12-15 16:51 UTC (permalink / raw)
To: Alexandre Belloni, Miquel Raynal, Jonathan Cameron, David Lechner,
Nuno Sá, Andy Shevchenko, Rob Herring, Krzysztof Kozlowski,
Conor Dooley
Cc: linux-i3c, linux-kernel, imx, linux-iio, joshua.yeong, devicetree,
linux, Frank Li, Carlos Song, Adrian Fluturel, Andy Shevchenko
Add mmc5633 sensor basic support.
- Support read 20 bits X/Y/Z magnetic.
- Support I3C HDR mode to send start measurememt command.
- Support I3C HDR mode to read all sensors data by one command.
Co-developed-by: Carlos Song <carlos.song@nxp.com>
Signed-off-by: Carlos Song <carlos.song@nxp.com>
Co-developed-by: Adrian Fluturel <fluturel.adrian@gmail.com>
Signed-off-by: Adrian Fluturel <fluturel.adrian@gmail.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
change in v11
- add andy shevchenak's reviewed by tag
- use unsigned int for regmap
- compact mmc5633_read_avail arg list to few lines
- move check condition to one line for read_poll_timeout()
- leave i3c_xfer as size 1 array to align existed code style in kernel
tree, git grep -r i3c_priv_xfer drivers/, leave to jonathan to do decide.
change in v10
- align datasheet register name
- remove reduntant regmap_attach_dev()
- add missed \n at error message
- move *regmap to first member.
Changes in v9
- add time.h
- remove dev from mmc5633_data
- remove struct {val, val2}
- regmap return value check use if (ret) ...
- 1 -> ARRAY_SIZE()
- use guard() replace scoped_guard()
- use regmap stored dev
- i3c device use bus assigned name.
- use devm_kasprintf() to combine friend name with device ID from i3c bus
and it will avoid build warning to discard const return from dev_name().
Change in v7
- add missed *.h file
- remove reduntant empty line
- add comments about delay 1us after SET
- use USEC_PER_MSEC for timeout value
Change in v6:
- remove acpi part
- return 0 for success path at mmc5633_write_raw
Change in V4
- use { 1, 2000 }
- Add _US for timeout
- Use GEN_MASK for MMC5633_CTRL1_BW_MASK
- Use { } for terminator.
- remove !!
- fix mix tab and space
- add mmc5603 (merge https://lore.kernel.org/all/20251003000731.22927-1-fluturel.adrian@gmail.com/)
- add tempature measure support
Change in v3
- remove mmc5633_hw_set
- make -> Make
- change indention for mmc5633_samp_freq
- use u8 arrary to handle dword data
- get_unaligned_be16() to get raw data
- add helper function to check if i3c support hdr
- use read_avail() callback
change in v2
- new patch
---
drivers/iio/magnetometer/Kconfig | 12 +
drivers/iio/magnetometer/Makefile | 1 +
drivers/iio/magnetometer/mmc5633.c | 585 +++++++++++++++++++++++++++++++++++++
3 files changed, 598 insertions(+)
diff --git a/drivers/iio/magnetometer/Kconfig b/drivers/iio/magnetometer/Kconfig
index 81b812a29044e2b0b9ff84889c21aa3ebc20be35..cfb74a4a083630678a1db1132a14264de451a31a 100644
--- a/drivers/iio/magnetometer/Kconfig
+++ b/drivers/iio/magnetometer/Kconfig
@@ -139,6 +139,18 @@ config MMC35240
To compile this driver as a module, choose M here: the module
will be called mmc35240.
+config MMC5633
+ tristate "MEMSIC MMC5633 3-axis magnetic sensor"
+ select REGMAP_I2C
+ select REGMAP_I3C
+ depends on I2C || I3C
+ help
+ Say yes here to build support for the MEMSIC MMC5633 3-axis
+ magnetic sensor.
+
+ To compile this driver as a module, choose M here: the module
+ will be called mmc5633
+
config IIO_ST_MAGN_3AXIS
tristate "STMicroelectronics magnetometers 3-Axis Driver"
depends on (I2C || SPI_MASTER) && SYSFS
diff --git a/drivers/iio/magnetometer/Makefile b/drivers/iio/magnetometer/Makefile
index dfe970fcacb8664b293af84893f7d3e3e8d7bf7e..5bd227f8c1204bdd8b8a43da180833eedca1457b 100644
--- a/drivers/iio/magnetometer/Makefile
+++ b/drivers/iio/magnetometer/Makefile
@@ -15,6 +15,7 @@ obj-$(CONFIG_BMC150_MAGN_SPI) += bmc150_magn_spi.o
obj-$(CONFIG_MAG3110) += mag3110.o
obj-$(CONFIG_HID_SENSOR_MAGNETOMETER_3D) += hid-sensor-magn-3d.o
obj-$(CONFIG_MMC35240) += mmc35240.o
+obj-$(CONFIG_MMC5633) += mmc5633.o
obj-$(CONFIG_IIO_ST_MAGN_3AXIS) += st_magn.o
st_magn-y := st_magn_core.o
diff --git a/drivers/iio/magnetometer/mmc5633.c b/drivers/iio/magnetometer/mmc5633.c
new file mode 100644
index 0000000000000000000000000000000000000000..7b20ff3b063b026ab2ae0170fd8c021973428dea
--- /dev/null
+++ b/drivers/iio/magnetometer/mmc5633.c
@@ -0,0 +1,585 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * MMC5633 - MEMSIC 3-axis Magnetic Sensor
+ *
+ * Copyright (c) 2015, Intel Corporation.
+ * Copyright (c) 2025, NXP
+ *
+ * IIO driver for MMC5633, base on mmc35240.c
+ */
+
+#include <linux/array_size.h>
+#include <linux/bitfield.h>
+#include <linux/bits.h>
+#include <linux/cleanup.h>
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <linux/dev_printk.h>
+#include <linux/err.h>
+#include <linux/errno.h>
+#include <linux/i2c.h>
+#include <linux/i3c/device.h>
+#include <linux/iio/iio.h>
+#include <linux/iio/sysfs.h>
+#include <linux/init.h>
+#include <linux/iopoll.h>
+#include <linux/module.h>
+#include <linux/mod_devicetable.h>
+#include <linux/mutex.h>
+#include <linux/pm.h>
+#include <linux/regmap.h>
+#include <linux/time.h>
+#include <linux/types.h>
+#include <linux/unaligned.h>
+
+#define MMC5633_REG_XOUT0 0x00
+#define MMC5633_REG_XOUT1 0x01
+#define MMC5633_REG_YOUT0 0x02
+#define MMC5633_REG_YOUT1 0x03
+#define MMC5633_REG_ZOUT0 0x04
+#define MMC5633_REG_ZOUT1 0x05
+#define MMC5633_REG_XOUT2 0x06
+#define MMC5633_REG_YOUT2 0x07
+#define MMC5633_REG_ZOUT2 0x08
+#define MMC5633_REG_TOUT 0x09
+
+#define MMC5633_REG_STATUS1 0x18
+#define MMC5633_REG_STATUS0 0x19
+#define MMC5633_REG_CTRL0 0x1b
+#define MMC5633_REG_CTRL1 0x1c
+#define MMC5633_REG_CTRL2 0x1d
+
+#define MMC5633_REG_ID 0x39
+
+#define MMC5633_STATUS1_MEAS_T_DONE_BIT BIT(7)
+#define MMC5633_STATUS1_MEAS_M_DONE_BIT BIT(6)
+
+#define MMC5633_CTRL0_CMM_FREQ_EN BIT(7)
+#define MMC5633_CTRL0_AUTO_ST_EN BIT(6)
+#define MMC5633_CTRL0_AUTO_SR_EN BIT(5)
+#define MMC5633_CTRL0_RESET BIT(4)
+#define MMC5633_CTRL0_SET BIT(3)
+#define MMC5633_CTRL0_MEAS_T BIT(1)
+#define MMC5633_CTRL0_MEAS_M BIT(0)
+
+#define MMC5633_CTRL1_BW_MASK GENMASK(1, 0)
+
+#define MMC5633_WAIT_SET_RESET_US (1 * USEC_PER_MSEC)
+
+#define MMC5633_HDR_CTRL0_MEAS_M 0x01
+#define MMC5633_HDR_CTRL0_MEAS_T 0x03
+#define MMC5633_HDR_CTRL0_SET 0x05
+#define MMC5633_HDR_CTRL0_RESET 0x07
+
+enum mmc5633_axis {
+ MMC5633_AXIS_X,
+ MMC5633_AXIS_Y,
+ MMC5633_AXIS_Z,
+ MMC5633_TEMPERATURE,
+};
+
+struct mmc5633_data {
+ struct regmap *regmap;
+ struct i3c_device *i3cdev;
+ struct mutex mutex; /* protect to finish one whole measurement */
+};
+
+int mmc5633_samp_freq[][2] = {
+ { 1, 200000 },
+ { 2, 0 },
+ { 3, 500000 },
+ { 6, 600000 },
+};
+
+#define MMC5633_CHANNEL(_axis) { \
+ .type = IIO_MAGN, \
+ .modified = 1, \
+ .channel2 = IIO_MOD_ ## _axis, \
+ .address = MMC5633_AXIS_ ## _axis, \
+ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
+ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SAMP_FREQ) | \
+ BIT(IIO_CHAN_INFO_SCALE), \
+}
+
+static const struct iio_chan_spec mmc5633_channels[] = {
+ MMC5633_CHANNEL(X),
+ MMC5633_CHANNEL(Y),
+ MMC5633_CHANNEL(Z),
+ {
+ .type = IIO_TEMP,
+ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
+ BIT(IIO_CHAN_INFO_SCALE) |
+ BIT(IIO_CHAN_INFO_OFFSET),
+ .address = MMC5633_TEMPERATURE,
+ },
+};
+
+static int mmc5633_get_samp_freq_index(struct mmc5633_data *data,
+ int val, int val2)
+{
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(mmc5633_samp_freq); i++)
+ if (mmc5633_samp_freq[i][0] == val &&
+ mmc5633_samp_freq[i][1] == val2)
+ return i;
+ return -EINVAL;
+}
+
+static int mmc5633_init(struct mmc5633_data *data)
+{
+ unsigned int reg_id;
+ int ret;
+
+ ret = regmap_read(data->regmap, MMC5633_REG_ID, ®_id);
+ if (ret)
+ return dev_err_probe(regmap_get_device(data->regmap), ret,
+ "Error reading product id\n");
+
+ /*
+ * Make sure we restore sensor characteristics, by doing
+ * a SET/RESET sequence, the axis polarity being naturally
+ * aligned after RESET.
+ */
+ ret = regmap_write(data->regmap, MMC5633_REG_CTRL0, MMC5633_CTRL0_SET);
+ if (ret)
+ return ret;
+
+ /*
+ * Minimum time interval between SET or RESET to other operations is
+ * 1ms according to Operating Timing Diagram in datasheet.
+ */
+ fsleep(MMC5633_WAIT_SET_RESET_US);
+
+ ret = regmap_write(data->regmap, MMC5633_REG_CTRL0, MMC5633_CTRL0_RESET);
+ if (ret)
+ return ret;
+
+ /* set default sampling frequency */
+ return regmap_update_bits(data->regmap, MMC5633_REG_CTRL1,
+ MMC5633_CTRL1_BW_MASK,
+ FIELD_PREP(MMC5633_CTRL1_BW_MASK, 0));
+}
+
+static int mmc5633_take_measurement(struct mmc5633_data *data, int address)
+{
+ unsigned int reg_status, val;
+ int ret;
+
+ val = (address == MMC5633_TEMPERATURE) ? MMC5633_CTRL0_MEAS_T : MMC5633_CTRL0_MEAS_M;
+ ret = regmap_write(data->regmap, MMC5633_REG_CTRL0, val);
+ if (ret < 0)
+ return ret;
+
+ val = (address == MMC5633_TEMPERATURE) ?
+ MMC5633_STATUS1_MEAS_T_DONE_BIT : MMC5633_STATUS1_MEAS_M_DONE_BIT;
+ ret = regmap_read_poll_timeout(data->regmap, MMC5633_REG_STATUS1, reg_status,
+ reg_status & val,
+ 10 * USEC_PER_MSEC,
+ 100 * 10 * USEC_PER_MSEC);
+ if (ret) {
+ dev_err(regmap_get_device(data->regmap), "data not ready\n");
+ return ret;
+ }
+
+ return 0;
+}
+
+static bool mmc5633_is_support_hdr(struct mmc5633_data *data)
+{
+ if (!data->i3cdev)
+ return false;
+
+ return i3c_device_get_supported_xfer_mode(data->i3cdev) & BIT(I3C_HDR_DDR);
+}
+
+static int mmc5633_read_measurement(struct mmc5633_data *data, int address, void *buf, size_t sz)
+{
+ struct device *dev = regmap_get_device(data->regmap);
+ u8 data_cmd[2], status[2];
+ unsigned int val, ready;
+ int ret;
+
+ if (mmc5633_is_support_hdr(data)) {
+ struct i3c_xfer xfers_wr_cmd[] = {
+ {
+ .cmd = 0x3b,
+ .len = 2,
+ .data.out = data_cmd,
+ }
+ };
+ struct i3c_xfer xfers_rd_sta_cmd[] = {
+ {
+ .cmd = 0x23 | BIT(7), /* RDSTA CMD */
+ .len = 2,
+ .data.in = status,
+ },
+ };
+ struct i3c_xfer xfers_rd_data_cmd[] = {
+ {
+ .cmd = 0x22 | BIT(7), /* RDLONG CMD */
+ .len = sz,
+ .data.in = buf,
+ },
+ };
+
+ data_cmd[0] = 0;
+ data_cmd[1] = (address == MMC5633_TEMPERATURE) ?
+ MMC5633_HDR_CTRL0_MEAS_T : MMC5633_HDR_CTRL0_MEAS_M;
+
+ ret = i3c_device_do_xfers(data->i3cdev, xfers_wr_cmd,
+ ARRAY_SIZE(xfers_wr_cmd), I3C_HDR_DDR);
+ if (ret < 0)
+ return ret;
+
+ ready = (address == MMC5633_TEMPERATURE) ?
+ MMC5633_STATUS1_MEAS_T_DONE_BIT : MMC5633_STATUS1_MEAS_M_DONE_BIT;
+ ret = read_poll_timeout(i3c_device_do_xfers, val,
+ val || (status[0] & ready),
+ 10 * USEC_PER_MSEC,
+ 100 * 10 * USEC_PER_MSEC, 0,
+ data->i3cdev, xfers_rd_sta_cmd,
+ ARRAY_SIZE(xfers_rd_sta_cmd), I3C_HDR_DDR);
+ if (ret) {
+ dev_err(dev, "data not ready\n");
+ return ret;
+ }
+ if (val) {
+ dev_err(dev, "i3c transfer error\n");
+ return val;
+ }
+ return i3c_device_do_xfers(data->i3cdev, xfers_rd_data_cmd,
+ ARRAY_SIZE(xfers_rd_data_cmd), I3C_HDR_DDR);
+ }
+
+ /* Fallback to use SDR/I2C mode */
+ ret = mmc5633_take_measurement(data, address);
+ if (ret < 0)
+ return ret;
+
+ if (address == MMC5633_TEMPERATURE)
+ /*
+ * Put tempeature to last byte of buff to align HDR case.
+ * I3C will early terminate data read if previous data is not
+ * available.
+ */
+ return regmap_bulk_read(data->regmap, MMC5633_REG_TOUT, buf + sz - 1, 1);
+
+ return regmap_bulk_read(data->regmap, MMC5633_REG_XOUT0, buf, sz);
+}
+
+/* X,Y,Z 3 channels, each channel has 3 byte and TEMP */
+#define MMC5633_ALL_SIZE (3 * 3 + 1)
+
+static int mmc5633_get_raw(struct mmc5633_data *data, int index, unsigned char *buf, int *val)
+{
+ if (index == MMC5633_TEMPERATURE) {
+ *val = buf[MMC5633_ALL_SIZE - 1];
+ return 0;
+ }
+ /*
+ * X[19..12] X[11..4] Y[19..12] Y[11..4] Z[19..12] Z[11..4] X[3..0] Y[3..0] Z[3..0]
+ */
+ *val = get_unaligned_be16(buf + 2 * index) << 4;
+ *val |= buf[index + 6] >> 4;
+
+ return 0;
+}
+
+static int mmc5633_read_raw(struct iio_dev *indio_dev,
+ struct iio_chan_spec const *chan, int *val,
+ int *val2, long mask)
+{
+ struct mmc5633_data *data = iio_priv(indio_dev);
+ char buf[MMC5633_ALL_SIZE];
+ unsigned int reg, i;
+ int ret;
+
+ switch (mask) {
+ case IIO_CHAN_INFO_RAW:
+ scoped_guard(mutex, &data->mutex) {
+ ret = mmc5633_read_measurement(data, chan->address, buf, MMC5633_ALL_SIZE);
+ if (ret < 0)
+ return ret;
+ }
+
+ ret = mmc5633_get_raw(data, chan->address, buf, val);
+ if (ret < 0)
+ return ret;
+ return IIO_VAL_INT;
+ case IIO_CHAN_INFO_SCALE:
+ if (chan->type == IIO_MAGN) {
+ *val = 0;
+ *val2 = 62500;
+ } else {
+ *val = 0;
+ *val2 = 800000000; /* 0.8C */
+ }
+ return IIO_VAL_INT_PLUS_NANO;
+ case IIO_CHAN_INFO_OFFSET:
+ if (chan->type == IIO_TEMP) {
+ *val = -75;
+ return IIO_VAL_INT;
+ }
+ return -EINVAL;
+ case IIO_CHAN_INFO_SAMP_FREQ:
+ scoped_guard(mutex, &data->mutex) {
+ ret = regmap_read(data->regmap, MMC5633_REG_CTRL1, ®);
+ if (ret < 0)
+ return ret;
+ }
+
+ i = FIELD_GET(MMC5633_CTRL1_BW_MASK, reg);
+ if (i >= ARRAY_SIZE(mmc5633_samp_freq))
+ return -EINVAL;
+
+ *val = mmc5633_samp_freq[i][0];
+ *val2 = mmc5633_samp_freq[i][1];
+ return IIO_VAL_INT_PLUS_MICRO;
+ default:
+ return -EINVAL;
+ }
+}
+
+static int mmc5633_write_raw(struct iio_dev *indio_dev,
+ struct iio_chan_spec const *chan, int val,
+ int val2, long mask)
+{
+ struct mmc5633_data *data = iio_priv(indio_dev);
+ int ret;
+
+ switch (mask) {
+ case IIO_CHAN_INFO_SAMP_FREQ:
+ ret = mmc5633_get_samp_freq_index(data, val, val2);
+ if (ret < 0)
+ return ret;
+
+ guard(mutex)(&data->mutex);
+
+ return regmap_update_bits(data->regmap, MMC5633_REG_CTRL1,
+ MMC5633_CTRL1_BW_MASK,
+ FIELD_PREP(MMC5633_CTRL1_BW_MASK, ret));
+ default:
+ return -EINVAL;
+ }
+}
+
+static int mmc5633_read_avail(struct iio_dev *indio_dev,
+ struct iio_chan_spec const *chan,
+ const int **vals, int *type, int *length,
+ long mask)
+{
+ switch (mask) {
+ case IIO_CHAN_INFO_SAMP_FREQ:
+ *vals = (const int *)mmc5633_samp_freq;
+ *length = ARRAY_SIZE(mmc5633_samp_freq) * 2;
+ *type = IIO_VAL_INT_PLUS_MICRO;
+ return IIO_AVAIL_LIST;
+ default:
+ return -EINVAL;
+ }
+}
+
+static const struct iio_info mmc5633_info = {
+ .read_raw = mmc5633_read_raw,
+ .write_raw = mmc5633_write_raw,
+ .read_avail = mmc5633_read_avail,
+};
+
+static bool mmc5633_is_writeable_reg(struct device *dev, unsigned int reg)
+{
+ switch (reg) {
+ case MMC5633_REG_CTRL0:
+ case MMC5633_REG_CTRL1:
+ return true;
+ default:
+ return false;
+ }
+}
+
+static bool mmc5633_is_readable_reg(struct device *dev, unsigned int reg)
+{
+ switch (reg) {
+ case MMC5633_REG_XOUT0:
+ case MMC5633_REG_XOUT1:
+ case MMC5633_REG_YOUT0:
+ case MMC5633_REG_YOUT1:
+ case MMC5633_REG_ZOUT0:
+ case MMC5633_REG_ZOUT1:
+ case MMC5633_REG_XOUT2:
+ case MMC5633_REG_YOUT2:
+ case MMC5633_REG_ZOUT2:
+ case MMC5633_REG_TOUT:
+ case MMC5633_REG_STATUS1:
+ case MMC5633_REG_ID:
+ return true;
+ default:
+ return false;
+ }
+}
+
+static bool mmc5633_is_volatile_reg(struct device *dev, unsigned int reg)
+{
+ switch (reg) {
+ case MMC5633_REG_CTRL0:
+ case MMC5633_REG_CTRL1:
+ return false;
+ default:
+ return true;
+ }
+}
+
+static const struct reg_default mmc5633_reg_defaults[] = {
+ { MMC5633_REG_CTRL0, 0x00 },
+ { MMC5633_REG_CTRL1, 0x00 },
+};
+
+static const struct regmap_config mmc5633_regmap_config = {
+ .name = "mmc5633_regmap",
+
+ .reg_bits = 8,
+ .val_bits = 8,
+
+ .max_register = MMC5633_REG_ID,
+ .cache_type = REGCACHE_MAPLE,
+
+ .writeable_reg = mmc5633_is_writeable_reg,
+ .readable_reg = mmc5633_is_readable_reg,
+ .volatile_reg = mmc5633_is_volatile_reg,
+
+ .reg_defaults = mmc5633_reg_defaults,
+ .num_reg_defaults = ARRAY_SIZE(mmc5633_reg_defaults),
+};
+
+static int mmc5633_common_probe(struct regmap *regmap, char *name,
+ struct i3c_device *i3cdev)
+{
+ struct device *dev = regmap_get_device(regmap);
+ struct mmc5633_data *data;
+ struct iio_dev *indio_dev;
+ int ret;
+
+ indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
+ if (!indio_dev)
+ return -ENOMEM;
+
+ data = iio_priv(indio_dev);
+
+ data->regmap = regmap;
+ data->i3cdev = i3cdev;
+
+ ret = devm_mutex_init(dev, &data->mutex);
+ if (ret)
+ return ret;
+
+ indio_dev->info = &mmc5633_info;
+ indio_dev->name = name;
+ indio_dev->channels = mmc5633_channels;
+ indio_dev->num_channels = ARRAY_SIZE(mmc5633_channels);
+ indio_dev->modes = INDIO_DIRECT_MODE;
+
+ ret = mmc5633_init(data);
+ if (ret < 0)
+ return dev_err_probe(dev, ret, "mmc5633 chip init failed\n");
+
+ return devm_iio_device_register(dev, indio_dev);
+}
+
+static int mmc5633_suspend(struct device *dev)
+{
+ struct regmap *regmap = dev_get_regmap(dev, NULL);
+
+ regcache_cache_only(regmap, true);
+
+ return 0;
+}
+
+static int mmc5633_resume(struct device *dev)
+{
+ struct regmap *regmap = dev_get_regmap(dev, NULL);
+ int ret;
+
+ regcache_mark_dirty(regmap);
+ ret = regcache_sync_region(regmap, MMC5633_REG_CTRL0, MMC5633_REG_CTRL1);
+ if (ret)
+ dev_err(dev, "Failed to restore control registers\n");
+
+ regcache_cache_only(regmap, false);
+
+ return 0;
+}
+
+static int mmc5633_i2c_probe(struct i2c_client *client)
+{
+ struct device *dev = &client->dev;
+ struct regmap *regmap;
+
+ regmap = devm_regmap_init_i2c(client, &mmc5633_regmap_config);
+ if (IS_ERR(regmap))
+ return dev_err_probe(dev, PTR_ERR(regmap), "regmap init failed\n");
+
+ return mmc5633_common_probe(regmap, client->name, NULL);
+}
+
+static DEFINE_SIMPLE_DEV_PM_OPS(mmc5633_pm_ops, mmc5633_suspend, mmc5633_resume);
+
+static const struct of_device_id mmc5633_of_match[] = {
+ { .compatible = "memsic,mmc5603" },
+ { .compatible = "memsic,mmc5633" },
+ { }
+};
+MODULE_DEVICE_TABLE(of, mmc5633_of_match);
+
+static const struct i2c_device_id mmc5633_i2c_id[] = {
+ { "mmc5603" },
+ { "mmc5633" },
+ { }
+};
+MODULE_DEVICE_TABLE(i2c, mmc5633_i2c_id);
+
+static struct i2c_driver mmc5633_i2c_driver = {
+ .driver = {
+ .name = "mmc5633_i2c",
+ .of_match_table = mmc5633_of_match,
+ .pm = pm_sleep_ptr(&mmc5633_pm_ops),
+ },
+ .probe = mmc5633_i2c_probe,
+ .id_table = mmc5633_i2c_id,
+};
+
+static const struct i3c_device_id mmc5633_i3c_ids[] = {
+ I3C_DEVICE(0x0251, 0x0000, NULL),
+ { }
+};
+MODULE_DEVICE_TABLE(i3c, mmc5633_i3c_ids);
+
+static int mmc5633_i3c_probe(struct i3c_device *i3cdev)
+{
+ struct device *dev = i3cdev_to_dev(i3cdev);
+ struct regmap *regmap;
+ char *name;
+
+ name = devm_kasprintf(dev, GFP_KERNEL, "mmc5633_%s", dev_name(dev));
+ if (!name)
+ return -ENOMEM;
+
+ regmap = devm_regmap_init_i3c(i3cdev, &mmc5633_regmap_config);
+ if (IS_ERR(regmap))
+ return dev_err_probe(dev, PTR_ERR(regmap),
+ "Failed to register i3c regmap\n");
+
+ return mmc5633_common_probe(regmap, name, i3cdev);
+}
+
+static struct i3c_driver mmc5633_i3c_driver = {
+ .driver = {
+ .name = "mmc5633_i3c",
+ },
+ .probe = mmc5633_i3c_probe,
+ .id_table = mmc5633_i3c_ids,
+};
+module_i3c_i2c_driver(mmc5633_i3c_driver, &mmc5633_i2c_driver)
+
+MODULE_AUTHOR("Frank Li <Frank.li@nxp.com>");
+MODULE_DESCRIPTION("MEMSIC MMC5633 magnetic sensor driver");
+MODULE_LICENSE("GPL");
--
2.34.1
--
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v12 2/2] iio: magnetometer: Add mmc5633 sensor
2025-12-15 16:51 ` [PATCH v12 2/2] iio: magnetometer: Add mmc5633 sensor Frank Li
@ 2025-12-20 14:34 ` kernel test robot
2025-12-21 19:07 ` Jonathan Cameron
2025-12-21 19:13 ` Jonathan Cameron
1 sibling, 1 reply; 7+ messages in thread
From: kernel test robot @ 2025-12-20 14:34 UTC (permalink / raw)
To: Frank Li, Alexandre Belloni, Miquel Raynal, Jonathan Cameron,
David Lechner, Nuno Sá, Andy Shevchenko, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
Cc: llvm, oe-kbuild-all, linux-i3c, linux-kernel, imx, linux-iio,
joshua.yeong, devicetree, linux, Frank Li, Carlos Song,
Adrian Fluturel
Hi Frank,
kernel test robot noticed the following build errors:
[auto build test ERROR on 8f0b4cce4481fb22653697cced8d0d04027cb1e8]
url: https://github.com/intel-lab-lkp/linux/commits/Frank-Li/dt-bindings-trivial-devices-add-MEMSIC-3-axis-magnetometer/20251216-010451
base: 8f0b4cce4481fb22653697cced8d0d04027cb1e8
patch link: https://lore.kernel.org/r/20251215-i3c_ddr-v12-2-1ae31225b4d9%40nxp.com
patch subject: [PATCH v12 2/2] iio: magnetometer: Add mmc5633 sensor
config: arm64-allmodconfig (https://download.01.org/0day-ci/archive/20251220/202512202141.aAwyC19D-lkp@intel.com/config)
compiler: clang version 19.1.7 (https://github.com/llvm/llvm-project cd708029e0b2869e80abe31ddb175f7c35361f90)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251220/202512202141.aAwyC19D-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/202512202141.aAwyC19D-lkp@intel.com/
All errors (new ones prefixed by >>):
>> drivers/iio/magnetometer/mmc5633.c:362:2: error: cannot jump from switch statement to this case label
362 | default:
| ^
drivers/iio/magnetometer/mmc5633.c:357:3: note: jump bypasses initialization of variable with __attribute__((cleanup))
357 | guard(mutex)(&data->mutex);
| ^
include/linux/cleanup.h:414:15: note: expanded from macro 'guard'
414 | CLASS(_name, __UNIQUE_ID(guard))
| ^
include/linux/compiler.h:168:2: note: expanded from macro '__UNIQUE_ID'
168 | __PASTE(__UNIQUE_ID_, \
| ^
include/linux/compiler_types.h:16:23: note: expanded from macro '__PASTE'
16 | #define __PASTE(a, b) ___PASTE(a, b)
| ^
include/linux/compiler_types.h:15:24: note: expanded from macro '___PASTE'
15 | #define ___PASTE(a, b) a##b
| ^
<scratch space>:9:1: note: expanded from here
9 | __UNIQUE_ID_guard_966
| ^
1 error generated.
vim +362 drivers/iio/magnetometer/mmc5633.c
343
344 static int mmc5633_write_raw(struct iio_dev *indio_dev,
345 struct iio_chan_spec const *chan, int val,
346 int val2, long mask)
347 {
348 struct mmc5633_data *data = iio_priv(indio_dev);
349 int ret;
350
351 switch (mask) {
352 case IIO_CHAN_INFO_SAMP_FREQ:
353 ret = mmc5633_get_samp_freq_index(data, val, val2);
354 if (ret < 0)
355 return ret;
356
357 guard(mutex)(&data->mutex);
358
359 return regmap_update_bits(data->regmap, MMC5633_REG_CTRL1,
360 MMC5633_CTRL1_BW_MASK,
361 FIELD_PREP(MMC5633_CTRL1_BW_MASK, ret));
> 362 default:
363 return -EINVAL;
364 }
365 }
366
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
--
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v12 2/2] iio: magnetometer: Add mmc5633 sensor
2025-12-20 14:34 ` kernel test robot
@ 2025-12-21 19:07 ` Jonathan Cameron
2025-12-29 15:14 ` Frank Li
0 siblings, 1 reply; 7+ messages in thread
From: Jonathan Cameron @ 2025-12-21 19:07 UTC (permalink / raw)
To: kernel test robot
Cc: Frank Li, Alexandre Belloni, Miquel Raynal, David Lechner,
Nuno Sá, Andy Shevchenko, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, llvm, oe-kbuild-all, linux-i3c, linux-kernel, imx,
linux-iio, joshua.yeong, devicetree, linux, Carlos Song,
Adrian Fluturel
On Sat, 20 Dec 2025 22:34:47 +0800
kernel test robot <lkp@intel.com> wrote:
> Hi Frank,
>
> kernel test robot noticed the following build errors:
>
> [auto build test ERROR on 8f0b4cce4481fb22653697cced8d0d04027cb1e8]
>
> url: https://github.com/intel-lab-lkp/linux/commits/Frank-Li/dt-bindings-trivial-devices-add-MEMSIC-3-axis-magnetometer/20251216-010451
> base: 8f0b4cce4481fb22653697cced8d0d04027cb1e8
> patch link: https://lore.kernel.org/r/20251215-i3c_ddr-v12-2-1ae31225b4d9%40nxp.com
> patch subject: [PATCH v12 2/2] iio: magnetometer: Add mmc5633 sensor
> config: arm64-allmodconfig (https://download.01.org/0day-ci/archive/20251220/202512202141.aAwyC19D-lkp@intel.com/config)
> compiler: clang version 19.1.7 (https://github.com/llvm/llvm-project cd708029e0b2869e80abe31ddb175f7c35361f90)
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251220/202512202141.aAwyC19D-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/202512202141.aAwyC19D-lkp@intel.com/
>
> All errors (new ones prefixed by >>):
>
> >> drivers/iio/magnetometer/mmc5633.c:362:2: error: cannot jump from switch statement to this case label
> 362 | default:
> | ^
> drivers/iio/magnetometer/mmc5633.c:357:3: note: jump bypasses initialization of variable with __attribute__((cleanup))
> 357 | guard(mutex)(&data->mutex);
> | ^
> include/linux/cleanup.h:414:15: note: expanded from macro 'guard'
> 414 | CLASS(_name, __UNIQUE_ID(guard))
> | ^
> include/linux/compiler.h:168:2: note: expanded from macro '__UNIQUE_ID'
> 168 | __PASTE(__UNIQUE_ID_, \
> | ^
> include/linux/compiler_types.h:16:23: note: expanded from macro '__PASTE'
> 16 | #define __PASTE(a, b) ___PASTE(a, b)
> | ^
> include/linux/compiler_types.h:15:24: note: expanded from macro '___PASTE'
> 15 | #define ___PASTE(a, b) a##b
> | ^
> <scratch space>:9:1: note: expanded from here
> 9 | __UNIQUE_ID_guard_966
> | ^
> 1 error generated.
>
>
> vim +362 drivers/iio/magnetometer/mmc5633.c
>
> 343
> 344 static int mmc5633_write_raw(struct iio_dev *indio_dev,
> 345 struct iio_chan_spec const *chan, int val,
> 346 int val2, long mask)
> 347 {
> 348 struct mmc5633_data *data = iio_priv(indio_dev);
> 349 int ret;
> 350
> 351 switch (mask) {
> 352 case IIO_CHAN_INFO_SAMP_FREQ:
{
> 353 ret = mmc5633_get_samp_freq_index(data, val, val2);
> 354 if (ret < 0)
> 355 return ret;
> 356
> 357 guard(mutex)(&data->mutex);
> 358
> 359 return regmap_update_bits(data->regmap, MMC5633_REG_CTRL1,
> 360 MMC5633_CTRL1_BW_MASK,
> 361 FIELD_PREP(MMC5633_CTRL1_BW_MASK, ret));
}
Needed to add scope for the guard to apply to.
If this is all that comes up I'll fix it whilst applying.
thanks,
Jonathan
> > 362 default:
> 363 return -EINVAL;
> 364 }
> 365 }
> 366
>
--
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v12 2/2] iio: magnetometer: Add mmc5633 sensor
2025-12-15 16:51 ` [PATCH v12 2/2] iio: magnetometer: Add mmc5633 sensor Frank Li
2025-12-20 14:34 ` kernel test robot
@ 2025-12-21 19:13 ` Jonathan Cameron
1 sibling, 0 replies; 7+ messages in thread
From: Jonathan Cameron @ 2025-12-21 19:13 UTC (permalink / raw)
To: Frank Li
Cc: Alexandre Belloni, Miquel Raynal, David Lechner, Nuno Sá,
Andy Shevchenko, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
linux-i3c, linux-kernel, imx, linux-iio, joshua.yeong, devicetree,
linux, Carlos Song, Adrian Fluturel, Andy Shevchenko
On Mon, 15 Dec 2025 11:51:11 -0500
Frank Li <Frank.Li@nxp.com> wrote:
> Add mmc5633 sensor basic support.
> - Support read 20 bits X/Y/Z magnetic.
> - Support I3C HDR mode to send start measurememt command.
> - Support I3C HDR mode to read all sensors data by one command.
>
> Co-developed-by: Carlos Song <carlos.song@nxp.com>
> Signed-off-by: Carlos Song <carlos.song@nxp.com>
> Co-developed-by: Adrian Fluturel <fluturel.adrian@gmail.com>
> Signed-off-by: Adrian Fluturel <fluturel.adrian@gmail.com>
> Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
> Signed-off-by: Frank Li <Frank.Li@nxp.com>
drivers/iio/magnetometer/mmc5633.c:87:5: warning: symbol 'mmc5633_samp_freq' was not declared. Should it be static?
(I fixed up)
With that and the trivial stuff below tidied up whilst applying, applied to the togreg
branch of iio.git. I'll initially push out as testing however to let the
bots take a first look before I annoy linux-next
Jonathan
> diff --git a/drivers/iio/magnetometer/mmc5633.c b/drivers/iio/magnetometer/mmc5633.c
> new file mode 100644
> index 0000000000000000000000000000000000000000..7b20ff3b063b026ab2ae0170fd8c021973428dea
> --- /dev/null
> +++ b/drivers/iio/magnetometer/mmc5633.c
> +static int mmc5633_write_raw(struct iio_dev *indio_dev,
> + struct iio_chan_spec const *chan, int val,
> + int val2, long mask)
> +{
> + struct mmc5633_data *data = iio_priv(indio_dev);
> + int ret;
> +
> + switch (mask) {
> + case IIO_CHAN_INFO_SAMP_FREQ:
This is the missing scope thing from the bot report. {}
needed in a switch to define scope for local variables like the one guard()
is using under the hood.
> + ret = mmc5633_get_samp_freq_index(data, val, val2);
> + if (ret < 0)
> + return ret;
> +
> + guard(mutex)(&data->mutex);
> +
> + return regmap_update_bits(data->regmap, MMC5633_REG_CTRL1,
> + MMC5633_CTRL1_BW_MASK,
> + FIELD_PREP(MMC5633_CTRL1_BW_MASK, ret));
> + default:
> + return -EINVAL;
> + }
> +}
> +
> +static struct i2c_driver mmc5633_i2c_driver = {
> + .driver = {
> + .name = "mmc5633_i2c",
> + .of_match_table = mmc5633_of_match,
> + .pm = pm_sleep_ptr(&mmc5633_pm_ops),
> + },
> + .probe = mmc5633_i2c_probe,
> + .id_table = mmc5633_i2c_id,
Bonus space after =
> +};
--
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v12 2/2] iio: magnetometer: Add mmc5633 sensor
2025-12-21 19:07 ` Jonathan Cameron
@ 2025-12-29 15:14 ` Frank Li
0 siblings, 0 replies; 7+ messages in thread
From: Frank Li @ 2025-12-29 15:14 UTC (permalink / raw)
To: Jonathan Cameron
Cc: kernel test robot, Alexandre Belloni, Miquel Raynal,
David Lechner, Nuno Sá, Andy Shevchenko, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, llvm, oe-kbuild-all, linux-i3c,
linux-kernel, imx, linux-iio, joshua.yeong, devicetree, linux,
Carlos Song, Adrian Fluturel
On Sun, Dec 21, 2025 at 07:07:42PM +0000, Jonathan Cameron wrote:
> On Sat, 20 Dec 2025 22:34:47 +0800
> kernel test robot <lkp@intel.com> wrote:
>
> > Hi Frank,
> >
> > kernel test robot noticed the following build errors:
> >
> > [auto build test ERROR on 8f0b4cce4481fb22653697cced8d0d04027cb1e8]
> >
> > url: https://github.com/intel-lab-lkp/linux/commits/Frank-Li/dt-bindings-trivial-devices-add-MEMSIC-3-axis-magnetometer/20251216-010451
> > base: 8f0b4cce4481fb22653697cced8d0d04027cb1e8
> > patch link: https://lore.kernel.org/r/20251215-i3c_ddr-v12-2-1ae31225b4d9%40nxp.com
> > patch subject: [PATCH v12 2/2] iio: magnetometer: Add mmc5633 sensor
> > config: arm64-allmodconfig (https://download.01.org/0day-ci/archive/20251220/202512202141.aAwyC19D-lkp@intel.com/config)
> > compiler: clang version 19.1.7 (https://github.com/llvm/llvm-project cd708029e0b2869e80abe31ddb175f7c35361f90)
> > reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251220/202512202141.aAwyC19D-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/202512202141.aAwyC19D-lkp@intel.com/
> >
> > All errors (new ones prefixed by >>):
> >
> > >> drivers/iio/magnetometer/mmc5633.c:362:2: error: cannot jump from switch statement to this case label
> > 362 | default:
> > | ^
> > drivers/iio/magnetometer/mmc5633.c:357:3: note: jump bypasses initialization of variable with __attribute__((cleanup))
> > 357 | guard(mutex)(&data->mutex);
> > | ^
> > include/linux/cleanup.h:414:15: note: expanded from macro 'guard'
> > 414 | CLASS(_name, __UNIQUE_ID(guard))
> > | ^
> > include/linux/compiler.h:168:2: note: expanded from macro '__UNIQUE_ID'
> > 168 | __PASTE(__UNIQUE_ID_, \
> > | ^
> > include/linux/compiler_types.h:16:23: note: expanded from macro '__PASTE'
> > 16 | #define __PASTE(a, b) ___PASTE(a, b)
> > | ^
> > include/linux/compiler_types.h:15:24: note: expanded from macro '___PASTE'
> > 15 | #define ___PASTE(a, b) a##b
> > | ^
> > <scratch space>:9:1: note: expanded from here
> > 9 | __UNIQUE_ID_guard_966
> > | ^
> > 1 error generated.
> >
> >
> > vim +362 drivers/iio/magnetometer/mmc5633.c
> >
> > 343
> > 344 static int mmc5633_write_raw(struct iio_dev *indio_dev,
> > 345 struct iio_chan_spec const *chan, int val,
> > 346 int val2, long mask)
> > 347 {
> > 348 struct mmc5633_data *data = iio_priv(indio_dev);
> > 349 int ret;
> > 350
> > 351 switch (mask) {
> > 352 case IIO_CHAN_INFO_SAMP_FREQ:
> {
> > 353 ret = mmc5633_get_samp_freq_index(data, val, val2);
> > 354 if (ret < 0)
> > 355 return ret;
> > 356
> > 357 guard(mutex)(&data->mutex);
> > 358
> > 359 return regmap_update_bits(data->regmap, MMC5633_REG_CTRL1,
> > 360 MMC5633_CTRL1_BW_MASK,
> > 361 FIELD_PREP(MMC5633_CTRL1_BW_MASK, ret));
> }
> Needed to add scope for the guard to apply to.
> If this is all that comes up I'll fix it whilst applying.
Yes, thank you for your fix. If need respin patch, let me know.
Frank
>
> thanks,
>
> Jonathan
>
> > > 362 default:
> > 363 return -EINVAL;
> > 364 }
> > 365 }
> > 366
> >
>
--
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-12-29 15:14 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-15 16:51 [PATCH v12 0/2] i3c: Add basic HDR mode support (sensor part) Frank Li
2025-12-15 16:51 ` [PATCH v12 1/2] dt-bindings: trivial-devices: add MEMSIC 3-axis magnetometer Frank Li
2025-12-15 16:51 ` [PATCH v12 2/2] iio: magnetometer: Add mmc5633 sensor Frank Li
2025-12-20 14:34 ` kernel test robot
2025-12-21 19:07 ` Jonathan Cameron
2025-12-29 15:14 ` Frank Li
2025-12-21 19:13 ` Jonathan Cameron
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox