Commit Graph

6282 Commits

Author SHA1 Message Date
Hector Martin
f4f64fa8a6 i2c: pasemi: Improve error recovery
Add handling for all the missing error condition, and better recovery in
pasemi_smb_clear().

Reviewed-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Reviewed-by: Neal Gompa <neal@gompa.dev>
Signed-off-by: Hector Martin <marcan@marcan.st>
Co-developed-by: Sven Peter <sven@svenpeter.dev>
Signed-off-by: Sven Peter <sven@svenpeter.dev>
Link: https://lore.kernel.org/r/20250427-pasemi-fixes-v3-3-af28568296c0@svenpeter.dev
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:57 +02:00
Sven Peter
390b8f5834 i2c: pasemi: Improve timeout handling
The hardware (supposedly) has a 25ms timeout for clock stretching
and the driver uses 100ms which should be plenty.
The interrupt path however misses handling for errors while waiting for
the completion and the polling path uses an open-coded readx_poll_timeout.
Note that we drop reg_write(smbus, REG_SMSTA, status) while fixing those
issues here which will be done anyway whenever the next transaction starts
via pasemi_smb_clear.

Signed-off-by: Sven Peter <sven@svenpeter.dev>
Link: https://lore.kernel.org/r/20250427-pasemi-fixes-v3-2-af28568296c0@svenpeter.dev
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:57 +02:00
Hector Martin
88fe3078b5 i2c: pasemi: Enable the unjam machine
The I2C bus can get stuck under some conditions (desync between
controller and device). The pasemi controllers include an unjam feature
that is enabled on reset, but was being disabled by the driver. Keep it
enabled by explicitly setting the UJM bit in the CTL register. This
should help recover the bus from certain conditions, which would
otherwise remain stuck forever.

Signed-off-by: Hector Martin <marcan@marcan.st>
Reviewed-by: Neal Gompa <neal@gompa.dev>
Reviewed-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Signed-off-by: Sven Peter <sven@svenpeter.dev>
Link: https://lore.kernel.org/r/20250427-pasemi-fixes-v3-1-af28568296c0@svenpeter.dev
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:56 +02:00
Andi Shyti
25909e19c2 i2c: iproc: Remove unnecessary double negation
True is true when greater than '0', no need for double negation
inside the if statement.

Link: https://lore.kernel.org/r/20250418211635.2666234-11-andi.shyti@kernel.org
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:56 +02:00
Andi Shyti
d7d58a72f5 i2c: iproc: When there's an error treat it as an error
If the xfer fails, it indicates a real error. Log it with an
error message instead of a debug message to reflect its severity.

Link: https://lore.kernel.org/r/20250418211635.2666234-10-andi.shyti@kernel.org
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:56 +02:00
Andi Shyti
23c0794194 i2c: iproc: Move function and avoid prototypes
Shuffle a bit the code in order to avoid prototypes.

Link: https://lore.kernel.org/r/20250426201920.272135-1-andi.shyti@kernel.org
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:56 +02:00
Andi Shyti
d21836663f i2c: iproc: Fix indentation of bcm_iproc_i2c_slave_init()
Adjust the indentation of the bcm_iproc_i2c_slave_init() function
definition to match standard kernel coding style. Don't end the
line with an open parenthesis.

Link: https://lore.kernel.org/r/20250418211635.2666234-8-andi.shyti@kernel.org
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:56 +02:00
Andi Shyti
9f64de0f85 i2c: iproc: Replace udelay() with usleep_range()
Replace udelay(100) with usleep_range(100, 200) as recommended
by kernel documentation. The delay is not in atomic context, so
busy-waiting is unnecessary.

Also update the comment for clarity.

Link: https://lore.kernel.org/r/20250418211635.2666234-7-andi.shyti@kernel.org
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:56 +02:00
Andi Shyti
eb9b9b1e19 i2c: iproc: Remove stray blank line in slave ISR
Drop an unnecessary blank line in bcm_iproc_i2c_slave_isr().

Link: https://lore.kernel.org/r/20250418211635.2666234-6-andi.shyti@kernel.org
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:56 +02:00
Andi Shyti
9277b5f276 i2c: iproc: Fix alignment to match the open parenthesis
Alignment should match the open parenthesis but in some places it
didn't

Link: https://lore.kernel.org/r/20250418211635.2666234-5-andi.shyti@kernel.org
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:56 +02:00
Andi Shyti
f7a2df37da i2c: iproc: Use u32 instead of uint32_t
In the kernel u32 should be used instead of unit32_t.

Link: https://lore.kernel.org/r/20250418211635.2666234-4-andi.shyti@kernel.org
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:56 +02:00
Andi Shyti
8f1e88d40c i2c: iproc: Use dev_err_probe in probe
Use dev_err_probe() instead of dev_err() and then return.

Link: https://lore.kernel.org/r/20250418211635.2666234-3-andi.shyti@kernel.org
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:56 +02:00
Andi Shyti
d3e80014e1 i2c: iproc: Drop unnecessary initialisation of 'ret'
The 'ret' variable doesn't need to be initialised, as it is
always assigned before use.

While here, reorder the variable declarations in reverse
Christmas tree style, by line length.

Link: https://lore.kernel.org/r/20250418211635.2666234-2-andi.shyti@kernel.org
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:56 +02:00
Pratap Nirujogi
d6263c468a i2c: amd-isp: Add ISP i2c-designware driver
The camera sensor is connected via ISP I2C bus in AMD SOC
architectures. Add new I2C designware driver to support
new camera sensors on AMD HW.

Co-developed-by: Venkata Narendra Kumar Gutta <vengutta@amd.com>
Signed-off-by: Venkata Narendra Kumar Gutta <vengutta@amd.com>
Co-developed-by: Bin Du <bin.du@amd.com>
Signed-off-by: Bin Du <bin.du@amd.com>
Signed-off-by: Pratap Nirujogi <pratap.nirujogi@amd.com>
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
Link: https://lore.kernel.org/r/20250424184952.1290019-1-pratap.nirujogi@amd.com
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:56 +02:00
Aryan Srivastava
63ef02da5d i2c: octeon: add block-mode i2c operations
Add functions to perform block read and write operations. This applies
for cases where the requested operation is for >8 bytes of data.

When not using the block mode transfer, the driver will attempt a series
of 8 byte i2c operations until it reaches the desired total. For
example, for a 40 byte request the driver will complete 5 separate
transactions. This results in large transactions taking a significant
amount of time to process.

Add block mode such that the driver can request larger transactions, up
to 1024 bytes per transfer.

Many aspects of the block mode transfer is common with the regular 8
byte operations. Use generic functions for parts of the message
construction and sending the message. The key difference for the block
mode is the usage of separate FIFO buffer to store data.

Write to this buffer in the case of a write (before command send).
Read from this buffer in the case of a read (after command send).

Data is written into this buffer by placing data into the MSB onwards.
This means the bottom 8 bits of the data will match the top 8 bits, and
so on and so forth.

Set specific bits in message for block mode, enable block mode transfers
from global i2c management registers, construct message, send message,
read or write from FIFO buffer as required.

The block-mode transactions result in a significant speed increase in
large i2c requests.

Signed-off-by: Aryan Srivastava <aryan.srivastava@alliedtelesis.co.nz>
Link: https://lore.kernel.org/r/20250324192946.3078712-2-aryan.srivastava@alliedtelesis.co.nz
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:55 +02:00
Sven Peter
e1902d658e i2c: pasemi: Sort includes alphabetically
No functional changes.

Signed-off-by: Sven Peter <sven@svenpeter.dev>
Reviewed-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Reviewed-by: Neal Gompa <neal@gompa.dev>
Link: https://lore.kernel.org/r/20250415-pasemi-fixes-v2-2-c543bf53151a@svenpeter.dev
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:55 +02:00
Sven Peter
8e82bca35f i2c: pasemi: Use correct bits.h include
When changing the #defines to use BIT and GENMASK the bitfield.h include
was added instead of the correct bits.h include.

Reported-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Sven Peter <sven@svenpeter.dev>
Reviewed-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Reviewed-by: Neal Gompa <neal@gompa.dev>
Link: https://lore.kernel.org/r/20250415-pasemi-fixes-v2-1-c543bf53151a@svenpeter.dev
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:55 +02:00
Andy Shevchenko
688d389cdf i2c: designware: Use better constants from units.h
When we use constants in a time or frequency related contexts,
it's better to utilise the respective definitions that have
encoded units in them. This will make code better to read and
understand.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
Acked-by: Mukesh Kumar Savaliya <quic_msavaliy@quicinc.com>
Link: https://lore.kernel.org/r/20250416101702.2128740-1-andriy.shevchenko@linux.intel.com
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:55 +02:00
Enrico Zanda
6df65313ed i2c: scx200_acb: Replace dev_err() with dev_err_probe() in probe function
This simplifies the code while improving log.

Signed-off-by: Enrico Zanda <e.zanda1@gmail.com>
Link: https://lore.kernel.org/r/20250415183447.396277-11-e.zanda1@gmail.com
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:55 +02:00
Enrico Zanda
e7d8a0de70 i2c: i2c-xiic: Replace dev_err() with dev_err_probe() in probe function
This simplifies the code while improving log.

Signed-off-by: Enrico Zanda <e.zanda1@gmail.com>
Link: https://lore.kernel.org/r/20250415183447.396277-10-e.zanda1@gmail.com
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:55 +02:00
Enrico Zanda
26e3e92e13 i2c: virtio: Replace dev_err() with dev_err_probe() in probe function
This simplifies the code while improving log.

Signed-off-by: Enrico Zanda <e.zanda1@gmail.com>
Link: https://lore.kernel.org/r/20250415183447.396277-8-e.zanda1@gmail.com
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:55 +02:00
Enrico Zanda
a070c9e07a i2c: viperboard: Replace dev_err() with dev_err_probe() in probe function
This simplifies the code while improving log.

Signed-off-by: Enrico Zanda <e.zanda1@gmail.com>
Link: https://lore.kernel.org/r/20250415183447.396277-7-e.zanda1@gmail.com
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:55 +02:00
Enrico Zanda
61e26ca692 i2c: viapro: Replace dev_err() with dev_err_probe() in probe function
This simplifies the code while improving log.

Signed-off-by: Enrico Zanda <e.zanda1@gmail.com>
Link: https://lore.kernel.org/r/20250415183447.396277-6-e.zanda1@gmail.com
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:55 +02:00
Enrico Zanda
05ac621b1e i2c: via: Replace dev_err() with dev_err_probe() in probe function
This simplifies the code while improving log.

Signed-off-by: Enrico Zanda <e.zanda1@gmail.com>
Link: https://lore.kernel.org/r/20250415183447.396277-4-e.zanda1@gmail.com
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:55 +02:00
Enrico Zanda
c4f62651f2 i2c: uniphier: Replace dev_err() with dev_err_probe() in probe function
This simplifies the code while improving log.

Signed-off-by: Enrico Zanda <e.zanda1@gmail.com>
Link: https://lore.kernel.org/r/20250415183447.396277-3-e.zanda1@gmail.com
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:55 +02:00
Enrico Zanda
ca0585ac9e i2c: uniphier(-f): Replace dev_err() with dev_err_probe() in probe function
This simplifies the code while improving log.

Signed-off-by: Enrico Zanda <e.zanda1@gmail.com>
Link: https://lore.kernel.org/r/20250415183447.396277-2-e.zanda1@gmail.com
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:55 +02:00
Tali Perry
38010591a0 i2c: npcm: Add clock toggle recovery
During init of the bus, the module checks that the bus is idle.
If one of the lines are stuck try to recover them first before failing.
Sometimes SDA and SCL are low if improper reset occurs (e.g., reboot).

Signed-off-by: Tali Perry <tali.perry1@gmail.com>
Signed-off-by: Mohammed Elbadry <mohammed.0.elbadry@gmail.com>
Reviewed-by: Mukesh Kumar Savaliya <quic_msavaliy@quicinc.com>
Link: https://lore.kernel.org/r/20250328193252.1570811-1-mohammed.0.elbadry@gmail.com
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:54 +02:00
Christophe JAILLET
504cb3ce52 i2c: rzv2m: Constify struct i2c_algorithm
'struct i2c_algorithm' is not modified in this driver.

Constifying this structure moves some data to a read-only section, so
increase overall security, especially when the structure holds some
function pointers.

On a x86_64, with allmodconfig, as an example:
Before:
======
   text	   data	    bss	    dec	    hex	filename
  11027	    646	     16	  11689	   2da9	drivers/i2c/busses/i2c-rzv2m.o

After:
=====
   text	   data	    bss	    dec	    hex	filename
  11107	    566	     16	  11689	   2da9	drivers/i2c/busses/i2c-rzv2m.o

Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Reviewed-by: Fabrizio Castro <fabrizio.castro.jz@renesas.com>
Link: https://lore.kernel.org/r/537d93441ced53bffa6553b8ec93d007e64cb9a5.1743258995.git.christophe.jaillet@wanadoo.fr
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:54 +02:00
Alexander Stein
f4a5f88152 i2c: imx: add some dev_err_probe calls
Add corresponding error messages if DMA channels are not available during
probe. Using dev_err_probe adds deferred probe messages as well.

Signed-off-by: Alexander Stein <alexander.stein@ew.tq-group.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Link: https://lore.kernel.org/r/20250408100300.556703-1-alexander.stein@ew.tq-group.com
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:54 +02:00
Sudeep Holla
7b17412612 i2c: xgene-slimpro: Simplify PCC shared memory region handling
The PCC driver now handles mapping and unmapping of shared memory
areas as part of pcc_mbox_{request,free}_channel(). Without these before,
this xgene-slimpro I2C driver did handling of those mappings like several
other PCC mailbox client drivers.

There were redundant operations, leading to unnecessary code. Maintaining
the consistency across these driver was harder due to scattered handling
of shmem.

Just use the mapped shmem and remove all redundant operations from this
driver.

Cc: Andi Shyti <andi.shyti@kernel.org>
Cc: linux-i2c@vger.kernel.org
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
Acked-by: Andi Shyti <andi.shyti@kernel.org>
Link: https://lore.kernel.org/r/20250411112303.1149086-1-sudeep.holla@arm.com
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:54 +02:00
Chenyuan Yang
b7a886e7e9 i2c: lpc2k: Add check for clk_enable()
Add check for the return value of clk_enable() to catch
the potential error.

This is similar to the commit 8332e66709
("spi: zynq-qspi: Add check for clk_enable()").

Signed-off-by: Chenyuan Yang <chenyuan0y@gmail.com>
Link: https://lore.kernel.org/r/20250412193713.105838-1-chenyuan0y@gmail.com
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:54 +02:00
Zhang Songyi
5a1934f1c2 i2c: npcm7xx: Remove redundant ret variable
Return value from npcm_i2c_get_slave_addr() directly instead of taking
this in another redundant variable.

This improvement has been suggested by Zeal Robot <zealci@zte.com.cn>

Signed-off-by: Zhang Songyi <zhang.songyi@zte.com.cn>
Link: https://lore.kernel.org/r/20250320004321.1914366-1-andi.shyti@kernel.org
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:54 +02:00
Andy Shevchenko
db5194b793 i2c: qcom-geni: Use generic definitions for bus frequencies
Since we have generic definitions for bus frequencies, let's use them.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Christopher Obbard <christopher.obbard@linaro.org>
Reviewed-by: Mukesh Kumar Savaliya <quic_msavaliy@quicinc.com>
Link: https://lore.kernel.org/r/20250322144736.472777-1-andriy.shevchenko@linux.intel.com
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-19 22:23:54 +02:00
Jiri Slaby (SUSE)
3fd83ff1d9 i2c: Switch to irq_domain_create_linear()
irq_domain_add_linear() is going away as being obsolete now. Switch to
the preferred irq_domain_create_linear(). That differs in the first
parameter: It takes more generic struct fwnode_handle instead of struct
device_node. Therefore, of_fwnode_handle() is added around the
parameter.

Note some of the users can likely use dev->fwnode directly instead of
indirect of_fwnode_handle(dev->of_node). But dev->fwnode is not
guaranteed to be set for all, so this has to be investigated on case to
case basis (by people who can actually test with the HW).

[ tglx: Fix up subject prefix ]

Signed-off-by: Jiri Slaby (SUSE) <jirislaby@kernel.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/all/20250319092951.37667-20-jirislaby@kernel.org
2025-05-16 21:06:09 +02:00
Christophe JAILLET
1cfe51ef07 i2c: designware: Fix an error handling path in i2c_dw_pci_probe()
If navi_amd_register_client() fails, the previous i2c_dw_probe() call
should be undone by a corresponding i2c_del_adapter() call, as already done
in the remove function.

Fixes: 17631e8ca2 ("i2c: designware: Add driver support for AMD NAVI GPU")
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Cc: <stable@vger.kernel.org> # v5.13+
Acked-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
Link: https://lore.kernel.org/r/fcd9651835a32979df8802b2db9504c523a8ebbb.1747158983.git.christophe.jaillet@wanadoo.fr
2025-05-14 17:28:24 +02:00
Ingo Molnar
7d40efd67d Merge branch 'x86/platform' into x86/core, to merge dependent commits
Prepare to resolve conflicts with an upstream series of fixes that conflict
with pending x86 changes:

  6f5bf947ba Merge tag 'its-for-linus-20250509' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Signed-off-by: Ingo Molnar <mingo@kernel.org>
2025-05-13 10:46:22 +02:00
Johan Hovold
e66b0a8f04 i2c: omap: fix deprecated of_property_read_bool() use
Using of_property_read_bool() for non-boolean properties is deprecated
and results in a warning during runtime since commit c141ecc3ce ("of:
Warn when of_property_read_bool() is used on non-boolean properties").

Fixes: b6ef830c60 ("i2c: omap: Add support for setting mux")
Cc: Jayesh Choudhary <j-choudhary@ti.com>
Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
Acked-by: Mukesh Kumar Savaliya <quic_msavaliy@quicinc.com>
Link: https://lore.kernel.org/r/20250415075230.16235-1-johan+linaro@kernel.org
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-05-06 00:14:25 +02:00
Dan Carpenter
20d5620e9b i2c: atr: Fix end of loop test in i2c_atr_find_mapping_by_addr()
When the list_for_each_entry_reverse() exits without hitting a break
then the list cursor points to invalid memory.  So this check for
if (c2a->fixed) is checking bogus memory.  Fix it by using a "found"
variable to track if we found what we were looking for or not.

The list head (i2c_atr_chan.alias_pairs) is not a full entry, it's just
a struct list_head. When the for loop runs to completion, c2a doesn't
point to a struct i2c_atr_alias_pair, so you can't access c2a->fixed.

Fixes: c3f5524188 ("i2c: Support dynamic address translation")
Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org>
Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Reviewed-by: Romain Gantois <romain.gantois@bootlin.com>
Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
2025-05-02 16:39:54 +02:00
Clark Wang
b1852c5de2 i2c: imx-lpi2c: Fix clock count when probe defers
Deferred probe with pm_runtime_put() may delay clock disable, causing
incorrect clock usage count. Use pm_runtime_put_sync() to ensure the
clock is disabled immediately.

Fixes: 13d6eb20fc ("i2c: imx-lpi2c: add runtime pm support")
Signed-off-by: Clark Wang <xiaoning.wang@nxp.com>
Signed-off-by: Carlos Song <carlos.song@nxp.com>
Cc: <stable@vger.kernel.org> # v4.16+
Link: https://lore.kernel.org/r/20250421062341.2471922-1-carlos.song@nxp.com
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2025-04-29 10:18:51 +02:00
Mario Limonciello
624b0d5696 i2c: piix4, x86/platform: Move the SB800 PIIX4 FCH definitions to <asm/amd/fch.h>
SB800_PIIX4_FCH_PM_ADDR is used to indicate the base address for the
FCH PM registers.  Multiple drivers may need this base address, so
move related defines to a common header location and rename them
accordingly.

Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Acked-by: Andi Shyti <andi.shyti@kernel.org>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Hans de Goede <hdegoede@redhat.com>
Cc: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Cc: Jean Delvare <jdelvare@suse.com>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Sanket Goswami <Sanket.Goswami@amd.com>
Cc: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
Cc: Yazen Ghannam <yazen.ghannam@amd.com>
Cc: linux-i2c@vger.kernel.org
Link: https://lore.kernel.org/r/20250422234830.2840784-4-superm1@kernel.org
2025-04-26 11:41:06 +02:00
Mario Limonciello
7e173eb82a i2c: piix4: Make CONFIG_I2C_PIIX4 dependent on CONFIG_X86
PIIX4 and compatible controllers are only for X86. As some headers are
being moved into x86 specific headers PIIX4 won't compile on non-x86.

Suggested-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Acked-by: Andi Shyti <andi.shyti@kernel.org>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Sanket Goswami <Sanket.Goswami@amd.com>
Cc: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
Cc: Yazen Ghannam <yazen.ghannam@amd.com>
Cc: linux-i2c@vger.kernel.org
Link: https://lore.kernel.org/r/20250422234830.2840784-3-superm1@kernel.org
2025-04-26 11:40:46 +02:00
Bartosz Golaszewski
04668774f6 i2c: mux: ltc4306: use new GPIO line value setter callbacks
struct gpio_chip now has callbacks for setting line values that return
an integer, allowing to indicate failures. Convert the driver to using
them.

Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Acked-by: Peter Rosin <peda@axentia.se>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
2025-04-24 10:27:09 +02:00
Wolfram Sang
24aaced72a Merge tag 'i2c-host-fixes-6.15-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/andi.shyti/linux into i2c/for-current
i2c-host-fixes for v6.15-rc3

- ChromeOS EC tunnel: fix potential NULL pointer dereference
2025-04-18 23:42:56 +02:00
Romain Gantois
c3f5524188 i2c: Support dynamic address translation
The i2c-atr module keeps a list of associations between I2C client aliases
and I2C addresses. This represents the address translation table which is
programmed into an ATR channel at any given time. This list is only updated
when a new client is bound to the channel.

However in some cases, an ATR channel can have more downstream clients than
available aliases. One example of this is an SFP module that is bound to an
FPC202 port. The FPC202 port can only access up to two logical I2C
addresses. However, the SFP module may expose up to three logical I2C
addresses: its EEPROM on 7-bit addresses 0x50 and 0x51, and a PHY
transceiver on address 0x56.

In cases like these, it is necessary to reconfigure the channel's
translation table on the fly, so that all three I2C addresses can be
accessed when needed.

As there are currently no known ATR's which do not support dynamic address
translation, this feature can be enabled by default without breaking
existing use cases.

Modify the i2c-atr module to provide on-the-fly address translation. This
is achieved by modifying an ATR channel's translation table whenever an I2C
transaction with unmapped clients is requested.

Add a mutex to protect alias_list. This prevents
i2c_atr_dynamic_attach/detach_addr from racing with the bus notifier
handler to modify alias_list.

Tested-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Signed-off-by: Romain Gantois <romain.gantois@bootlin.com>
Acked-by: Andi Shyti <andi.shyti@kernel.org>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
2025-04-18 23:34:27 +02:00
Romain Gantois
328a106ce0 i2c: support per-channel ATR alias pools
Some I2C address translators (ATRs) assign each of their remote peripheral
aliases to a specific channel. To properly handle these devices, add
support for having separate alias pools for each ATR channel.

This is achieved by allowing callers of i2c_atr_add_adapter to pass an
optional alias list. If present, this list will be used to populate the
channel's alias pool. Otherwise, the common alias pool will be used.

Tested-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Signed-off-by: Romain Gantois <romain.gantois@bootlin.com>
Acked-by: Andi Shyti <andi.shyti@kernel.org>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
2025-04-18 23:34:19 +02:00
Romain Gantois
db1962c94d i2c: rename field 'alias_list' of struct i2c_atr_chan to 'alias_pairs'
The "alias_list" field of struct i2c_atr_chan describes translation table
entries programmed in the ATR channel. This terminology will become more
confusing when per-channel alias pool support is introduced, as struct
i2c_atr_chan will gain a new field called "alias_pool", which will describe
aliases which are available to the ATR channel.

Rename the "alias_list" field to "alias_pairs" to clearly distinguish it
from the future "alias_pool" field.

No functional change is intended.

Tested-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Signed-off-by: Romain Gantois <romain.gantois@bootlin.com>
Acked-by: Andi Shyti <andi.shyti@kernel.org>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
2025-04-18 23:34:00 +02:00
Romain Gantois
24960bd0a1 i2c: move ATR alias pool to a separate struct
Each I2C address translator (ATR) has a pool of client aliases which can be
used as translation targets. Some ATRs have a single alias pool shared by
all downstream channels, while others have a separate alias pool for each
channel. Currently, this alias pool is represented by the "aliases",
"num_aliases", and "use_mask" fields of struct i2c_atr.

In preparation for adding per-channel alias pool support, move the
"aliases", "num_aliases", "use_mask" and associated lock to a new struct
called "struct alias_pool".

Tested-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Signed-off-by: Romain Gantois <romain.gantois@bootlin.com>
Acked-by: Andi Shyti <andi.shyti@kernel.org>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
2025-04-18 23:33:53 +02:00
Romain Gantois
818bd489f1 i2c: use client addresses directly in ATR interface
The I2C Address Translator (ATR) module defines mappings from i2c_client
structs to aliases. However, only the physical address of each i2c_client
struct is actually relevant to the workings of the ATR module. Moreover,
some drivers require address translation functionality but do not allocate
i2c_client structs, accessing the adapter directly instead. The SFP
subsystem is an example of this.

Replace the "i2c_client" field of the i2c_atr_alias_pair struct with a u16
"addr" field. Rewrite helper functions and callbacks as needed.

Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Tested-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Signed-off-by: Romain Gantois <romain.gantois@bootlin.com>
Acked-by: Andi Shyti <andi.shyti@kernel.org>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
2025-04-18 23:33:46 +02:00
Andy Shevchenko
df6d7277e5 i2c: core: Do not dereference fwnode in struct device
In order to make the underneath API easier to change in the future,
prevent users from dereferencing fwnode from struct device.
Instead, use the specific device_set_node() API for that.

Tested-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Reviewed-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
2025-04-16 18:08:32 +02:00
Andy Shevchenko
3435b7f0fd i2c: core: Reuse fwnode variable where it makes sense
Reuse fwnode variable where it makes sense. This avoids unneeded
duplication hidden in some macros and unifies the code for different
types of fwnode.

Tested-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Reviewed-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
2025-04-16 18:08:12 +02:00