* [PATCH v2 00/11] Add Mobileye EyeQ5 support to the Nomadik I2C controller & use hrtimers for timeouts
@ 2024-02-29 18:10 Théo Lebrun
2024-02-29 18:10 ` [PATCH v2 01/11] dt-bindings: i2c: nomadik: add mobileye,eyeq5-i2c bindings and example Théo Lebrun
` (11 more replies)
0 siblings, 12 replies; 54+ messages in thread
From: Théo Lebrun @ 2024-02-29 18:10 UTC (permalink / raw)
To: Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Thomas Bogendoerfer
Cc: linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips,
Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni,
Tawfik Bayouk, Théo Lebrun, Jean Delvare, Guenter Roeck,
linux-hwmon
Hi,
This series adds two tangent features to the Nomadik I2C controller:
- Add a new compatible to support Mobileye EyeQ5 which uses the same IP
block as Nomadik.
It has two quirks to be handled:
- The memory bus only supports 32-bit accesses. Avoid readb() and
writeb() calls that might generate byte load/store instructions.
- We must write a value into a shared register region (OLB)
depending on the I2C bus speed.
- Allow xfer timeouts below one jiffy by using a waitqueue and hrtimers
instead of a completion.
The situation to be addressed is:
- Many devices on the same I2C bus.
- One xfer to each device is sent at regular interval.
- One device gets stuck and does not answer.
- With long timeouts, following devices won't get their message. A
shorter timeout ensures we can still talk to the following
devices.
This clashes a bit with the current i2c_adapter timeout field that
stores a jiffies amount. We therefore avoid it and store the value
in a private struct field, as a µs amount. If the timeout is less
than a jiffy duration, we switch from standard jiffies timeout to
hrtimers.
There is one patch targeting a hwmon dt-bindings file:
Documentation/devicetree/bindings/hwmon/lm75.yaml. The rest is touching
the I2C bus driver, its bindings and platform devicetrees.
About dependencies:
- The series is based upon v6.8-rc6.
- For testing on EyeQ5 hardware and devicetree patches, we need the
base platform series from Grégory [0] and its dependency [1]. Both
in mips-next [2].
- Devicetree commits require the EyeQ5 syscon series [3] that provides
the reset controller node.
- The LM75 dt-bindings patch depends on the common schema
hwmon-common.yaml series from Krzysztof [4]. Found in hwmon-next [5].
Have a nice day,
Théo Lebrun
[0]: https://lore.kernel.org/lkml/20240216174227.409400-1-gregory.clement@bootlin.com/
[1]: https://lore.kernel.org/linux-mips/20240209-regname-v1-0-2125efa016ef@flygoat.com/
[2]: https://git.kernel.org/pub/scm/linux/kernel/git/mips/linux.git/log/
[3]: https://lore.kernel.org/lkml/20240227-mbly-clk-v8-0-c57fbda7664a@bootlin.com/
[4]: https://lore.kernel.org/lkml/20240224-dt-bindings-hwmon-common-v2-0-b446eecf5480@linaro.org/
[5]: https://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git/log/?h=hwmon-next
To: Linus Walleij <linus.walleij@linaro.org>
To: Andi Shyti <andi.shyti@kernel.org>
To: Rob Herring <robh+dt@kernel.org>
To: Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>
To: Conor Dooley <conor+dt@kernel.org>
To: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Cc: <linux-arm-kernel@lists.infradead.org>
Cc: <linux-i2c@vger.kernel.org>
Cc: <devicetree@vger.kernel.org>
Cc: <linux-kernel@vger.kernel.org>
Cc: <linux-mips@vger.kernel.org>
Cc: Gregory Clement <gregory.clement@bootlin.com>
Cc: Vladimir Kondratiev <vladimir.kondratiev@mobileye.com>
Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Cc: Tawfik Bayouk <tawfik.bayouk@mobileye.com>
Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com>
Changes in v2:
- dt-bindings: i2c: st,nomadic-i2c:
- Drop timeout-usecs property, rely on generic i2c-transfer-timeout-us.
- Use phandle to syscon with cell args; remove mobileye,id prop; move
mobileye,olb from if-statement to top-level.
- dt-bindings: hwmon: lm75:
- Inherit from hwmon-common.yaml rather than declare generic label property.
- i2c: nomadik: (ie driver code)
- Parse i2c-transfer-timeout-us rather than custom timeout-usecs property.
- Introduce readb/writeb helpers with fallback to readl/writel.
- Avoid readb() on Mobileye.
- Use mobileye,olb cell args to get controller index rather than mobileye,id.
- Take 5 Reviewed-by Linus Walleij.
- MIPS: mobileye: (ie devicetrees)
- Use mobileye,olb with cell args rather than mobileye,id.
- Squash reset commit.
- Add i2c-transfer-timeout-us value of 10ms to all controllers.
- Rename LM75 instance from tmp112@48 to temperature-sensor@48.
- Link to v1: https://lore.kernel.org/r/20240215-mbly-i2c-v1-0-19a336e91dca@bootlin.com
---
Théo Lebrun (11):
dt-bindings: i2c: nomadik: add mobileye,eyeq5-i2c bindings and example
dt-bindings: hwmon: lm75: use common hwmon schema
i2c: nomadik: rename private struct pointers from dev to priv
i2c: nomadik: simplify IRQ masking logic
i2c: nomadik: use bitops helpers
i2c: nomadik: support short xfer timeouts using waitqueue & hrtimer
i2c: nomadik: replace jiffies by ktime for FIFO flushing timeout
i2c: nomadik: fetch i2c-transfer-timeout-us property from devicetree
i2c: nomadik: support Mobileye EyeQ5 I2C controller
MIPS: mobileye: eyeq5: add 5 I2C controller nodes
MIPS: mobileye: eyeq5: add evaluation board I2C temp sensor
Documentation/devicetree/bindings/hwmon/lm75.yaml | 3 +-
.../devicetree/bindings/i2c/st,nomadik-i2c.yaml | 48 +-
arch/mips/boot/dts/mobileye/eyeq5-epm5.dts | 8 +
arch/mips/boot/dts/mobileye/eyeq5.dtsi | 75 +++
drivers/i2c/busses/i2c-nomadik.c | 720 ++++++++++++---------
5 files changed, 541 insertions(+), 313 deletions(-)
---
base-commit: a6cc37d1a531e1c99e7989001a0529b443397900
change-id: 20231023-mbly-i2c-7c2fbbb1299f
Best regards,
--
Théo Lebrun <theo.lebrun@bootlin.com>
^ permalink raw reply [flat|nested] 54+ messages in thread* [PATCH v2 01/11] dt-bindings: i2c: nomadik: add mobileye,eyeq5-i2c bindings and example 2024-02-29 18:10 [PATCH v2 00/11] Add Mobileye EyeQ5 support to the Nomadik I2C controller & use hrtimers for timeouts Théo Lebrun @ 2024-02-29 18:10 ` Théo Lebrun 2024-02-29 19:26 ` Rob Herring 2024-03-01 15:11 ` Rob Herring 2024-02-29 18:10 ` [PATCH v2 02/11] dt-bindings: hwmon: lm75: use common hwmon schema Théo Lebrun ` (10 subsequent siblings) 11 siblings, 2 replies; 54+ messages in thread From: Théo Lebrun @ 2024-02-29 18:10 UTC (permalink / raw) To: Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer Cc: linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Théo Lebrun Add EyeQ5 bindings to the existing Nomadik I2C dt-bindings. Add the EyeQ5-specific property behind a conditional. Add an example for this compatible. Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> --- .../devicetree/bindings/i2c/st,nomadik-i2c.yaml | 48 ++++++++++++++++++++-- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/Documentation/devicetree/bindings/i2c/st,nomadik-i2c.yaml b/Documentation/devicetree/bindings/i2c/st,nomadik-i2c.yaml index 16024415a4a7..2d9d5b276762 100644 --- a/Documentation/devicetree/bindings/i2c/st,nomadik-i2c.yaml +++ b/Documentation/devicetree/bindings/i2c/st,nomadik-i2c.yaml @@ -14,9 +14,6 @@ description: The Nomadik I2C host controller began its life in the ST maintainers: - Linus Walleij <linus.walleij@linaro.org> -allOf: - - $ref: /schemas/i2c/i2c-controller.yaml# - # Need a custom select here or 'arm,primecell' will match on lots of nodes select: properties: @@ -24,6 +21,7 @@ select: contains: enum: - st,nomadik-i2c + - mobileye,eyeq5-i2c required: - compatible @@ -39,6 +37,10 @@ properties: - const: stericsson,db8500-i2c - const: st,nomadik-i2c - const: arm,primecell + # The variant found on Mobileye EyeQ5 + - items: + - const: mobileye,eyeq5-i2c + - const: arm,primecell reg: maxItems: 1 @@ -55,7 +57,7 @@ properties: - items: - const: mclk - const: apb_pclk - # Clock name in DB8500 + # Clock name in DB8500 or EyeQ5 - items: - const: i2cclk - const: apb_pclk @@ -70,6 +72,16 @@ properties: minimum: 1 maximum: 400000 + mobileye,olb: + $ref: /schemas/types.yaml#/definitions/phandle-array + items: + - items: + - description: Phandle to OLB system controller node. + - description: Platform-wide controller ID (integer starting from zero). + description: + The phandle pointing to OLB system controller node, with the I2C + controller index. + required: - compatible - reg @@ -79,6 +91,20 @@ required: unevaluatedProperties: false +allOf: + - $ref: /schemas/i2c/i2c-controller.yaml# + - if: + properties: + compatible: + contains: + const: mobileye,eyeq5-i2c + then: + required: + - mobileye,olb + else: + properties: + mobileye,olb: false + examples: - | #include <dt-bindings/interrupt-controller/irq.h> @@ -111,5 +137,19 @@ examples: clocks = <&i2c0clk>, <&pclki2c0>; clock-names = "mclk", "apb_pclk"; }; + - | + #include <dt-bindings/interrupt-controller/mips-gic.h> + i2c@300000 { + compatible = "mobileye,eyeq5-i2c", "arm,primecell"; + reg = <0x300000 0x1000>; + interrupt-parent = <&gic>; + interrupts = <GIC_SHARED 1 IRQ_TYPE_LEVEL_HIGH>; + clock-frequency = <400000>; + #address-cells = <1>; + #size-cells = <0>; + clocks = <&i2c_ser_clk>, <&i2c_clk>; + clock-names = "i2cclk", "apb_pclk"; + mobileye,olb = <&olb 0>; + }; ... -- 2.44.0 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [PATCH v2 01/11] dt-bindings: i2c: nomadik: add mobileye,eyeq5-i2c bindings and example 2024-02-29 18:10 ` [PATCH v2 01/11] dt-bindings: i2c: nomadik: add mobileye,eyeq5-i2c bindings and example Théo Lebrun @ 2024-02-29 19:26 ` Rob Herring 2024-03-01 15:11 ` Rob Herring 1 sibling, 0 replies; 54+ messages in thread From: Rob Herring @ 2024-02-29 19:26 UTC (permalink / raw) To: Théo Lebrun Cc: Linus Walleij, Conor Dooley, Andi Shyti, linux-arm-kernel, Vladimir Kondratiev, Gregory Clement, Tawfik Bayouk, Thomas Petazzoni, Rob Herring, Thomas Bogendoerfer, linux-i2c, devicetree, Krzysztof Kozlowski, linux-kernel, linux-mips On Thu, 29 Feb 2024 19:10:49 +0100, Théo Lebrun wrote: > Add EyeQ5 bindings to the existing Nomadik I2C dt-bindings. Add the > EyeQ5-specific property behind a conditional. Add an example for this > compatible. > > Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> > --- > .../devicetree/bindings/i2c/st,nomadik-i2c.yaml | 48 ++++++++++++++++++++-- > 1 file changed, 44 insertions(+), 4 deletions(-) > My bot found errors running 'make DT_CHECKER_FLAGS=-m dt_binding_check' on your patch (DT_CHECKER_FLAGS is new in v5.13): yamllint warnings/errors: dtschema/dtc warnings/errors: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/i2c/st,nomadik-i2c.example.dtb: i2c@300000: 'mobileye,olb' does not match any of the regexes: '^#.*', '^(at25|bm|devbus|dmacap|dsa|exynos|fsi[ab]|gpio-fan|gpio-key|gpio|gpmc|hdmi|i2c-gpio),.*', '^(keypad|m25p|max8952|max8997|max8998|mpmc),.*', '^(pinctrl-single|#pinctrl-single|PowerPC),.*', '^(pl022|pxa-mmc|rcar_sound|rotary-encoder|s5m8767|sdhci),.*', '^(simple-audio-card|st-plgpio|st-spics|ts),.*', '^100ask,.*', '^70mai,.*', '^8dev,.*', '^GEFanuc,.*', '^ORCL,.*', '^SUNW,.*', '^[a-zA-Z0-9#_][a-zA-Z0-9+\\-._@]{0,63}$', '^[a-zA-Z0-9+\\-._]*@[0-9a-zA-Z,]*$', '^abb,.*', '^abilis,.*', '^abracon,.*', '^abt,.*', '^acbel,.*', '^acer,.*', '^acme,.*', '^actions,.*', '^active-semi,.*', '^ad,.*', '^adafruit,.*', '^adapteva,.*', '^adaptrum,.*', '^adh,.*', '^adi,.*', '^adieng,.*', '^advantech,.*', '^aeroflexgaisler,.*', '^aesop,.*', '^airoha,.*', '^al,.*', '^alcatel,.*', '^aldec,.*', '^alfa-network,.*', '^allegro,.*', '^alliedvision,.*', '^allo,.*', '^allwinner,.*', '^alphascale,.*', '^alps,.*', '^alt,.*', '^altr,.*', '^amarula,.*', '^amazon,.*', '^amcc,.*', '^amd,.*', '^amediatech,.*', '^amlogic,.*', '^ampere,.*', '^ampire,.*', '^ams,.*', '^amstaos,.*', '^analogix,.*', '^anbernic,.*', '^andestech,.*', '^anvo,.*', '^aosong,.*', '^apm,.*', '^apple,.*', '^aptina,.*', '^arasan,.*', '^archermind,.*', '^arcom,.*', '^arctic,.*', '^arcx,.*', '^aries,.*', '^arm,.*', '^armadeus,.*', '^arrow,.*', '^artesyn,.*', '^asahi-kasei,.*', '^asc,.*', '^asix,.*', '^aspeed,.*', '^asrock,.*', '^asus,.*', '^atheros,.*', '^atlas,.*', '^atmel,.*', '^auo,.*', '^auvidea,.*', '^avago,.*', '^avia,.*', '^avic,.*', '^avnet,.*', '^awinic,.*', '^axentia,.*', '^axis,.*', '^azoteq,.*', '^azw,.*', '^baikal,.*', '^bananapi,.*', '^beacon,.*', '^beagle,.*', '^belling,.*', '^bhf,.*', '^bigtreetech,.*', '^bitmain,.*', '^blutek,.*', '^boe,.*', '^bosch,.*', '^boundary,.*', '^brcm,.*', '^broadmobi,.*', '^bsh,.*', '^bticino,.*', '^buffalo,.*', '^bur,.*', '^bytedance,.*', '^calamp,.*', '^calaosystems,.*', '^calxeda,.*', '^canaan,.*', '^caninos,.*', '^capella,.*', '^cascoda,.*', '^catalyst,.*', '^cavium,.*', '^cdns,.*', '^cdtech,.*', '^cellwise,.*', '^ceva,.*', '^chargebyte,.*', '^checkpoint,.*', '^chefree,.*', '^chipidea,.*', '^chipone,.*', '^chipspark,.*', '^chongzhou,.*', '^chrontel,.*', '^chrp,.*', '^chunghwa,.*', '^chuwi,.*', '^ciaa,.*', '^cirrus,.*', '^cisco,.*', '^clockwork,.*', '^cloos,.*', '^cloudengines,.*', '^cnm,.*', '^cnxt,.*', '^colorfly,.*', '^compulab,.*', '^congatec,.*', '^coolpi,.*', '^coreriver,.*', '^corpro,.*', '^cortina,.*', '^cosmic,.*', '^crane,.*', '^creative,.*', '^crystalfontz,.*', '^csky,.*', '^csq,.*', '^ctera,.*', '^ctu,.*', '^cubietech,.*', '^cui,.*', '^cypress,.*', '^cyx,.*', '^cznic,.*', '^dallas,.*', '^dataimage,.*', '^davicom,.*', '^dell,.*', '^delta,.*', '^densitron,.*', '^denx,.*', '^devantech,.*', '^dfi,.*', '^dh,.*', '^difrnce,.*', '^digi,.*', '^digilent,.*', '^dimonoff,.*', '^diodes,.*', '^dioo,.*', '^dlc,.*', '^dlg,.*', '^dlink,.*', '^dmo,.*', '^domintech,.*', '^dongwoon,.*', '^dptechnics,.*', '^dragino,.*', '^ds,.*', '^dserve,.*', '^dynaimage,.*', '^ea,.*', '^ebang,.*', '^ebbg,.*', '^ebs-systart,.*', '^ebv,.*', '^eckelmann,.*', '^edgeble,.*', '^edimax,.*', '^edt,.*', '^ees,.*', '^eeti,.*', '^einfochips,.*', '^eink,.*', '^elan,.*', '^element14,.*', '^elgin,.*', '^elida,.*', '^elimo,.*', '^elpida,.*', '^embedfire,.*', '^embest,.*', '^emlid,.*', '^emmicro,.*', '^empire-electronix,.*', '^emtrion,.*', '^enclustra,.*', '^endless,.*', '^ene,.*', '^energymicro,.*', '^engicam,.*', '^engleder,.*', '^epcos,.*', '^epfl,.*', '^epson,.*', '^esp,.*', '^est,.*', '^ettus,.*', '^eukrea,.*', '^everest,.*', '^everspin,.*', '^evervision,.*', '^exar,.*', '^excito,.*', '^exegin,.*', '^ezchip,.*', '^facebook,.*', '^fairphone,.*', '^faraday,.*', '^fascontek,.*', '^fastrax,.*', '^fcs,.*', '^feixin,.*', '^feiyang,.*', '^fii,.*', '^firefly,.*', '^focaltech,.*', '^forlinx,.*', '^freecom,.*', '^frida,.*', '^friendlyarm,.*', '^fsl,.*', '^fujitsu,.*', '^fxtec,.*', '^galaxycore,.*', '^gardena,.*', '^gateway,.*', '^gateworks,.*', '^gcw,.*', '^ge,.*', '^geekbuying,.*', '^gef,.*', '^gemei,.*', '^gemtek,.*', '^genesys,.*', '^geniatech,.*', '^giantec,.*', '^giantplus,.*', '^globalscale,.*', '^globaltop,.*', '^gmt,.*', '^goldelico,.*', '^goodix,.*', '^google,.*', '^goramo,.*', '^gplus,.*', '^grinn,.*', '^grmn,.*', '^gumstix,.*', '^gw,.*', '^hannstar,.*', '^haochuangyi,.*', '^haoyu,.*', '^hardkernel,.*', '^hechuang,.*', '^hideep,.*', '^himax,.*', '^hirschmann,.*', '^hisi,.*', '^hisilicon,.*', '^hit,.*', '^hitex,.*', '^holt,.*', '^holtek,.*', '^honestar,.*', '^honeywell,.*', '^hoperun,.*', '^hp,.*', '^hpe,.*', '^hsg,.*', '^htc,.*', '^huawei,.*', '^hugsun,.*', '^hwacom,.*', '^hxt,.*', '^hycon,.*', '^hydis,.*', '^hynitron,.*', '^hynix,.*', '^hyundai,.*', '^i2se,.*', '^ibm,.*', '^icplus,.*', '^idt,.*', '^ifi,.*', '^ilitek,.*', '^imagis,.*', '^img,.*', '^imi,.*', '^inanbo,.*', '^incircuit,.*', '^indiedroid,.*', '^inet-tek,.*', '^infineon,.*', '^inforce,.*', '^ingenic,.*', '^ingrasys,.*', '^injoinic,.*', '^innocomm,.*', '^innolux,.*', '^inside-secure,.*', '^insignal,.*', '^inspur,.*', '^intel,.*', '^intercontrol,.*', '^invensense,.*', '^inventec,.*', '^inversepath,.*', '^iom,.*', '^irondevice,.*', '^isee,.*', '^isil,.*', '^issi,.*', '^ite,.*', '^itead,.*', '^itian,.*', '^ivo,.*', '^iwave,.*', '^jadard,.*', '^jasonic,.*', '^jdi,.*', '^jedec,.*', '^jesurun,.*', '^jethome,.*', '^jianda,.*', '^joz,.*', '^kam,.*', '^karo,.*', '^keithkoep,.*', '^keymile,.*', '^khadas,.*', '^kiebackpeter,.*', '^kinetic,.*', '^kingdisplay,.*', '^kingnovel,.*', '^kionix,.*', '^kobo,.*', '^kobol,.*', '^koe,.*', '^kontron,.*', '^kosagi,.*', '^kvg,.*', '^kyo,.*', '^lacie,.*', '^laird,.*', '^lamobo,.*', '^lantiq,.*', '^lattice,.*', '^lctech,.*', '^leadtek,.*', '^leez,.*', '^lego,.*', '^lemaker,.*', '^lenovo,.*', '^lg,.*', '^lgphilips,.*', '^libretech,.*', '^licheepi,.*', '^linaro,.*', '^lineartechnology,.*', '^linksprite,.*', '^linksys,.*', '^linutronix,.*', '^linux,.*', '^linx,.*', '^liteon,.*', '^litex,.*', '^lltc,.*', '^logicpd,.*', '^logictechno,.*', '^longcheer,.*', '^lontium,.*', '^loongmasses,.*', '^loongson,.*', '^lsi,.*', '^lunzn,.*', '^lwn,.*', '^lxa,.*', '^m5stack,.*', '^macnica,.*', '^mantix,.*', '^mapleboard,.*', '^marantec,.*', '^marvell,.*', '^maxbotix,.*', '^maxim,.*', '^maxlinear,.*', '^mbvl,.*', '^mcube,.*', '^meas,.*', '^mecer,.*', '^mediatek,.*', '^megachips,.*', '^mele,.*', '^melexis,.*', '^melfas,.*', '^mellanox,.*', '^memsensing,.*', '^memsic,.*', '^menlo,.*', '^mentor,.*', '^meraki,.*', '^merrii,.*', '^methode,.*', '^micrel,.*', '^microchip,.*', '^microcrystal,.*', '^micron,.*', '^microsoft,.*', '^microsys,.*', '^mikroe,.*', '^mikrotik,.*', '^milkv,.*', '^miniand,.*', '^minix,.*', '^miramems,.*', '^mitsubishi,.*', '^mitsumi,.*', '^mixel,.*', '^miyoo,.*', '^mntre,.*', '^modtronix,.*', '^moortec,.*', '^mosaixtech,.*', '^motorcomm,.*', '^motorola,.*', '^moxa,.*', '^mpl,.*', '^mps,.*', '^mqmaker,.*', '^mrvl,.*', '^mscc,.*', '^msi,.*', '^mstar,.*', '^mti,.*', '^multi-inno,.*', '^mundoreader,.*', '^murata,.*', '^mxic,.*', '^mxicy,.*', '^myir,.*', '^national,.*', '^nec,.*', '^neonode,.*', '^netgear,.*', '^netlogic,.*', '^netron-dy,.*', '^netronix,.*', '^netxeon,.*', '^neweast,.*', '^newhaven,.*', '^newvision,.*', '^nexbox,.*', '^nextthing,.*', '^ni,.*', '^nintendo,.*', '^nlt,.*', '^nokia,.*', '^nordic,.*', '^novatek,.*', '^novtech,.*', '^nutsboard,.*', '^nuvoton,.*', '^nvd,.*', '^nvidia,.*', '^nxp,.*', '^oceanic,.*', '^ocs,.*', '^oct,.*', '^okaya,.*', '^oki,.*', '^olimex,.*', '^olpc,.*', '^oneplus,.*', '^onie,.*', '^onion,.*', '^onnn,.*', '^ontat,.*', '^opalkelly,.*', '^openailab,.*', '^opencores,.*', '^openembed,.*', '^openpandora,.*', '^openrisc,.*', '^option,.*', '^oranth,.*', '^orisetech,.*', '^ortustech,.*', '^osddisplays,.*', '^osmc,.*', '^ouya,.*', '^overkiz,.*', '^ovti,.*', '^oxsemi,.*', '^ozzmaker,.*', '^panasonic,.*', '^parade,.*', '^parallax,.*', '^pda,.*', '^pericom,.*', '^pervasive,.*', '^phicomm,.*', '^phytec,.*', '^picochip,.*', '^pine64,.*', '^pineriver,.*', '^pixcir,.*', '^plantower,.*', '^plathome,.*', '^plda,.*', '^plx,.*', '^ply,.*', '^pni,.*', '^pocketbook,.*', '^polaroid,.*', '^polyhex,.*', '^portwell,.*', '^poslab,.*', '^pov,.*', '^powertip,.*', '^powervr,.*', '^powkiddy,.*', '^primux,.*', '^probox2,.*', '^prt,.*', '^pulsedlight,.*', '^purism,.*', '^qca,.*', '^qcom,.*', '^qemu,.*', '^qi,.*', '^qiaodian,.*', '^qihua,.*', '^qishenglong,.*', '^qnap,.*', '^quanta,.*', '^radxa,.*', '^raidsonic,.*', '^ralink,.*', '^ramtron,.*', '^raspberrypi,.*', '^raydium,.*', '^rda,.*', '^realtek,.*', '^remarkable,.*', '^renesas,.*', '^rervision,.*', '^revotics,.*', '^rex,.*', '^richtek,.*', '^ricoh,.*', '^rikomagic,.*', '^riot,.*', '^riscv,.*', '^rockchip,.*', '^rocktech,.*', '^rohm,.*', '^ronbo,.*', '^roofull,.*', '^roseapplepi,.*', '^rve,.*', '^saef,.*', '^samsung,.*', '^samtec,.*', '^sancloud,.*', '^sandisk,.*', '^satoz,.*', '^sbs,.*', '^schindler,.*', '^seagate,.*', '^seeed,.*', '^seirobotics,.*', '^semtech,.*', '^senseair,.*', '^sensirion,.*', '^sensortek,.*', '^sercomm,.*', '^sff,.*', '^sgd,.*', '^sgmicro,.*', '^sgx,.*', '^sharp,.*', '^shift,.*', '^shimafuji,.*', '^shineworld,.*', '^shiratech,.*', '^si-en,.*', '^si-linux,.*', '^siemens,.*', '^sifive,.*', '^sigma,.*', '^sii,.*', '^sil,.*', '^silabs,.*', '^silan,.*', '^silead,.*', '^silergy,.*', '^silex-insight,.*', '^siliconfile,.*', '^siliconmitus,.*', '^silvaco,.*', '^simtek,.*', '^sinlinx,.*', '^sinovoip,.*', '^sinowealth,.*', '^sipeed,.*', '^sirf,.*', '^sis,.*', '^sitronix,.*', '^skov,.*', '^skyworks,.*', '^smartlabs,.*', '^smi,.*', '^smsc,.*', '^snps,.*', '^sochip,.*', '^socionext,.*', '^solidrun,.*', '^solomon,.*', '^sony,.*', '^sophgo,.*', '^sourceparts,.*', '^spansion,.*', '^sparkfun,.*', '^spinalhdl,.*', '^sprd,.*', '^square,.*', '^ssi,.*', '^sst,.*', '^sstar,.*', '^st,.*', '^st-ericsson,.*', '^starfive,.*', '^starry,.*', '^startek,.*', '^starterkit,.*', '^ste,.*', '^stericsson,.*', '^storlink,.*', '^storm,.*', '^storopack,.*', '^summit,.*', '^sunchip,.*', '^sundance,.*', '^sunplus,.*', '^supermicro,.*', '^swir,.*', '^syna,.*', '^synology,.*', '^synopsys,.*', '^tbs,.*', '^tbs-biometrics,.*', '^tcg,.*', '^tcl,.*', '^tcs,.*', '^tdo,.*', '^team-source-display,.*', '^technexion,.*', '^technologic,.*', '^techstar,.*', '^techwell,.*', '^teejet,.*', '^teltonika,.*', '^tempo,.*', '^terasic,.*', '^tesla,.*', '^tfc,.*', '^thead,.*', '^thine,.*', '^thingyjp,.*', '^thundercomm,.*', '^thwc,.*', '^ti,.*', '^tianma,.*', '^tlm,.*', '^tmt,.*', '^topeet,.*', '^topic,.*', '^toppoly,.*', '^topwise,.*', '^toradex,.*', '^toshiba,.*', '^toumaz,.*', '^tpk,.*', '^tplink,.*', '^tpo,.*', '^tq,.*', '^transpeed,.*', '^traverse,.*', '^tronfy,.*', '^tronsmart,.*', '^truly,.*', '^tsd,.*', '^turing,.*', '^tyan,.*', '^u-blox,.*', '^u-boot,.*', '^ubnt,.*', '^ucrobotics,.*', '^udoo,.*', '^ufispace,.*', '^ugoos,.*', '^uniwest,.*', '^upisemi,.*', '^urt,.*', '^usi,.*', '^usr,.*', '^utoo,.*', '^v3,.*', '^vaisala,.*', '^vamrs,.*', '^variscite,.*', '^vdl,.*', '^vertexcom,.*', '^via,.*', '^vialab,.*', '^vicor,.*', '^videostrong,.*', '^virtio,.*', '^virtual,.*', '^vishay,.*', '^visionox,.*', '^vitesse,.*', '^vivante,.*', '^vivax,.*', '^vocore,.*', '^voipac,.*', '^vot,.*', '^vxt,.*', '^wanchanglong,.*', '^wand,.*', '^waveshare,.*', '^wd,.*', '^we,.*', '^welltech,.*', '^wetek,.*', '^wexler,.*', '^whwave,.*', '^wi2wi,.*', '^widora,.*', '^wiligear,.*', '^willsemi,.*', '^winbond,.*', '^wingtech,.*', '^winlink,.*', '^winstar,.*', '^wirelesstag,.*', '^wits,.*', '^wlf,.*', '^wm,.*', '^wobo,.*', '^x-powers,.*', '^xen,.*', '^xes,.*', '^xiaomi,.*', '^xillybus,.*', '^xingbangda,.*', '^xinpeng,.*', '^xiphera,.*', '^xlnx,.*', '^xnano,.*', '^xunlong,.*', '^xylon,.*', '^yadro,.*', '^yamaha,.*', '^yes-optoelectronics,.*', '^yic,.*', '^yiming,.*', '^ylm,.*', '^yna,.*', '^yones-toptech,.*', '^ys,.*', '^ysoft,.*', '^zarlink,.*', '^zealz,.*', '^zeitec,.*', '^zidoo,.*', '^zii,.*', '^zinitix,.*', '^zkmagic,.*', '^zte,.*', '^zyxel,.*', 'pinctrl-[0-9]+' from schema $id: http://devicetree.org/schemas/vendor-prefixes.yaml# doc reference errors (make refcheckdocs): See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20240229-mbly-i2c-v2-1-b32ed18c098c@bootlin.com The base for the series is generally the latest rc1. A different dependency should be noted in *this* patch. If you already ran 'make dt_binding_check' and didn't see the above error(s), then make sure 'yamllint' is installed and dt-schema is up to date: pip3 install dtschema --upgrade Please check and re-submit after running the above command yourself. Note that DT_SCHEMA_FILES can be set to your schema file to speed up checking your schema. However, it must be unset to test all examples with your schema. ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 01/11] dt-bindings: i2c: nomadik: add mobileye,eyeq5-i2c bindings and example 2024-02-29 18:10 ` [PATCH v2 01/11] dt-bindings: i2c: nomadik: add mobileye,eyeq5-i2c bindings and example Théo Lebrun 2024-02-29 19:26 ` Rob Herring @ 2024-03-01 15:11 ` Rob Herring 2024-03-01 15:47 ` Théo Lebrun 1 sibling, 1 reply; 54+ messages in thread From: Rob Herring @ 2024-03-01 15:11 UTC (permalink / raw) To: Théo Lebrun Cc: Linus Walleij, Andi Shyti, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk On Thu, Feb 29, 2024 at 07:10:49PM +0100, Théo Lebrun wrote: > Add EyeQ5 bindings to the existing Nomadik I2C dt-bindings. Add the > EyeQ5-specific property behind a conditional. Add an example for this > compatible. > > Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> > --- > .../devicetree/bindings/i2c/st,nomadik-i2c.yaml | 48 ++++++++++++++++++++-- > 1 file changed, 44 insertions(+), 4 deletions(-) > > diff --git a/Documentation/devicetree/bindings/i2c/st,nomadik-i2c.yaml b/Documentation/devicetree/bindings/i2c/st,nomadik-i2c.yaml > index 16024415a4a7..2d9d5b276762 100644 > --- a/Documentation/devicetree/bindings/i2c/st,nomadik-i2c.yaml > +++ b/Documentation/devicetree/bindings/i2c/st,nomadik-i2c.yaml > @@ -14,9 +14,6 @@ description: The Nomadik I2C host controller began its life in the ST > maintainers: > - Linus Walleij <linus.walleij@linaro.org> > > -allOf: > - - $ref: /schemas/i2c/i2c-controller.yaml# > - > # Need a custom select here or 'arm,primecell' will match on lots of nodes > select: > properties: > @@ -24,6 +21,7 @@ select: > contains: > enum: > - st,nomadik-i2c > + - mobileye,eyeq5-i2c > required: > - compatible > > @@ -39,6 +37,10 @@ properties: > - const: stericsson,db8500-i2c > - const: st,nomadik-i2c > - const: arm,primecell > + # The variant found on Mobileye EyeQ5 Kind of obvious from the compatible string, but maybe you are keeping the existing style... > + - items: > + - const: mobileye,eyeq5-i2c > + - const: arm,primecell > > reg: > maxItems: 1 > @@ -55,7 +57,7 @@ properties: > - items: > - const: mclk > - const: apb_pclk > - # Clock name in DB8500 > + # Clock name in DB8500 or EyeQ5 > - items: > - const: i2cclk > - const: apb_pclk > @@ -70,6 +72,16 @@ properties: > minimum: 1 > maximum: 400000 > > + mobileye,olb: > + $ref: /schemas/types.yaml#/definitions/phandle-array > + items: > + - items: > + - description: Phandle to OLB system controller node. > + - description: Platform-wide controller ID (integer starting from zero). Rather than a made up ID, just store the shift value you ultimately need. These properties are fragile because they break if anything that's not defined in DT changes whether that's register offset, bit offset, bitfield size or values. Or also if there are additional fields to access. Rob ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 01/11] dt-bindings: i2c: nomadik: add mobileye,eyeq5-i2c bindings and example 2024-03-01 15:11 ` Rob Herring @ 2024-03-01 15:47 ` Théo Lebrun 0 siblings, 0 replies; 54+ messages in thread From: Théo Lebrun @ 2024-03-01 15:47 UTC (permalink / raw) To: Rob Herring Cc: Linus Walleij, Andi Shyti, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk Hello, On Fri Mar 1, 2024 at 4:11 PM CET, Rob Herring wrote: > On Thu, Feb 29, 2024 at 07:10:49PM +0100, Théo Lebrun wrote: > > Add EyeQ5 bindings to the existing Nomadik I2C dt-bindings. Add the > > EyeQ5-specific property behind a conditional. Add an example for this > > compatible. > > > > Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> > > --- > > .../devicetree/bindings/i2c/st,nomadik-i2c.yaml | 48 ++++++++++++++++++++-- > > 1 file changed, 44 insertions(+), 4 deletions(-) > > > > diff --git a/Documentation/devicetree/bindings/i2c/st,nomadik-i2c.yaml b/Documentation/devicetree/bindings/i2c/st,nomadik-i2c.yaml > > index 16024415a4a7..2d9d5b276762 100644 > > --- a/Documentation/devicetree/bindings/i2c/st,nomadik-i2c.yaml > > +++ b/Documentation/devicetree/bindings/i2c/st,nomadik-i2c.yaml > > @@ -14,9 +14,6 @@ description: The Nomadik I2C host controller began its life in the ST > > maintainers: > > - Linus Walleij <linus.walleij@linaro.org> > > > > -allOf: > > - - $ref: /schemas/i2c/i2c-controller.yaml# > > - > > # Need a custom select here or 'arm,primecell' will match on lots of nodes > > select: > > properties: > > @@ -24,6 +21,7 @@ select: > > contains: > > enum: > > - st,nomadik-i2c > > + - mobileye,eyeq5-i2c > > required: > > - compatible > > > > @@ -39,6 +37,10 @@ properties: > > - const: stericsson,db8500-i2c > > - const: st,nomadik-i2c > > - const: arm,primecell > > + # The variant found on Mobileye EyeQ5 > > Kind of obvious from the compatible string, but maybe you are keeping > the existing style... I indeed kept the existing style. Ping me if you want this removed! > > + - items: > > + - const: mobileye,eyeq5-i2c > > + - const: arm,primecell > > > > reg: > > maxItems: 1 > > @@ -55,7 +57,7 @@ properties: > > - items: > > - const: mclk > > - const: apb_pclk > > - # Clock name in DB8500 > > + # Clock name in DB8500 or EyeQ5 > > - items: > > - const: i2cclk > > - const: apb_pclk > > @@ -70,6 +72,16 @@ properties: > > minimum: 1 > > maximum: 400000 > > > > + mobileye,olb: > > + $ref: /schemas/types.yaml#/definitions/phandle-array > > + items: > > + - items: > > + - description: Phandle to OLB system controller node. > > + - description: Platform-wide controller ID (integer starting from zero). > > Rather than a made up ID, just store the shift value you ultimately > need. Issue with storing the shift value is that you also need to know what value to put in that field. It's an enum mapping the I2C speed which isn't found in DT. > These properties are fragile because they break if anything that's not > defined in DT changes whether that's register offset, bit offset, > bitfield size or values. Or also if there are additional fields to > access. My take is that it is better to have it all either in DT or in driver. Having a mix of both is a mess when debugging. If something breaks it is a driver bug; such bugs get fixed in driver code. That way DT doesn't know about it and doesn't have to be changed. Putting shifts in DT is an abstraction that ends up being unhelpful. You split hardware knowledge half in DT (register offset and/or mask), half in driver (value to put in the field). We'd rather have it all in driver code. Next hardware revision will be more complex with potentially fields split across registers. A shift value wouldn't cut it. A new compatible + made up ID allows accomodating for that. That way we have homogeneity across compatibles. Have a nice day, -- Théo Lebrun, Bootlin Embedded Linux and Kernel engineering https://bootlin.com ^ permalink raw reply [flat|nested] 54+ messages in thread
* [PATCH v2 02/11] dt-bindings: hwmon: lm75: use common hwmon schema 2024-02-29 18:10 [PATCH v2 00/11] Add Mobileye EyeQ5 support to the Nomadik I2C controller & use hrtimers for timeouts Théo Lebrun 2024-02-29 18:10 ` [PATCH v2 01/11] dt-bindings: i2c: nomadik: add mobileye,eyeq5-i2c bindings and example Théo Lebrun @ 2024-02-29 18:10 ` Théo Lebrun 2024-02-29 19:26 ` Rob Herring ` (2 more replies) 2024-02-29 18:10 ` [PATCH v2 03/11] i2c: nomadik: rename private struct pointers from dev to priv Théo Lebrun ` (9 subsequent siblings) 11 siblings, 3 replies; 54+ messages in thread From: Théo Lebrun @ 2024-02-29 18:10 UTC (permalink / raw) To: Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer Cc: linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Théo Lebrun, Jean Delvare, Guenter Roeck, linux-hwmon Reference common hwmon schema which has the generic "label" property, parsed by Linux hwmon subsystem. To: Jean Delvare <jdelvare@suse.com> To: Guenter Roeck <linux@roeck-us.net> Cc: linux-hwmon@vger.kernel.org Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> --- Documentation/devicetree/bindings/hwmon/lm75.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/hwmon/lm75.yaml b/Documentation/devicetree/bindings/hwmon/lm75.yaml index ed269e428a3d..29bd7460cc26 100644 --- a/Documentation/devicetree/bindings/hwmon/lm75.yaml +++ b/Documentation/devicetree/bindings/hwmon/lm75.yaml @@ -57,6 +57,7 @@ required: - reg allOf: + - $ref: hwmon-common.yaml# - if: not: properties: @@ -71,7 +72,7 @@ allOf: properties: interrupts: false -additionalProperties: false +unevaluatedProperties: false examples: - | -- 2.44.0 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [PATCH v2 02/11] dt-bindings: hwmon: lm75: use common hwmon schema 2024-02-29 18:10 ` [PATCH v2 02/11] dt-bindings: hwmon: lm75: use common hwmon schema Théo Lebrun @ 2024-02-29 19:26 ` Rob Herring 2024-03-01 6:37 ` Krzysztof Kozlowski 2024-03-01 19:21 ` Guenter Roeck 2 siblings, 0 replies; 54+ messages in thread From: Rob Herring @ 2024-02-29 19:26 UTC (permalink / raw) To: Théo Lebrun Cc: Gregory Clement, Conor Dooley, linux-kernel, linux-mips, linux-arm-kernel, Thomas Petazzoni, linux-hwmon, Jean Delvare, linux-i2c, Rob Herring, Linus Walleij, Krzysztof Kozlowski, devicetree, Tawfik Bayouk, Thomas Bogendoerfer, Vladimir Kondratiev, Guenter Roeck, Andi Shyti On Thu, 29 Feb 2024 19:10:50 +0100, Théo Lebrun wrote: > Reference common hwmon schema which has the generic "label" property, > parsed by Linux hwmon subsystem. > > To: Jean Delvare <jdelvare@suse.com> > To: Guenter Roeck <linux@roeck-us.net> > Cc: linux-hwmon@vger.kernel.org > Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> > --- > Documentation/devicetree/bindings/hwmon/lm75.yaml | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > My bot found errors running 'make DT_CHECKER_FLAGS=-m dt_binding_check' on your patch (DT_CHECKER_FLAGS is new in v5.13): yamllint warnings/errors: dtschema/dtc warnings/errors: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/hwmon/lm75.yaml: Error in referenced schema matching $id: http://devicetree.org/schemas/hwmon/hwmon-common.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/hwmon/lm75.example.dtb: sensor@48: False schema does not allow {'compatible': ['st,stlm75'], 'reg': [[72]], 'vs-supply': [[4294967295]], '$nodename': ['sensor@48']} from schema $id: http://devicetree.org/schemas/hwmon/lm75.yaml# /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/hwmon/lm75.example.dtb: temperature-sensor@48: False schema does not allow {'compatible': ['ams,as6200'], 'reg': [[72]], 'vs-supply': [[4294967295]], 'interrupts': [[17, 3]], '$nodename': ['temperature-sensor@48']} from schema $id: http://devicetree.org/schemas/hwmon/lm75.yaml# doc reference errors (make refcheckdocs): See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20240229-mbly-i2c-v2-2-b32ed18c098c@bootlin.com The base for the series is generally the latest rc1. A different dependency should be noted in *this* patch. If you already ran 'make dt_binding_check' and didn't see the above error(s), then make sure 'yamllint' is installed and dt-schema is up to date: pip3 install dtschema --upgrade Please check and re-submit after running the above command yourself. Note that DT_SCHEMA_FILES can be set to your schema file to speed up checking your schema. However, it must be unset to test all examples with your schema. ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 02/11] dt-bindings: hwmon: lm75: use common hwmon schema 2024-02-29 18:10 ` [PATCH v2 02/11] dt-bindings: hwmon: lm75: use common hwmon schema Théo Lebrun 2024-02-29 19:26 ` Rob Herring @ 2024-03-01 6:37 ` Krzysztof Kozlowski 2024-03-01 6:53 ` Guenter Roeck 2024-03-01 19:21 ` Guenter Roeck 2 siblings, 1 reply; 54+ messages in thread From: Krzysztof Kozlowski @ 2024-03-01 6:37 UTC (permalink / raw) To: Théo Lebrun, Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer Cc: linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Jean Delvare, Guenter Roeck, linux-hwmon On 29/02/2024 19:10, Théo Lebrun wrote: > Reference common hwmon schema which has the generic "label" property, > parsed by Linux hwmon subsystem. > Please do not mix independent patchsets. You create unneeded dependencies blocking this patch. This patch depends on hwmon work, so it cannot go through different tree. If you insist to combine independent patches, then at least clearly express merging strategy or dependency in patch changelog --- . > To: Jean Delvare <jdelvare@suse.com> > To: Guenter Roeck <linux@roeck-us.net> > Cc: linux-hwmon@vger.kernel.org > Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> > --- Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> Best regards, Krzysztof ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 02/11] dt-bindings: hwmon: lm75: use common hwmon schema 2024-03-01 6:37 ` Krzysztof Kozlowski @ 2024-03-01 6:53 ` Guenter Roeck 2024-03-01 9:41 ` Théo Lebrun 2024-03-01 15:38 ` Rob Herring 0 siblings, 2 replies; 54+ messages in thread From: Guenter Roeck @ 2024-03-01 6:53 UTC (permalink / raw) To: Krzysztof Kozlowski, Théo Lebrun, Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer Cc: linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Jean Delvare, linux-hwmon On 2/29/24 22:37, Krzysztof Kozlowski wrote: > On 29/02/2024 19:10, Théo Lebrun wrote: >> Reference common hwmon schema which has the generic "label" property, >> parsed by Linux hwmon subsystem. >> > > Please do not mix independent patchsets. You create unneeded > dependencies blocking this patch. This patch depends on hwmon work, so > it cannot go through different tree. > > If you insist to combine independent patches, then at least clearly > express merging strategy or dependency in patch changelog --- . > For my part I have to say that I don't know what to do with it. Rob's robot reported errors, so I won't apply it, and I don't feel comfortable giving it an ack either because of those errors. Guenter > >> To: Jean Delvare <jdelvare@suse.com> >> To: Guenter Roeck <linux@roeck-us.net> >> Cc: linux-hwmon@vger.kernel.org >> Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> >> --- > > > Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> > > Best regards, > Krzysztof > ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 02/11] dt-bindings: hwmon: lm75: use common hwmon schema 2024-03-01 6:53 ` Guenter Roeck @ 2024-03-01 9:41 ` Théo Lebrun 2024-03-01 10:13 ` Krzysztof Kozlowski 2024-03-01 15:38 ` Rob Herring 1 sibling, 1 reply; 54+ messages in thread From: Théo Lebrun @ 2024-03-01 9:41 UTC (permalink / raw) To: Guenter Roeck, Krzysztof Kozlowski, Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer Cc: linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Jean Delvare, linux-hwmon Hello, On Fri Mar 1, 2024 at 7:53 AM CET, Guenter Roeck wrote: > On 2/29/24 22:37, Krzysztof Kozlowski wrote: > > On 29/02/2024 19:10, Théo Lebrun wrote: > >> Reference common hwmon schema which has the generic "label" property, > >> parsed by Linux hwmon subsystem. > >> > > > > Please do not mix independent patchsets. You create unneeded > > dependencies blocking this patch. This patch depends on hwmon work, so > > it cannot go through different tree. I had to pick between this or dtbs_check failing on my DTS that uses a label on temperature-sensor@48. > > If you insist to combine independent patches, then at least clearly > > express merging strategy or dependency in patch changelog --- . I do not know how such indirect conflicts are usually resolved. Hwmon can take it but MIPS might want to also take it to have valid DTS. Any advice? > For my part I have to say that I don't know what to do with it. > Rob's robot reported errors, so I won't apply it, and I don't > feel comfortable giving it an ack either because of those errors. Can reproduce the error when patch "dt-bindings: hwmon: add common properties" is not applied. Cannot reproduce when patch is applied. Commit d590900b62f0 on hwmon-next. Cannot reproduce with hwmon-next as parent. Regards, -- Théo Lebrun, Bootlin Embedded Linux and Kernel engineering https://bootlin.com ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 02/11] dt-bindings: hwmon: lm75: use common hwmon schema 2024-03-01 9:41 ` Théo Lebrun @ 2024-03-01 10:13 ` Krzysztof Kozlowski 2024-03-01 10:44 ` Théo Lebrun 0 siblings, 1 reply; 54+ messages in thread From: Krzysztof Kozlowski @ 2024-03-01 10:13 UTC (permalink / raw) To: Théo Lebrun, Guenter Roeck, Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer Cc: linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Jean Delvare, linux-hwmon On 01/03/2024 10:41, Théo Lebrun wrote: > Hello, > > On Fri Mar 1, 2024 at 7:53 AM CET, Guenter Roeck wrote: >> On 2/29/24 22:37, Krzysztof Kozlowski wrote: >>> On 29/02/2024 19:10, Théo Lebrun wrote: >>>> Reference common hwmon schema which has the generic "label" property, >>>> parsed by Linux hwmon subsystem. >>>> >>> >>> Please do not mix independent patchsets. You create unneeded >>> dependencies blocking this patch. This patch depends on hwmon work, so >>> it cannot go through different tree. > > I had to pick between this or dtbs_check failing on my DTS that uses a > label on temperature-sensor@48. I don't see how is that relevant. You can organize your branches as you wish, e.g. base one b4 branch on another and you will not have any warnings. > >>> If you insist to combine independent patches, then at least clearly >>> express merging strategy or dependency in patch changelog --- . > > I do not know how such indirect conflicts are usually resolved. Hwmon > can take it but MIPS might want to also take it to have valid DTS. > > Any advice? I don't see any conflict. > >> For my part I have to say that I don't know what to do with it. >> Rob's robot reported errors, so I won't apply it, and I don't >> feel comfortable giving it an ack either because of those errors. > > Can reproduce the error when patch "dt-bindings: hwmon: add common > properties" is not applied. Cannot reproduce when patch is applied. > Commit d590900b62f0 on hwmon-next. Cannot reproduce with hwmon-next as > parent. Yeah, but we see the error reported and it means something is missing. Best regards, Krzysztof ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 02/11] dt-bindings: hwmon: lm75: use common hwmon schema 2024-03-01 10:13 ` Krzysztof Kozlowski @ 2024-03-01 10:44 ` Théo Lebrun 2024-03-01 11:35 ` Krzysztof Kozlowski 2024-03-01 15:35 ` Rob Herring 0 siblings, 2 replies; 54+ messages in thread From: Théo Lebrun @ 2024-03-01 10:44 UTC (permalink / raw) To: Krzysztof Kozlowski, Guenter Roeck, Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer Cc: linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Jean Delvare, linux-hwmon Hello, On Fri Mar 1, 2024 at 11:13 AM CET, Krzysztof Kozlowski wrote: > On 01/03/2024 10:41, Théo Lebrun wrote: > > Hello, > > > > On Fri Mar 1, 2024 at 7:53 AM CET, Guenter Roeck wrote: > >> On 2/29/24 22:37, Krzysztof Kozlowski wrote: > >>> On 29/02/2024 19:10, Théo Lebrun wrote: > >>>> Reference common hwmon schema which has the generic "label" property, > >>>> parsed by Linux hwmon subsystem. > >>>> > >>> > >>> Please do not mix independent patchsets. You create unneeded > >>> dependencies blocking this patch. This patch depends on hwmon work, so > >>> it cannot go through different tree. > > > > I had to pick between this or dtbs_check failing on my DTS that uses a > > label on temperature-sensor@48. > > I don't see how is that relevant. You can organize your branches as you > wish, e.g. base one b4 branch on another and you will not have any warnings. That is what I do, I however do not want mips-next to have errors when running dtbs_check. Having dtbs_check return errors is not an issue? > >>> If you insist to combine independent patches, then at least clearly > >>> express merging strategy or dependency in patch changelog --- . > > > > I do not know how such indirect conflicts are usually resolved. Hwmon > > can take it but MIPS might want to also take it to have valid DTS. > > > > Any advice? > > I don't see any conflict. I shouldn't have called that a conflict, more like a dependency. > >> For my part I have to say that I don't know what to do with it. > >> Rob's robot reported errors, so I won't apply it, and I don't > >> feel comfortable giving it an ack either because of those errors. > > > > Can reproduce the error when patch "dt-bindings: hwmon: add common > > properties" is not applied. Cannot reproduce when patch is applied. > > Commit d590900b62f0 on hwmon-next. Cannot reproduce with hwmon-next as > > parent. > > Yeah, but we see the error reported and it means something is missing. Yes, this series depends on "dt-bindings: hwmon: add common properties" which the bot doesn't know it needs to apply. Should I submit this patch independently and have my DTS be broken wrt dtbs_check? Have a nice day, -- Théo Lebrun, Bootlin Embedded Linux and Kernel engineering https://bootlin.com ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 02/11] dt-bindings: hwmon: lm75: use common hwmon schema 2024-03-01 10:44 ` Théo Lebrun @ 2024-03-01 11:35 ` Krzysztof Kozlowski 2024-03-01 14:09 ` Théo Lebrun 2024-03-01 15:35 ` Rob Herring 1 sibling, 1 reply; 54+ messages in thread From: Krzysztof Kozlowski @ 2024-03-01 11:35 UTC (permalink / raw) To: Théo Lebrun, Guenter Roeck, Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer Cc: linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Jean Delvare, linux-hwmon On 01/03/2024 11:44, Théo Lebrun wrote: > Hello, > > On Fri Mar 1, 2024 at 11:13 AM CET, Krzysztof Kozlowski wrote: >> On 01/03/2024 10:41, Théo Lebrun wrote: >>> Hello, >>> >>> On Fri Mar 1, 2024 at 7:53 AM CET, Guenter Roeck wrote: >>>> On 2/29/24 22:37, Krzysztof Kozlowski wrote: >>>>> On 29/02/2024 19:10, Théo Lebrun wrote: >>>>>> Reference common hwmon schema which has the generic "label" property, >>>>>> parsed by Linux hwmon subsystem. >>>>>> >>>>> >>>>> Please do not mix independent patchsets. You create unneeded >>>>> dependencies blocking this patch. This patch depends on hwmon work, so >>>>> it cannot go through different tree. >>> >>> I had to pick between this or dtbs_check failing on my DTS that uses a >>> label on temperature-sensor@48. >> >> I don't see how is that relevant. You can organize your branches as you >> wish, e.g. base one b4 branch on another and you will not have any warnings. > > That is what I do, I however do not want mips-next to have errors when > running dtbs_check. Having dtbs_check return errors is not an issue? You should ask your maintainer, but I don't understand how this is achievable anyway. Subsystem bindings *should not* go via MIPS-next, so how are you going to solve this? And why MIPS shall be different than all other ARM/RISC-V SoCs? Best regards, Krzysztof ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 02/11] dt-bindings: hwmon: lm75: use common hwmon schema 2024-03-01 11:35 ` Krzysztof Kozlowski @ 2024-03-01 14:09 ` Théo Lebrun 2024-03-01 14:13 ` Krzysztof Kozlowski 0 siblings, 1 reply; 54+ messages in thread From: Théo Lebrun @ 2024-03-01 14:09 UTC (permalink / raw) To: Krzysztof Kozlowski, Guenter Roeck, Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer Cc: linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Jean Delvare, linux-hwmon Hello, On Fri Mar 1, 2024 at 12:35 PM CET, Krzysztof Kozlowski wrote: > On 01/03/2024 11:44, Théo Lebrun wrote: > > On Fri Mar 1, 2024 at 11:13 AM CET, Krzysztof Kozlowski wrote: > >> On 01/03/2024 10:41, Théo Lebrun wrote: > >>> On Fri Mar 1, 2024 at 7:53 AM CET, Guenter Roeck wrote: > >>>> On 2/29/24 22:37, Krzysztof Kozlowski wrote: > >>>>> On 29/02/2024 19:10, Théo Lebrun wrote: > >>>>>> Reference common hwmon schema which has the generic "label" property, > >>>>>> parsed by Linux hwmon subsystem. > >>>>> > >>>>> Please do not mix independent patchsets. You create unneeded > >>>>> dependencies blocking this patch. This patch depends on hwmon work, so > >>>>> it cannot go through different tree. > >>> > >>> I had to pick between this or dtbs_check failing on my DTS that uses a > >>> label on temperature-sensor@48. > >> > >> I don't see how is that relevant. You can organize your branches as you > >> wish, e.g. base one b4 branch on another and you will not have any warnings. > > > > That is what I do, I however do not want mips-next to have errors when > > running dtbs_check. Having dtbs_check return errors is not an issue? > > You should ask your maintainer, but I don't understand how this is > achievable anyway. Subsystem bindings *should not* go via MIPS-next, so > how are you going to solve this? I thought it'd go in hwmon-next and be picked up by mips-next as well. It's clear now that the right approach is to send the lm75.yaml patch alone. I'll wait some more before sending a new revision that drops this lm75.yaml patch. Have a nice day, -- Théo Lebrun, Bootlin Embedded Linux and Kernel engineering https://bootlin.com ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 02/11] dt-bindings: hwmon: lm75: use common hwmon schema 2024-03-01 14:09 ` Théo Lebrun @ 2024-03-01 14:13 ` Krzysztof Kozlowski 0 siblings, 0 replies; 54+ messages in thread From: Krzysztof Kozlowski @ 2024-03-01 14:13 UTC (permalink / raw) To: Théo Lebrun, Guenter Roeck, Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer Cc: linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Jean Delvare, linux-hwmon On 01/03/2024 15:09, Théo Lebrun wrote: >>>> I don't see how is that relevant. You can organize your branches as you >>>> wish, e.g. base one b4 branch on another and you will not have any warnings. >>> >>> That is what I do, I however do not want mips-next to have errors when >>> running dtbs_check. Having dtbs_check return errors is not an issue? >> >> You should ask your maintainer, but I don't understand how this is >> achievable anyway. Subsystem bindings *should not* go via MIPS-next, so >> how are you going to solve this? > > I thought it'd go in hwmon-next and be picked up by mips-next as well. > It's clear now that the right approach is to send the lm75.yaml patch > alone. Then mips-next-dts branch would be based on subsystem branch with driver changes? That violates the policy of not creating dependencies between DTS and drivers. What matters is final or even future release, not intermediate state. Best regards, Krzysztof ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 02/11] dt-bindings: hwmon: lm75: use common hwmon schema 2024-03-01 10:44 ` Théo Lebrun 2024-03-01 11:35 ` Krzysztof Kozlowski @ 2024-03-01 15:35 ` Rob Herring 2024-03-01 15:52 ` Théo Lebrun 1 sibling, 1 reply; 54+ messages in thread From: Rob Herring @ 2024-03-01 15:35 UTC (permalink / raw) To: Théo Lebrun Cc: Krzysztof Kozlowski, Guenter Roeck, Linus Walleij, Andi Shyti, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Jean Delvare, linux-hwmon On Fri, Mar 01, 2024 at 11:44:37AM +0100, Théo Lebrun wrote: > Hello, > > On Fri Mar 1, 2024 at 11:13 AM CET, Krzysztof Kozlowski wrote: > > On 01/03/2024 10:41, Théo Lebrun wrote: > > > Hello, > > > > > > On Fri Mar 1, 2024 at 7:53 AM CET, Guenter Roeck wrote: > > >> On 2/29/24 22:37, Krzysztof Kozlowski wrote: > > >>> On 29/02/2024 19:10, Théo Lebrun wrote: > > >>>> Reference common hwmon schema which has the generic "label" property, > > >>>> parsed by Linux hwmon subsystem. > > >>>> > > >>> > > >>> Please do not mix independent patchsets. You create unneeded > > >>> dependencies blocking this patch. This patch depends on hwmon work, so > > >>> it cannot go through different tree. > > > > > > I had to pick between this or dtbs_check failing on my DTS that uses a > > > label on temperature-sensor@48. > > > > I don't see how is that relevant. You can organize your branches as you > > wish, e.g. base one b4 branch on another and you will not have any warnings. > > That is what I do, I however do not want mips-next to have errors when > running dtbs_check. Having dtbs_check return errors is not an issue? That's a good goal, but difficult to achieve as you can see. Given dtbs_check in general has tons of warnings already, we currently don't worry about more warnings in specific branches. We just look at mainline and linux-next. And for that it's still so many, I'm just looking at general trends. It runs daily here[1]. As we get more platforms trying to stay at zero warnings, then we'll need to revisit this. I imagine that will mean all schemas have to go in 1 branch with acks from subsystem maintainers. That's the opposite of what we do now. And then .dts branches will have to merge in the schema branch as needed. There are some checks (make dt_compatible_check) to for drivers vs. the schemas, so we'd have the same issue with intermittent warnings. But the drivers should be more decoupled from the schemas than the dts files. Rob [1] https://gitlab.com/robherring/linux-dt/-/jobs ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 02/11] dt-bindings: hwmon: lm75: use common hwmon schema 2024-03-01 15:35 ` Rob Herring @ 2024-03-01 15:52 ` Théo Lebrun 0 siblings, 0 replies; 54+ messages in thread From: Théo Lebrun @ 2024-03-01 15:52 UTC (permalink / raw) To: Rob Herring Cc: Krzysztof Kozlowski, Guenter Roeck, Linus Walleij, Andi Shyti, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Jean Delvare, linux-hwmon Hello, On Fri Mar 1, 2024 at 4:35 PM CET, Rob Herring wrote: > On Fri, Mar 01, 2024 at 11:44:37AM +0100, Théo Lebrun wrote: > > Hello, > > > > On Fri Mar 1, 2024 at 11:13 AM CET, Krzysztof Kozlowski wrote: > > > On 01/03/2024 10:41, Théo Lebrun wrote: > > > > Hello, > > > > > > > > On Fri Mar 1, 2024 at 7:53 AM CET, Guenter Roeck wrote: > > > >> On 2/29/24 22:37, Krzysztof Kozlowski wrote: > > > >>> On 29/02/2024 19:10, Théo Lebrun wrote: > > > >>>> Reference common hwmon schema which has the generic "label" property, > > > >>>> parsed by Linux hwmon subsystem. > > > >>>> > > > >>> > > > >>> Please do not mix independent patchsets. You create unneeded > > > >>> dependencies blocking this patch. This patch depends on hwmon work, so > > > >>> it cannot go through different tree. > > > > > > > > I had to pick between this or dtbs_check failing on my DTS that uses a > > > > label on temperature-sensor@48. > > > > > > I don't see how is that relevant. You can organize your branches as you > > > wish, e.g. base one b4 branch on another and you will not have any warnings. > > > > That is what I do, I however do not want mips-next to have errors when > > running dtbs_check. Having dtbs_check return errors is not an issue? > > That's a good goal, but difficult to achieve as you can see. Given > dtbs_check in general has tons of warnings already, we currently don't > worry about more warnings in specific branches. We just look at mainline > and linux-next. And for that it's still so many, I'm just looking at > general trends. It runs daily here[1]. Here's my opportunity to ask a question I've had for a while: do you have a way to filter out dtbs that are known to be bad actors (ie have many many warnings)? Maybe a list of platforms you talk about below that aim at zero warnings? Another way to ask this: what would be a good default DT_SCHEMA_FILES value? Not filtering leads to way too many errors. Regards, -- Théo Lebrun, Bootlin Embedded Linux and Kernel engineering https://bootlin.com ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 02/11] dt-bindings: hwmon: lm75: use common hwmon schema 2024-03-01 6:53 ` Guenter Roeck 2024-03-01 9:41 ` Théo Lebrun @ 2024-03-01 15:38 ` Rob Herring 1 sibling, 0 replies; 54+ messages in thread From: Rob Herring @ 2024-03-01 15:38 UTC (permalink / raw) To: Guenter Roeck Cc: Krzysztof Kozlowski, Théo Lebrun, Linus Walleij, Andi Shyti, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Jean Delvare, linux-hwmon On Thu, Feb 29, 2024 at 10:53:07PM -0800, Guenter Roeck wrote: > On 2/29/24 22:37, Krzysztof Kozlowski wrote: > > On 29/02/2024 19:10, Théo Lebrun wrote: > > > Reference common hwmon schema which has the generic "label" property, > > > parsed by Linux hwmon subsystem. > > > > > > > Please do not mix independent patchsets. You create unneeded > > dependencies blocking this patch. This patch depends on hwmon work, so > > it cannot go through different tree. > > > > If you insist to combine independent patches, then at least clearly > > express merging strategy or dependency in patch changelog --- . > > > > For my part I have to say that I don't know what to do with it. > Rob's robot reported errors, so I won't apply it, and I don't > feel comfortable giving it an ack either because of those errors. You can apply it. Those are just related to not finding hwmon-common.yaml which you have, and Théo confirmed it works on hwmon-next. Rob ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 02/11] dt-bindings: hwmon: lm75: use common hwmon schema 2024-02-29 18:10 ` [PATCH v2 02/11] dt-bindings: hwmon: lm75: use common hwmon schema Théo Lebrun 2024-02-29 19:26 ` Rob Herring 2024-03-01 6:37 ` Krzysztof Kozlowski @ 2024-03-01 19:21 ` Guenter Roeck 2 siblings, 0 replies; 54+ messages in thread From: Guenter Roeck @ 2024-03-01 19:21 UTC (permalink / raw) To: Théo Lebrun Cc: Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Jean Delvare, linux-hwmon On Thu, Feb 29, 2024 at 07:10:50PM +0100, Théo Lebrun wrote: > Reference common hwmon schema which has the generic "label" property, > parsed by Linux hwmon subsystem. > > To: Jean Delvare <jdelvare@suse.com> > To: Guenter Roeck <linux@roeck-us.net> > Cc: linux-hwmon@vger.kernel.org > Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> > Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> Applied to hwmon-next. Thanks, Guenter ^ permalink raw reply [flat|nested] 54+ messages in thread
* [PATCH v2 03/11] i2c: nomadik: rename private struct pointers from dev to priv 2024-02-29 18:10 [PATCH v2 00/11] Add Mobileye EyeQ5 support to the Nomadik I2C controller & use hrtimers for timeouts Théo Lebrun 2024-02-29 18:10 ` [PATCH v2 01/11] dt-bindings: i2c: nomadik: add mobileye,eyeq5-i2c bindings and example Théo Lebrun 2024-02-29 18:10 ` [PATCH v2 02/11] dt-bindings: hwmon: lm75: use common hwmon schema Théo Lebrun @ 2024-02-29 18:10 ` Théo Lebrun 2024-03-02 0:16 ` [SPAM] " Andi Shyti 2024-03-04 9:13 ` Wolfram Sang 2024-02-29 18:10 ` [PATCH v2 04/11] i2c: nomadik: simplify IRQ masking logic Théo Lebrun ` (8 subsequent siblings) 11 siblings, 2 replies; 54+ messages in thread From: Théo Lebrun @ 2024-02-29 18:10 UTC (permalink / raw) To: Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer Cc: linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Théo Lebrun Disambiguate the usage of dev as a variable name; it is usually best to keep it reserved for struct device pointers. Avoid having multiple names for the same struct pointer (previously: dev, nmk, nmk_i2c). Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> --- drivers/i2c/busses/i2c-nomadik.c | 428 +++++++++++++++++++-------------------- 1 file changed, 214 insertions(+), 214 deletions(-) diff --git a/drivers/i2c/busses/i2c-nomadik.c b/drivers/i2c/busses/i2c-nomadik.c index b10574d42b7a..cd511c884f99 100644 --- a/drivers/i2c/busses/i2c-nomadik.c +++ b/drivers/i2c/busses/i2c-nomadik.c @@ -206,12 +206,12 @@ static inline void i2c_clr_bit(void __iomem *reg, u32 mask) /** * flush_i2c_fifo() - This function flushes the I2C FIFO - * @dev: private data of I2C Driver + * @priv: private data of I2C Driver * * This function flushes the I2C Tx and Rx FIFOs. It returns * 0 on successful flushing of FIFO */ -static int flush_i2c_fifo(struct nmk_i2c_dev *dev) +static int flush_i2c_fifo(struct nmk_i2c_dev *priv) { #define LOOP_ATTEMPTS 10 int i; @@ -224,19 +224,19 @@ static int flush_i2c_fifo(struct nmk_i2c_dev *dev) * bits, until then no one must access Tx, Rx FIFO and * should poll on these bits waiting for the completion. */ - writel((I2C_CR_FTX | I2C_CR_FRX), dev->virtbase + I2C_CR); + writel((I2C_CR_FTX | I2C_CR_FRX), priv->virtbase + I2C_CR); for (i = 0; i < LOOP_ATTEMPTS; i++) { - timeout = jiffies + dev->adap.timeout; + timeout = jiffies + priv->adap.timeout; while (!time_after(jiffies, timeout)) { - if ((readl(dev->virtbase + I2C_CR) & + if ((readl(priv->virtbase + I2C_CR) & (I2C_CR_FTX | I2C_CR_FRX)) == 0) - return 0; + return 0; } } - dev_err(&dev->adev->dev, + dev_err(&priv->adev->dev, "flushing operation timed out giving up after %d attempts", LOOP_ATTEMPTS); @@ -245,45 +245,45 @@ static int flush_i2c_fifo(struct nmk_i2c_dev *dev) /** * disable_all_interrupts() - Disable all interrupts of this I2c Bus - * @dev: private data of I2C Driver + * @priv: private data of I2C Driver */ -static void disable_all_interrupts(struct nmk_i2c_dev *dev) +static void disable_all_interrupts(struct nmk_i2c_dev *priv) { u32 mask = IRQ_MASK(0); - writel(mask, dev->virtbase + I2C_IMSCR); + writel(mask, priv->virtbase + I2C_IMSCR); } /** * clear_all_interrupts() - Clear all interrupts of I2C Controller - * @dev: private data of I2C Driver + * @priv: private data of I2C Driver */ -static void clear_all_interrupts(struct nmk_i2c_dev *dev) +static void clear_all_interrupts(struct nmk_i2c_dev *priv) { u32 mask; mask = IRQ_MASK(I2C_CLEAR_ALL_INTS); - writel(mask, dev->virtbase + I2C_ICR); + writel(mask, priv->virtbase + I2C_ICR); } /** * init_hw() - initialize the I2C hardware - * @dev: private data of I2C Driver + * @priv: private data of I2C Driver */ -static int init_hw(struct nmk_i2c_dev *dev) +static int init_hw(struct nmk_i2c_dev *priv) { int stat; - stat = flush_i2c_fifo(dev); + stat = flush_i2c_fifo(priv); if (stat) goto exit; /* disable the controller */ - i2c_clr_bit(dev->virtbase + I2C_CR, I2C_CR_PE); + i2c_clr_bit(priv->virtbase + I2C_CR, I2C_CR_PE); - disable_all_interrupts(dev); + disable_all_interrupts(priv); - clear_all_interrupts(dev); + clear_all_interrupts(priv); - dev->cli.operation = I2C_NO_OPERATION; + priv->cli.operation = I2C_NO_OPERATION; exit: return stat; @@ -294,15 +294,15 @@ static int init_hw(struct nmk_i2c_dev *dev) /** * load_i2c_mcr_reg() - load the MCR register - * @dev: private data of controller + * @priv: private data of controller * @flags: message flags */ -static u32 load_i2c_mcr_reg(struct nmk_i2c_dev *dev, u16 flags) +static u32 load_i2c_mcr_reg(struct nmk_i2c_dev *priv, u16 flags) { u32 mcr = 0; unsigned short slave_adr_3msb_bits; - mcr |= GEN_MASK(dev->cli.slave_adr, I2C_MCR_A7, 1); + mcr |= GEN_MASK(priv->cli.slave_adr, I2C_MCR_A7, 1); if (unlikely(flags & I2C_M_TEN)) { /* 10-bit address transaction */ @@ -313,7 +313,7 @@ static u32 load_i2c_mcr_reg(struct nmk_i2c_dev *dev, u16 flags) * the extension (MSB bits) of the 7 bit address loaded * in A7 */ - slave_adr_3msb_bits = (dev->cli.slave_adr >> 7) & 0x7; + slave_adr_3msb_bits = (priv->cli.slave_adr >> 7) & 0x7; mcr |= GEN_MASK(slave_adr_3msb_bits, I2C_MCR_EA10, 8); } else { @@ -325,40 +325,40 @@ static u32 load_i2c_mcr_reg(struct nmk_i2c_dev *dev, u16 flags) mcr |= GEN_MASK(0, I2C_MCR_SB, 11); /* check the operation, master read/write? */ - if (dev->cli.operation == I2C_WRITE) + if (priv->cli.operation == I2C_WRITE) mcr |= GEN_MASK(I2C_WRITE, I2C_MCR_OP, 0); else mcr |= GEN_MASK(I2C_READ, I2C_MCR_OP, 0); /* stop or repeated start? */ - if (dev->stop) + if (priv->stop) mcr |= GEN_MASK(1, I2C_MCR_STOP, 14); else mcr &= ~(GEN_MASK(1, I2C_MCR_STOP, 14)); - mcr |= GEN_MASK(dev->cli.count, I2C_MCR_LENGTH, 15); + mcr |= GEN_MASK(priv->cli.count, I2C_MCR_LENGTH, 15); return mcr; } /** * setup_i2c_controller() - setup the controller - * @dev: private data of controller + * @priv: private data of controller */ -static void setup_i2c_controller(struct nmk_i2c_dev *dev) +static void setup_i2c_controller(struct nmk_i2c_dev *priv) { u32 brcr1, brcr2; u32 i2c_clk, div; u32 ns; u16 slsu; - writel(0x0, dev->virtbase + I2C_CR); - writel(0x0, dev->virtbase + I2C_HSMCR); - writel(0x0, dev->virtbase + I2C_TFTR); - writel(0x0, dev->virtbase + I2C_RFTR); - writel(0x0, dev->virtbase + I2C_DMAR); + writel(0x0, priv->virtbase + I2C_CR); + writel(0x0, priv->virtbase + I2C_HSMCR); + writel(0x0, priv->virtbase + I2C_TFTR); + writel(0x0, priv->virtbase + I2C_RFTR); + writel(0x0, priv->virtbase + I2C_DMAR); - i2c_clk = clk_get_rate(dev->clk); + i2c_clk = clk_get_rate(priv->clk); /* * set the slsu: @@ -373,7 +373,7 @@ static void setup_i2c_controller(struct nmk_i2c_dev *dev) * slsu = cycles / (1000000000 / f) + 1 */ ns = DIV_ROUND_UP_ULL(1000000000ULL, i2c_clk); - switch (dev->sm) { + switch (priv->sm) { case I2C_FREQ_MODE_FAST: case I2C_FREQ_MODE_FAST_PLUS: slsu = DIV_ROUND_UP(100, ns); /* Fast */ @@ -388,15 +388,15 @@ static void setup_i2c_controller(struct nmk_i2c_dev *dev) } slsu += 1; - dev_dbg(&dev->adev->dev, "calculated SLSU = %04x\n", slsu); - writel(slsu << 16, dev->virtbase + I2C_SCR); + dev_dbg(&priv->adev->dev, "calculated SLSU = %04x\n", slsu); + writel(slsu << 16, priv->virtbase + I2C_SCR); /* * The spec says, in case of std. mode the divider is * 2 whereas it is 3 for fast and fastplus mode of * operation. TODO - high speed support. */ - div = (dev->clk_freq > I2C_MAX_STANDARD_MODE_FREQ) ? 3 : 2; + div = (priv->clk_freq > I2C_MAX_STANDARD_MODE_FREQ) ? 3 : 2; /* * generate the mask for baud rate counters. The controller @@ -406,10 +406,10 @@ static void setup_i2c_controller(struct nmk_i2c_dev *dev) * so set brcr1 to 0. */ brcr1 = 0 << 16; - brcr2 = (i2c_clk/(dev->clk_freq * div)) & 0xffff; + brcr2 = (i2c_clk / (priv->clk_freq * div)) & 0xffff; /* set the baud rate counter register */ - writel((brcr1 | brcr2), dev->virtbase + I2C_BRCR); + writel((brcr1 | brcr2), priv->virtbase + I2C_BRCR); /* * set the speed mode. Currently we support @@ -417,125 +417,124 @@ static void setup_i2c_controller(struct nmk_i2c_dev *dev) * TODO - support for fast mode plus (up to 1Mb/s) * and high speed (up to 3.4 Mb/s) */ - if (dev->sm > I2C_FREQ_MODE_FAST) { - dev_err(&dev->adev->dev, + if (priv->sm > I2C_FREQ_MODE_FAST) { + dev_err(&priv->adev->dev, "do not support this mode defaulting to std. mode\n"); brcr2 = i2c_clk / (I2C_MAX_STANDARD_MODE_FREQ * 2) & 0xffff; - writel((brcr1 | brcr2), dev->virtbase + I2C_BRCR); + writel((brcr1 | brcr2), priv->virtbase + I2C_BRCR); writel(I2C_FREQ_MODE_STANDARD << 4, - dev->virtbase + I2C_CR); + priv->virtbase + I2C_CR); } - writel(dev->sm << 4, dev->virtbase + I2C_CR); + writel(priv->sm << 4, priv->virtbase + I2C_CR); /* set the Tx and Rx FIFO threshold */ - writel(dev->tft, dev->virtbase + I2C_TFTR); - writel(dev->rft, dev->virtbase + I2C_RFTR); + writel(priv->tft, priv->virtbase + I2C_TFTR); + writel(priv->rft, priv->virtbase + I2C_RFTR); } /** * read_i2c() - Read from I2C client device - * @dev: private data of I2C Driver + * @priv: private data of I2C Driver * @flags: message flags * * This function reads from i2c client device when controller is in * master mode. There is a completion timeout. If there is no transfer * before timeout error is returned. */ -static int read_i2c(struct nmk_i2c_dev *dev, u16 flags) +static int read_i2c(struct nmk_i2c_dev *priv, u16 flags) { int status = 0; u32 mcr, irq_mask; unsigned long timeout; - mcr = load_i2c_mcr_reg(dev, flags); - writel(mcr, dev->virtbase + I2C_MCR); + mcr = load_i2c_mcr_reg(priv, flags); + writel(mcr, priv->virtbase + I2C_MCR); /* load the current CR value */ - writel(readl(dev->virtbase + I2C_CR) | DEFAULT_I2C_REG_CR, - dev->virtbase + I2C_CR); + writel(readl(priv->virtbase + I2C_CR) | DEFAULT_I2C_REG_CR, + priv->virtbase + I2C_CR); /* enable the controller */ - i2c_set_bit(dev->virtbase + I2C_CR, I2C_CR_PE); + i2c_set_bit(priv->virtbase + I2C_CR, I2C_CR_PE); - init_completion(&dev->xfer_complete); + init_completion(&priv->xfer_complete); /* enable interrupts by setting the mask */ irq_mask = (I2C_IT_RXFNF | I2C_IT_RXFF | I2C_IT_MAL | I2C_IT_BERR); - if (dev->stop || !dev->vendor->has_mtdws) + if (priv->stop || !priv->vendor->has_mtdws) irq_mask |= I2C_IT_MTD; else irq_mask |= I2C_IT_MTDWS; irq_mask = I2C_CLEAR_ALL_INTS & IRQ_MASK(irq_mask); - writel(readl(dev->virtbase + I2C_IMSCR) | irq_mask, - dev->virtbase + I2C_IMSCR); + writel(readl(priv->virtbase + I2C_IMSCR) | irq_mask, + priv->virtbase + I2C_IMSCR); timeout = wait_for_completion_timeout( - &dev->xfer_complete, dev->adap.timeout); + &priv->xfer_complete, priv->adap.timeout); if (timeout == 0) { /* Controller timed out */ - dev_err(&dev->adev->dev, "read from slave 0x%x timed out\n", - dev->cli.slave_adr); + dev_err(&priv->adev->dev, "read from slave 0x%x timed out\n", + priv->cli.slave_adr); status = -ETIMEDOUT; } return status; } -static void fill_tx_fifo(struct nmk_i2c_dev *dev, int no_bytes) +static void fill_tx_fifo(struct nmk_i2c_dev *priv, int no_bytes) { int count; for (count = (no_bytes - 2); (count > 0) && - (dev->cli.count != 0); + (priv->cli.count != 0); count--) { /* write to the Tx FIFO */ - writeb(*dev->cli.buffer, - dev->virtbase + I2C_TFR); - dev->cli.buffer++; - dev->cli.count--; - dev->cli.xfer_bytes++; + writeb(*priv->cli.buffer, priv->virtbase + I2C_TFR); + priv->cli.buffer++; + priv->cli.count--; + priv->cli.xfer_bytes++; } } /** * write_i2c() - Write data to I2C client. - * @dev: private data of I2C Driver + * @priv: private data of I2C Driver * @flags: message flags * * This function writes data to I2C client */ -static int write_i2c(struct nmk_i2c_dev *dev, u16 flags) +static int write_i2c(struct nmk_i2c_dev *priv, u16 flags) { u32 status = 0; u32 mcr, irq_mask; unsigned long timeout; - mcr = load_i2c_mcr_reg(dev, flags); + mcr = load_i2c_mcr_reg(priv, flags); - writel(mcr, dev->virtbase + I2C_MCR); + writel(mcr, priv->virtbase + I2C_MCR); /* load the current CR value */ - writel(readl(dev->virtbase + I2C_CR) | DEFAULT_I2C_REG_CR, - dev->virtbase + I2C_CR); + writel(readl(priv->virtbase + I2C_CR) | DEFAULT_I2C_REG_CR, + priv->virtbase + I2C_CR); /* enable the controller */ - i2c_set_bit(dev->virtbase + I2C_CR, I2C_CR_PE); + i2c_set_bit(priv->virtbase + I2C_CR, I2C_CR_PE); - init_completion(&dev->xfer_complete); + init_completion(&priv->xfer_complete); /* enable interrupts by settings the masks */ irq_mask = (I2C_IT_TXFOVR | I2C_IT_MAL | I2C_IT_BERR); /* Fill the TX FIFO with transmit data */ - fill_tx_fifo(dev, MAX_I2C_FIFO_THRESHOLD); + fill_tx_fifo(priv, MAX_I2C_FIFO_THRESHOLD); - if (dev->cli.count != 0) + if (priv->cli.count != 0) irq_mask |= I2C_IT_TXFNE; /* @@ -543,23 +542,23 @@ static int write_i2c(struct nmk_i2c_dev *dev, u16 flags) * set the MTDWS bit (Master Transaction Done Without Stop) * to start repeated start operation */ - if (dev->stop || !dev->vendor->has_mtdws) + if (priv->stop || !priv->vendor->has_mtdws) irq_mask |= I2C_IT_MTD; else irq_mask |= I2C_IT_MTDWS; irq_mask = I2C_CLEAR_ALL_INTS & IRQ_MASK(irq_mask); - writel(readl(dev->virtbase + I2C_IMSCR) | irq_mask, - dev->virtbase + I2C_IMSCR); + writel(readl(priv->virtbase + I2C_IMSCR) | irq_mask, + priv->virtbase + I2C_IMSCR); timeout = wait_for_completion_timeout( - &dev->xfer_complete, dev->adap.timeout); + &priv->xfer_complete, priv->adap.timeout); if (timeout == 0) { /* Controller timed out */ - dev_err(&dev->adev->dev, "write to slave 0x%x timed out\n", - dev->cli.slave_adr); + dev_err(&priv->adev->dev, "write to slave 0x%x timed out\n", + priv->cli.slave_adr); status = -ETIMEDOUT; } @@ -568,28 +567,28 @@ static int write_i2c(struct nmk_i2c_dev *dev, u16 flags) /** * nmk_i2c_xfer_one() - transmit a single I2C message - * @dev: device with a message encoded into it + * @priv: device with a message encoded into it * @flags: message flags */ -static int nmk_i2c_xfer_one(struct nmk_i2c_dev *dev, u16 flags) +static int nmk_i2c_xfer_one(struct nmk_i2c_dev *priv, u16 flags) { int status; if (flags & I2C_M_RD) { /* read operation */ - dev->cli.operation = I2C_READ; - status = read_i2c(dev, flags); + priv->cli.operation = I2C_READ; + status = read_i2c(priv, flags); } else { /* write operation */ - dev->cli.operation = I2C_WRITE; - status = write_i2c(dev, flags); + priv->cli.operation = I2C_WRITE; + status = write_i2c(priv, flags); } - if (status || (dev->result)) { + if (status || priv->result) { u32 i2c_sr; u32 cause; - i2c_sr = readl(dev->virtbase + I2C_SR); + i2c_sr = readl(priv->virtbase + I2C_SR); /* * Check if the controller I2C operation status * is set to ABORT(11b). @@ -597,15 +596,15 @@ static int nmk_i2c_xfer_one(struct nmk_i2c_dev *dev, u16 flags) if (((i2c_sr >> 2) & 0x3) == 0x3) { /* get the abort cause */ cause = (i2c_sr >> 4) & 0x7; - dev_err(&dev->adev->dev, "%s\n", + dev_err(&priv->adev->dev, "%s\n", cause >= ARRAY_SIZE(abort_causes) ? "unknown reason" : abort_causes[cause]); } - (void) init_hw(dev); + init_hw(priv); - status = status ? status : dev->result; + status = status ? status : priv->result; } return status; @@ -663,24 +662,24 @@ static int nmk_i2c_xfer(struct i2c_adapter *i2c_adap, { int status = 0; int i; - struct nmk_i2c_dev *dev = i2c_get_adapdata(i2c_adap); + struct nmk_i2c_dev *priv = i2c_get_adapdata(i2c_adap); int j; - pm_runtime_get_sync(&dev->adev->dev); + pm_runtime_get_sync(&priv->adev->dev); /* Attempt three times to send the message queue */ for (j = 0; j < 3; j++) { /* setup the i2c controller */ - setup_i2c_controller(dev); + setup_i2c_controller(priv); for (i = 0; i < num_msgs; i++) { - dev->cli.slave_adr = msgs[i].addr; - dev->cli.buffer = msgs[i].buf; - dev->cli.count = msgs[i].len; - dev->stop = (i < (num_msgs - 1)) ? 0 : 1; - dev->result = 0; + priv->cli.slave_adr = msgs[i].addr; + priv->cli.buffer = msgs[i].buf; + priv->cli.count = msgs[i].len; + priv->stop = (i < (num_msgs - 1)) ? 0 : 1; + priv->result = 0; - status = nmk_i2c_xfer_one(dev, msgs[i].flags); + status = nmk_i2c_xfer_one(priv, msgs[i].flags); if (status != 0) break; } @@ -688,7 +687,7 @@ static int nmk_i2c_xfer(struct i2c_adapter *i2c_adap, break; } - pm_runtime_put_sync(&dev->adev->dev); + pm_runtime_put_sync(&priv->adev->dev); /* return the no. messages processed */ if (status) @@ -699,14 +698,14 @@ static int nmk_i2c_xfer(struct i2c_adapter *i2c_adap, /** * disable_interrupts() - disable the interrupts - * @dev: private data of controller + * @priv: private data of controller * @irq: interrupt number */ -static int disable_interrupts(struct nmk_i2c_dev *dev, u32 irq) +static int disable_interrupts(struct nmk_i2c_dev *priv, u32 irq) { irq = IRQ_MASK(irq); - writel(readl(dev->virtbase + I2C_IMSCR) & ~(I2C_CLEAR_ALL_INTS & irq), - dev->virtbase + I2C_IMSCR); + writel(readl(priv->virtbase + I2C_IMSCR) & ~(I2C_CLEAR_ALL_INTS & irq), + priv->virtbase + I2C_IMSCR); return 0; } @@ -723,17 +722,18 @@ static int disable_interrupts(struct nmk_i2c_dev *dev, u32 irq) */ static irqreturn_t i2c_irq_handler(int irq, void *arg) { - struct nmk_i2c_dev *dev = arg; + struct nmk_i2c_dev *priv = arg; + struct device *dev = &priv->adev->dev; u32 tft, rft; u32 count; u32 misr, src; /* load Tx FIFO and Rx FIFO threshold values */ - tft = readl(dev->virtbase + I2C_TFTR); - rft = readl(dev->virtbase + I2C_RFTR); + tft = readl(priv->virtbase + I2C_TFTR); + rft = readl(priv->virtbase + I2C_RFTR); /* read interrupt status register */ - misr = readl(dev->virtbase + I2C_MISR); + misr = readl(priv->virtbase + I2C_MISR); src = __ffs(misr); switch ((1 << src)) { @@ -741,20 +741,20 @@ static irqreturn_t i2c_irq_handler(int irq, void *arg) /* Transmit FIFO nearly empty interrupt */ case I2C_IT_TXFNE: { - if (dev->cli.operation == I2C_READ) { + if (priv->cli.operation == I2C_READ) { /* * in read operation why do we care for writing? * so disable the Transmit FIFO interrupt */ - disable_interrupts(dev, I2C_IT_TXFNE); + disable_interrupts(priv, I2C_IT_TXFNE); } else { - fill_tx_fifo(dev, (MAX_I2C_FIFO_THRESHOLD - tft)); + fill_tx_fifo(priv, (MAX_I2C_FIFO_THRESHOLD - tft)); /* * if done, close the transfer by disabling the * corresponding TXFNE interrupt */ - if (dev->cli.count == 0) - disable_interrupts(dev, I2C_IT_TXFNE); + if (priv->cli.count == 0) + disable_interrupts(priv, I2C_IT_TXFNE); } } break; @@ -768,60 +768,59 @@ static irqreturn_t i2c_irq_handler(int irq, void *arg) case I2C_IT_RXFNF: for (count = rft; count > 0; count--) { /* Read the Rx FIFO */ - *dev->cli.buffer = readb(dev->virtbase + I2C_RFR); - dev->cli.buffer++; + *priv->cli.buffer = readb(priv->virtbase + I2C_RFR); + priv->cli.buffer++; } - dev->cli.count -= rft; - dev->cli.xfer_bytes += rft; + priv->cli.count -= rft; + priv->cli.xfer_bytes += rft; break; /* Rx FIFO full */ case I2C_IT_RXFF: for (count = MAX_I2C_FIFO_THRESHOLD; count > 0; count--) { - *dev->cli.buffer = readb(dev->virtbase + I2C_RFR); - dev->cli.buffer++; + *priv->cli.buffer = readb(priv->virtbase + I2C_RFR); + priv->cli.buffer++; } - dev->cli.count -= MAX_I2C_FIFO_THRESHOLD; - dev->cli.xfer_bytes += MAX_I2C_FIFO_THRESHOLD; + priv->cli.count -= MAX_I2C_FIFO_THRESHOLD; + priv->cli.xfer_bytes += MAX_I2C_FIFO_THRESHOLD; break; /* Master Transaction Done with/without stop */ case I2C_IT_MTD: case I2C_IT_MTDWS: - if (dev->cli.operation == I2C_READ) { - while (!(readl(dev->virtbase + I2C_RISR) + if (priv->cli.operation == I2C_READ) { + while (!(readl(priv->virtbase + I2C_RISR) & I2C_IT_RXFE)) { - if (dev->cli.count == 0) + if (priv->cli.count == 0) break; - *dev->cli.buffer = - readb(dev->virtbase + I2C_RFR); - dev->cli.buffer++; - dev->cli.count--; - dev->cli.xfer_bytes++; + *priv->cli.buffer = + readb(priv->virtbase + I2C_RFR); + priv->cli.buffer++; + priv->cli.count--; + priv->cli.xfer_bytes++; } } - disable_all_interrupts(dev); - clear_all_interrupts(dev); + disable_all_interrupts(priv); + clear_all_interrupts(priv); - if (dev->cli.count) { - dev->result = -EIO; - dev_err(&dev->adev->dev, - "%lu bytes still remain to be xfered\n", - dev->cli.count); - (void) init_hw(dev); + if (priv->cli.count) { + priv->result = -EIO; + dev_err(dev, "%lu bytes still remain to be xfered\n", + priv->cli.count); + init_hw(priv); } - complete(&dev->xfer_complete); + complete(&priv->xfer_complete); break; /* Master Arbitration lost interrupt */ case I2C_IT_MAL: - dev->result = -EIO; - (void) init_hw(dev); + priv->result = -EIO; + init_hw(priv); - i2c_set_bit(dev->virtbase + I2C_ICR, I2C_IT_MAL); - complete(&dev->xfer_complete); + i2c_set_bit(priv->virtbase + I2C_ICR, I2C_IT_MAL); + complete(&priv->xfer_complete); break; @@ -831,13 +830,13 @@ static irqreturn_t i2c_irq_handler(int irq, void *arg) * during the transaction. */ case I2C_IT_BERR: - dev->result = -EIO; + priv->result = -EIO; /* get the status */ - if (((readl(dev->virtbase + I2C_SR) >> 2) & 0x3) == I2C_ABORT) - (void) init_hw(dev); + if (((readl(priv->virtbase + I2C_SR) >> 2) & 0x3) == I2C_ABORT) + init_hw(priv); - i2c_set_bit(dev->virtbase + I2C_ICR, I2C_IT_BERR); - complete(&dev->xfer_complete); + i2c_set_bit(priv->virtbase + I2C_ICR, I2C_IT_BERR); + complete(&priv->xfer_complete); break; @@ -847,11 +846,11 @@ static irqreturn_t i2c_irq_handler(int irq, void *arg) * the Tx FIFO is full. */ case I2C_IT_TXFOVR: - dev->result = -EIO; - (void) init_hw(dev); + priv->result = -EIO; + init_hw(priv); - dev_err(&dev->adev->dev, "Tx Fifo Over run\n"); - complete(&dev->xfer_complete); + dev_err(dev, "Tx Fifo Over run\n"); + complete(&priv->xfer_complete); break; @@ -863,10 +862,10 @@ static irqreturn_t i2c_irq_handler(int irq, void *arg) case I2C_IT_RFSE: case I2C_IT_WTSR: case I2C_IT_STD: - dev_err(&dev->adev->dev, "unhandled Interrupt\n"); + dev_err(dev, "unhandled Interrupt\n"); break; default: - dev_err(&dev->adev->dev, "spurious Interrupt..\n"); + dev_err(dev, "spurious Interrupt..\n"); break; } @@ -893,9 +892,9 @@ static int nmk_i2c_resume_early(struct device *dev) static int nmk_i2c_runtime_suspend(struct device *dev) { struct amba_device *adev = to_amba_device(dev); - struct nmk_i2c_dev *nmk_i2c = amba_get_drvdata(adev); + struct nmk_i2c_dev *priv = amba_get_drvdata(adev); - clk_disable_unprepare(nmk_i2c->clk); + clk_disable_unprepare(priv->clk); pinctrl_pm_select_idle_state(dev); return 0; } @@ -903,10 +902,10 @@ static int nmk_i2c_runtime_suspend(struct device *dev) static int nmk_i2c_runtime_resume(struct device *dev) { struct amba_device *adev = to_amba_device(dev); - struct nmk_i2c_dev *nmk_i2c = amba_get_drvdata(adev); + struct nmk_i2c_dev *priv = amba_get_drvdata(adev); int ret; - ret = clk_prepare_enable(nmk_i2c->clk); + ret = clk_prepare_enable(priv->clk); if (ret) { dev_err(dev, "can't prepare_enable clock\n"); return ret; @@ -914,9 +913,9 @@ static int nmk_i2c_runtime_resume(struct device *dev) pinctrl_pm_select_default_state(dev); - ret = init_hw(nmk_i2c); + ret = init_hw(priv); if (ret) { - clk_disable_unprepare(nmk_i2c->clk); + clk_disable_unprepare(priv->clk); pinctrl_pm_select_idle_state(dev); } @@ -939,107 +938,108 @@ static const struct i2c_algorithm nmk_i2c_algo = { }; static void nmk_i2c_of_probe(struct device_node *np, - struct nmk_i2c_dev *nmk) + struct nmk_i2c_dev *priv) { /* Default to 100 kHz if no frequency is given in the node */ - if (of_property_read_u32(np, "clock-frequency", &nmk->clk_freq)) - nmk->clk_freq = I2C_MAX_STANDARD_MODE_FREQ; + if (of_property_read_u32(np, "clock-frequency", &priv->clk_freq)) + priv->clk_freq = I2C_MAX_STANDARD_MODE_FREQ; /* This driver only supports 'standard' and 'fast' modes of operation. */ - if (nmk->clk_freq <= I2C_MAX_STANDARD_MODE_FREQ) - nmk->sm = I2C_FREQ_MODE_STANDARD; + if (priv->clk_freq <= I2C_MAX_STANDARD_MODE_FREQ) + priv->sm = I2C_FREQ_MODE_STANDARD; else - nmk->sm = I2C_FREQ_MODE_FAST; - nmk->tft = 1; /* Tx FIFO threshold */ - nmk->rft = 8; /* Rx FIFO threshold */ - nmk->timeout = 200; /* Slave response timeout(ms) */ + priv->sm = I2C_FREQ_MODE_FAST; + priv->tft = 1; /* Tx FIFO threshold */ + priv->rft = 8; /* Rx FIFO threshold */ + priv->timeout = 200; /* Slave response timeout(ms) */ } static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id) { int ret = 0; + struct nmk_i2c_dev *priv; struct device_node *np = adev->dev.of_node; - struct nmk_i2c_dev *dev; + struct device *dev = &adev->dev; struct i2c_adapter *adap; struct i2c_vendor_data *vendor = id->data; u32 max_fifo_threshold = (vendor->fifodepth / 2) - 1; - dev = devm_kzalloc(&adev->dev, sizeof(*dev), GFP_KERNEL); - if (!dev) + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) return -ENOMEM; - dev->vendor = vendor; - dev->adev = adev; - nmk_i2c_of_probe(np, dev); + priv->vendor = vendor; + priv->adev = adev; + nmk_i2c_of_probe(np, priv); - if (dev->tft > max_fifo_threshold) { - dev_warn(&adev->dev, "requested TX FIFO threshold %u, adjusted down to %u\n", - dev->tft, max_fifo_threshold); - dev->tft = max_fifo_threshold; + if (priv->tft > max_fifo_threshold) { + dev_warn(dev, "requested TX FIFO threshold %u, adjusted down to %u\n", + priv->tft, max_fifo_threshold); + priv->tft = max_fifo_threshold; } - if (dev->rft > max_fifo_threshold) { - dev_warn(&adev->dev, "requested RX FIFO threshold %u, adjusted down to %u\n", - dev->rft, max_fifo_threshold); - dev->rft = max_fifo_threshold; + if (priv->rft > max_fifo_threshold) { + dev_warn(dev, "requested RX FIFO threshold %u, adjusted down to %u\n", + priv->rft, max_fifo_threshold); + priv->rft = max_fifo_threshold; } - amba_set_drvdata(adev, dev); + amba_set_drvdata(adev, priv); - dev->virtbase = devm_ioremap(&adev->dev, adev->res.start, - resource_size(&adev->res)); - if (!dev->virtbase) + priv->virtbase = devm_ioremap(dev, adev->res.start, + resource_size(&adev->res)); + if (!priv->virtbase) return -ENOMEM; - dev->irq = adev->irq[0]; - ret = devm_request_irq(&adev->dev, dev->irq, i2c_irq_handler, 0, - DRIVER_NAME, dev); + priv->irq = adev->irq[0]; + ret = devm_request_irq(dev, priv->irq, i2c_irq_handler, 0, + DRIVER_NAME, priv); if (ret) - return dev_err_probe(&adev->dev, ret, - "cannot claim the irq %d\n", dev->irq); + return dev_err_probe(dev, ret, + "cannot claim the irq %d\n", priv->irq); - dev->clk = devm_clk_get_enabled(&adev->dev, NULL); - if (IS_ERR(dev->clk)) - return dev_err_probe(&adev->dev, PTR_ERR(dev->clk), + priv->clk = devm_clk_get_enabled(dev, NULL); + if (IS_ERR(priv->clk)) + return dev_err_probe(dev, PTR_ERR(priv->clk), "could enable i2c clock\n"); - init_hw(dev); + init_hw(priv); - adap = &dev->adap; + adap = &priv->adap; adap->dev.of_node = np; - adap->dev.parent = &adev->dev; + adap->dev.parent = dev; adap->owner = THIS_MODULE; adap->class = I2C_CLASS_DEPRECATED; adap->algo = &nmk_i2c_algo; - adap->timeout = msecs_to_jiffies(dev->timeout); + adap->timeout = msecs_to_jiffies(priv->timeout); snprintf(adap->name, sizeof(adap->name), "Nomadik I2C at %pR", &adev->res); - i2c_set_adapdata(adap, dev); + i2c_set_adapdata(adap, priv); - dev_info(&adev->dev, + dev_info(dev, "initialize %s on virtual base %p\n", - adap->name, dev->virtbase); + adap->name, priv->virtbase); ret = i2c_add_adapter(adap); if (ret) return ret; - pm_runtime_put(&adev->dev); + pm_runtime_put(dev); return 0; } static void nmk_i2c_remove(struct amba_device *adev) { - struct nmk_i2c_dev *dev = amba_get_drvdata(adev); + struct nmk_i2c_dev *priv = amba_get_drvdata(adev); - i2c_del_adapter(&dev->adap); - flush_i2c_fifo(dev); - disable_all_interrupts(dev); - clear_all_interrupts(dev); + i2c_del_adapter(&priv->adap); + flush_i2c_fifo(priv); + disable_all_interrupts(priv); + clear_all_interrupts(priv); /* disable the controller */ - i2c_clr_bit(dev->virtbase + I2C_CR, I2C_CR_PE); + i2c_clr_bit(priv->virtbase + I2C_CR, I2C_CR_PE); } static struct i2c_vendor_data vendor_stn8815 = { -- 2.44.0 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [SPAM] [PATCH v2 03/11] i2c: nomadik: rename private struct pointers from dev to priv 2024-02-29 18:10 ` [PATCH v2 03/11] i2c: nomadik: rename private struct pointers from dev to priv Théo Lebrun @ 2024-03-02 0:16 ` Andi Shyti 2024-03-04 9:13 ` Wolfram Sang 1 sibling, 0 replies; 54+ messages in thread From: Andi Shyti @ 2024-03-02 0:16 UTC (permalink / raw) To: Théo Lebrun Cc: Linus Walleij, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Andi Shyti Hi Theo, On Thu, Feb 29, 2024 at 07:10:51PM +0100, Théo Lebrun wrote: > Disambiguate the usage of dev as a variable name; it is usually best to > keep it reserved for struct device pointers. Avoid having multiple > names for the same struct pointer (previously: dev, nmk, nmk_i2c). just a nitpick here: this patch does also some small style fixes. Could you please mention them in the commit log in your v3? > Reviewed-by: Linus Walleij <linus.walleij@linaro.org> > Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> In any case, Reviewed-by: Andi Shyti <andi.shyti@kernel.org> Thanks, Andi ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 03/11] i2c: nomadik: rename private struct pointers from dev to priv 2024-02-29 18:10 ` [PATCH v2 03/11] i2c: nomadik: rename private struct pointers from dev to priv Théo Lebrun 2024-03-02 0:16 ` [SPAM] " Andi Shyti @ 2024-03-04 9:13 ` Wolfram Sang 1 sibling, 0 replies; 54+ messages in thread From: Wolfram Sang @ 2024-03-04 9:13 UTC (permalink / raw) To: Théo Lebrun Cc: Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk [-- Attachment #1: Type: text/plain, Size: 556 bytes --] On Thu, Feb 29, 2024 at 07:10:51PM +0100, Théo Lebrun wrote: > Disambiguate the usage of dev as a variable name; it is usually best to > keep it reserved for struct device pointers. Avoid having multiple > names for the same struct pointer (previously: dev, nmk, nmk_i2c). > > Reviewed-by: Linus Walleij <linus.walleij@linaro.org> > Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> I think this improves readability a lot. I didn't really review, but I do like such changes: Acked-by: Wolfram Sang <wsa+renesas@sang-engineering.com> [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 54+ messages in thread
* [PATCH v2 04/11] i2c: nomadik: simplify IRQ masking logic 2024-02-29 18:10 [PATCH v2 00/11] Add Mobileye EyeQ5 support to the Nomadik I2C controller & use hrtimers for timeouts Théo Lebrun ` (2 preceding siblings ...) 2024-02-29 18:10 ` [PATCH v2 03/11] i2c: nomadik: rename private struct pointers from dev to priv Théo Lebrun @ 2024-02-29 18:10 ` Théo Lebrun 2024-03-02 0:39 ` [SPAM] " Andi Shyti 2024-02-29 18:10 ` [PATCH v2 05/11] i2c: nomadik: use bitops helpers Théo Lebrun ` (7 subsequent siblings) 11 siblings, 1 reply; 54+ messages in thread From: Théo Lebrun @ 2024-02-29 18:10 UTC (permalink / raw) To: Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer Cc: linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Théo Lebrun IRQ_MASK and I2C_CLEAR_ALL_INTS are redundant. One masks the top three bits off as reserved, the other one masks the reserved IRQs inside the u32. Get rid of IRQ_MASK and only use the most restrictive mask. Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> --- drivers/i2c/busses/i2c-nomadik.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/drivers/i2c/busses/i2c-nomadik.c b/drivers/i2c/busses/i2c-nomadik.c index cd511c884f99..80bdf7e42613 100644 --- a/drivers/i2c/busses/i2c-nomadik.c +++ b/drivers/i2c/busses/i2c-nomadik.c @@ -94,9 +94,6 @@ /* some bits in ICR are reserved */ #define I2C_CLEAR_ALL_INTS 0x131f007f -/* first three msb bits are reserved */ -#define IRQ_MASK(mask) (mask & 0x1fffffff) - /* maximum threshold value */ #define MAX_I2C_FIFO_THRESHOLD 15 @@ -249,8 +246,7 @@ static int flush_i2c_fifo(struct nmk_i2c_dev *priv) */ static void disable_all_interrupts(struct nmk_i2c_dev *priv) { - u32 mask = IRQ_MASK(0); - writel(mask, priv->virtbase + I2C_IMSCR); + writel(0, priv->virtbase + I2C_IMSCR); } /** @@ -259,9 +255,7 @@ static void disable_all_interrupts(struct nmk_i2c_dev *priv) */ static void clear_all_interrupts(struct nmk_i2c_dev *priv) { - u32 mask; - mask = IRQ_MASK(I2C_CLEAR_ALL_INTS); - writel(mask, priv->virtbase + I2C_ICR); + writel(I2C_CLEAR_ALL_INTS, priv->virtbase + I2C_ICR); } /** @@ -468,7 +462,7 @@ static int read_i2c(struct nmk_i2c_dev *priv, u16 flags) else irq_mask |= I2C_IT_MTDWS; - irq_mask = I2C_CLEAR_ALL_INTS & IRQ_MASK(irq_mask); + irq_mask &= I2C_CLEAR_ALL_INTS; writel(readl(priv->virtbase + I2C_IMSCR) | irq_mask, priv->virtbase + I2C_IMSCR); @@ -547,7 +541,7 @@ static int write_i2c(struct nmk_i2c_dev *priv, u16 flags) else irq_mask |= I2C_IT_MTDWS; - irq_mask = I2C_CLEAR_ALL_INTS & IRQ_MASK(irq_mask); + irq_mask &= I2C_CLEAR_ALL_INTS; writel(readl(priv->virtbase + I2C_IMSCR) | irq_mask, priv->virtbase + I2C_IMSCR); @@ -703,8 +697,8 @@ static int nmk_i2c_xfer(struct i2c_adapter *i2c_adap, */ static int disable_interrupts(struct nmk_i2c_dev *priv, u32 irq) { - irq = IRQ_MASK(irq); - writel(readl(priv->virtbase + I2C_IMSCR) & ~(I2C_CLEAR_ALL_INTS & irq), + irq &= I2C_CLEAR_ALL_INTS; + writel(readl(priv->virtbase + I2C_IMSCR) & ~irq, priv->virtbase + I2C_IMSCR); return 0; } -- 2.44.0 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [SPAM] [PATCH v2 04/11] i2c: nomadik: simplify IRQ masking logic 2024-02-29 18:10 ` [PATCH v2 04/11] i2c: nomadik: simplify IRQ masking logic Théo Lebrun @ 2024-03-02 0:39 ` Andi Shyti 2024-03-04 9:46 ` Théo Lebrun 0 siblings, 1 reply; 54+ messages in thread From: Andi Shyti @ 2024-03-02 0:39 UTC (permalink / raw) To: Théo Lebrun Cc: Linus Walleij, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Andi Shyti Hi Theo, On Thu, Feb 29, 2024 at 07:10:52PM +0100, Théo Lebrun wrote: > IRQ_MASK and I2C_CLEAR_ALL_INTS are redundant. One masks the top three if I2C_CLEAR_ALL_INTS is redundant why don't you remove it? > bits off as reserved, the other one masks the reserved IRQs inside the > u32. Get rid of IRQ_MASK and only use the most restrictive mask. Why is IRQ_MASK redundant? What happens if you write in the reserved bits? Can you please explain a bit better the change you did? Thanks, Andi > Reviewed-by: Linus Walleij <linus.walleij@linaro.org> > Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [SPAM] [PATCH v2 04/11] i2c: nomadik: simplify IRQ masking logic 2024-03-02 0:39 ` [SPAM] " Andi Shyti @ 2024-03-04 9:46 ` Théo Lebrun 0 siblings, 0 replies; 54+ messages in thread From: Théo Lebrun @ 2024-03-04 9:46 UTC (permalink / raw) To: Andi Shyti Cc: Linus Walleij, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk Hello, On Sat Mar 2, 2024 at 1:39 AM CET, Andi Shyti wrote: > On Thu, Feb 29, 2024 at 07:10:52PM +0100, Théo Lebrun wrote: > > IRQ_MASK and I2C_CLEAR_ALL_INTS are redundant. One masks the top three > > if I2C_CLEAR_ALL_INTS is redundant why don't you remove it? I understand this is unclear. What I meant by redundant is that they are redundant from one another; one overlaps the other. I'll give a better commit description for v3. Something like: IRQ_MASK and I2C_CLEAR_ALL_INTS both mask available interrupts. IRQ_MASK removes top options (bits 29-31). I2C_CLEAR_ALL_INTS removes reserved options including top bits. Keep the latter. 31 29 27 25 23 21 19 17 15 13 11 09 07 05 03 01 30 28 26 24 22 20 18 16 14 12 10 08 06 04 02 00 --- IRQ_MASK: -------------------------------------------------- 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 --- I2C_CLEAR_ALL_INTS: ---------------------------------------- 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Notice I2C_CLEAR_ALL_INTS is more restrictive than IRQ_MASK. Is that better? > > bits off as reserved, the other one masks the reserved IRQs inside the > > u32. Get rid of IRQ_MASK and only use the most restrictive mask. > > Why is IRQ_MASK redundant? What happens if you write in the > reserved bits? The wording wasn't correct. Have I answered your question from the above? Thanks Andi, -- Théo Lebrun, Bootlin Embedded Linux and Kernel engineering https://bootlin.com ^ permalink raw reply [flat|nested] 54+ messages in thread
* [PATCH v2 05/11] i2c: nomadik: use bitops helpers 2024-02-29 18:10 [PATCH v2 00/11] Add Mobileye EyeQ5 support to the Nomadik I2C controller & use hrtimers for timeouts Théo Lebrun ` (3 preceding siblings ...) 2024-02-29 18:10 ` [PATCH v2 04/11] i2c: nomadik: simplify IRQ masking logic Théo Lebrun @ 2024-02-29 18:10 ` Théo Lebrun 2024-03-02 1:31 ` Andi Shyti 2024-02-29 18:10 ` [PATCH v2 06/11] i2c: nomadik: support short xfer timeouts using waitqueue & hrtimer Théo Lebrun ` (6 subsequent siblings) 11 siblings, 1 reply; 54+ messages in thread From: Théo Lebrun @ 2024-02-29 18:10 UTC (permalink / raw) To: Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer Cc: linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Théo Lebrun Constant register bit fields are declared using hardcoded hex values; replace them by calls to BIT() and GENMASK(). Replace custom GEN_MASK() macro by the generic FIELD_PREP(). Replace manual bit manipulations by the generic FIELD_GET() macro. Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> --- drivers/i2c/busses/i2c-nomadik.c | 150 ++++++++++++++++++++------------------- 1 file changed, 77 insertions(+), 73 deletions(-) diff --git a/drivers/i2c/busses/i2c-nomadik.c b/drivers/i2c/busses/i2c-nomadik.c index 80bdf7e42613..aa68ab402b10 100644 --- a/drivers/i2c/busses/i2c-nomadik.c +++ b/drivers/i2c/busses/i2c-nomadik.c @@ -9,6 +9,7 @@ * Author: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com> * Author: Sachin Verma <sachin.verma@st.com> */ +#include <linux/bitfield.h> #include <linux/init.h> #include <linux/module.h> #include <linux/amba/bus.h> @@ -42,54 +43,59 @@ #define I2C_ICR (0x038) /* Control registers */ -#define I2C_CR_PE (0x1 << 0) /* Peripheral Enable */ -#define I2C_CR_OM (0x3 << 1) /* Operating mode */ -#define I2C_CR_SAM (0x1 << 3) /* Slave addressing mode */ -#define I2C_CR_SM (0x3 << 4) /* Speed mode */ -#define I2C_CR_SGCM (0x1 << 6) /* Slave general call mode */ -#define I2C_CR_FTX (0x1 << 7) /* Flush Transmit */ -#define I2C_CR_FRX (0x1 << 8) /* Flush Receive */ -#define I2C_CR_DMA_TX_EN (0x1 << 9) /* DMA Tx enable */ -#define I2C_CR_DMA_RX_EN (0x1 << 10) /* DMA Rx Enable */ -#define I2C_CR_DMA_SLE (0x1 << 11) /* DMA sync. logic enable */ -#define I2C_CR_LM (0x1 << 12) /* Loopback mode */ -#define I2C_CR_FON (0x3 << 13) /* Filtering on */ -#define I2C_CR_FS (0x3 << 15) /* Force stop enable */ +#define I2C_CR_PE BIT(0) /* Peripheral Enable */ +#define I2C_CR_OM GENMASK(2, 1) /* Operating mode */ +#define I2C_CR_SAM BIT(3) /* Slave addressing mode */ +#define I2C_CR_SM GENMASK(5, 4) /* Speed mode */ +#define I2C_CR_SGCM BIT(6) /* Slave general call mode */ +#define I2C_CR_FTX BIT(7) /* Flush Transmit */ +#define I2C_CR_FRX BIT(8) /* Flush Receive */ +#define I2C_CR_DMA_TX_EN BIT(9) /* DMA Tx enable */ +#define I2C_CR_DMA_RX_EN BIT(10) /* DMA Rx Enable */ +#define I2C_CR_DMA_SLE BIT(11) /* DMA sync. logic enable */ +#define I2C_CR_LM BIT(12) /* Loopback mode */ +#define I2C_CR_FON GENMASK(14, 13) /* Filtering on */ +#define I2C_CR_FS GENMASK(16, 15) /* Force stop enable */ + +/* Slave control register (SCR) */ +#define I2C_SCR_SLSU GENMASK(31, 16) /* Slave data setup time */ /* Master controller (MCR) register */ -#define I2C_MCR_OP (0x1 << 0) /* Operation */ -#define I2C_MCR_A7 (0x7f << 1) /* 7-bit address */ -#define I2C_MCR_EA10 (0x7 << 8) /* 10-bit Extended address */ -#define I2C_MCR_SB (0x1 << 11) /* Extended address */ -#define I2C_MCR_AM (0x3 << 12) /* Address type */ -#define I2C_MCR_STOP (0x1 << 14) /* Stop condition */ -#define I2C_MCR_LENGTH (0x7ff << 15) /* Transaction length */ +#define I2C_MCR_OP BIT(0) /* Operation */ +#define I2C_MCR_A7 GENMASK(7, 1) /* 7-bit address */ +#define I2C_MCR_EA10 GENMASK(10, 8) /* 10-bit Extended address */ +#define I2C_MCR_SB BIT(11) /* Extended address */ +#define I2C_MCR_AM GENMASK(13, 12) /* Address type */ +#define I2C_MCR_STOP BIT(14) /* Stop condition */ +#define I2C_MCR_LENGTH GENMASK(25, 15) /* Transaction length */ /* Status register (SR) */ -#define I2C_SR_OP (0x3 << 0) /* Operation */ -#define I2C_SR_STATUS (0x3 << 2) /* controller status */ -#define I2C_SR_CAUSE (0x7 << 4) /* Abort cause */ -#define I2C_SR_TYPE (0x3 << 7) /* Receive type */ -#define I2C_SR_LENGTH (0x7ff << 9) /* Transfer length */ +#define I2C_SR_OP GENMASK(1, 0) /* Operation */ +#define I2C_SR_STATUS GENMASK(3, 2) /* controller status */ +#define I2C_SR_CAUSE GENMASK(6, 4) /* Abort cause */ +#define I2C_SR_TYPE GENMASK(8, 7) /* Receive type */ +#define I2C_SR_LENGTH GENMASK(19, 9) /* Transfer length */ + +/* Baud-rate counter register (BRCR) */ +#define I2C_BRCR_BRCNT1 GENMASK(31, 16) /* Baud-rate counter 1 */ +#define I2C_BRCR_BRCNT2 GENMASK(15, 0) /* Baud-rate counter 2 */ /* Interrupt mask set/clear (IMSCR) bits */ -#define I2C_IT_TXFE (0x1 << 0) -#define I2C_IT_TXFNE (0x1 << 1) -#define I2C_IT_TXFF (0x1 << 2) -#define I2C_IT_TXFOVR (0x1 << 3) -#define I2C_IT_RXFE (0x1 << 4) -#define I2C_IT_RXFNF (0x1 << 5) -#define I2C_IT_RXFF (0x1 << 6) -#define I2C_IT_RFSR (0x1 << 16) -#define I2C_IT_RFSE (0x1 << 17) -#define I2C_IT_WTSR (0x1 << 18) -#define I2C_IT_MTD (0x1 << 19) -#define I2C_IT_STD (0x1 << 20) -#define I2C_IT_MAL (0x1 << 24) -#define I2C_IT_BERR (0x1 << 25) -#define I2C_IT_MTDWS (0x1 << 28) - -#define GEN_MASK(val, mask, sb) (((val) << (sb)) & (mask)) +#define I2C_IT_TXFE BIT(0) +#define I2C_IT_TXFNE BIT(1) +#define I2C_IT_TXFF BIT(2) +#define I2C_IT_TXFOVR BIT(3) +#define I2C_IT_RXFE BIT(4) +#define I2C_IT_RXFNF BIT(5) +#define I2C_IT_RXFF BIT(6) +#define I2C_IT_RFSR BIT(16) +#define I2C_IT_RFSE BIT(17) +#define I2C_IT_WTSR BIT(18) +#define I2C_IT_MTD BIT(19) +#define I2C_IT_STD BIT(20) +#define I2C_IT_MAL BIT(24) +#define I2C_IT_BERR BIT(25) +#define I2C_IT_MTDWS BIT(28) /* some bits in ICR are reserved */ #define I2C_CLEAR_ALL_INTS 0x131f007f @@ -284,7 +290,7 @@ static int init_hw(struct nmk_i2c_dev *priv) } /* enable peripheral, master mode operation */ -#define DEFAULT_I2C_REG_CR ((1 << 1) | I2C_CR_PE) +#define DEFAULT_I2C_REG_CR (FIELD_PREP(I2C_CR_OM, 0b01) | I2C_CR_PE) /** * load_i2c_mcr_reg() - load the MCR register @@ -296,41 +302,42 @@ static u32 load_i2c_mcr_reg(struct nmk_i2c_dev *priv, u16 flags) u32 mcr = 0; unsigned short slave_adr_3msb_bits; - mcr |= GEN_MASK(priv->cli.slave_adr, I2C_MCR_A7, 1); + mcr |= FIELD_PREP(I2C_MCR_A7, priv->cli.slave_adr); if (unlikely(flags & I2C_M_TEN)) { /* 10-bit address transaction */ - mcr |= GEN_MASK(2, I2C_MCR_AM, 12); + mcr |= FIELD_PREP(I2C_MCR_AM, 2); /* * Get the top 3 bits. * EA10 represents extended address in MCR. This includes * the extension (MSB bits) of the 7 bit address loaded * in A7 */ - slave_adr_3msb_bits = (priv->cli.slave_adr >> 7) & 0x7; + slave_adr_3msb_bits = FIELD_GET(GENMASK(9, 7), + priv->cli.slave_adr); - mcr |= GEN_MASK(slave_adr_3msb_bits, I2C_MCR_EA10, 8); + mcr |= FIELD_PREP(I2C_MCR_EA10, slave_adr_3msb_bits); } else { /* 7-bit address transaction */ - mcr |= GEN_MASK(1, I2C_MCR_AM, 12); + mcr |= FIELD_PREP(I2C_MCR_AM, 1); } /* start byte procedure not applied */ - mcr |= GEN_MASK(0, I2C_MCR_SB, 11); + mcr |= FIELD_PREP(I2C_MCR_SB, 0); /* check the operation, master read/write? */ if (priv->cli.operation == I2C_WRITE) - mcr |= GEN_MASK(I2C_WRITE, I2C_MCR_OP, 0); + mcr |= FIELD_PREP(I2C_MCR_OP, I2C_WRITE); else - mcr |= GEN_MASK(I2C_READ, I2C_MCR_OP, 0); + mcr |= FIELD_PREP(I2C_MCR_OP, I2C_READ); /* stop or repeated start? */ if (priv->stop) - mcr |= GEN_MASK(1, I2C_MCR_STOP, 14); + mcr |= FIELD_PREP(I2C_MCR_STOP, 1); else - mcr &= ~(GEN_MASK(1, I2C_MCR_STOP, 14)); + mcr &= ~FIELD_PREP(I2C_MCR_STOP, 1); - mcr |= GEN_MASK(priv->cli.count, I2C_MCR_LENGTH, 15); + mcr |= FIELD_PREP(I2C_MCR_LENGTH, priv->cli.count); return mcr; } @@ -383,7 +390,7 @@ static void setup_i2c_controller(struct nmk_i2c_dev *priv) slsu += 1; dev_dbg(&priv->adev->dev, "calculated SLSU = %04x\n", slsu); - writel(slsu << 16, priv->virtbase + I2C_SCR); + writel(FIELD_PREP(I2C_SCR_SLSU, slsu), priv->virtbase + I2C_SCR); /* * The spec says, in case of std. mode the divider is @@ -399,8 +406,8 @@ static void setup_i2c_controller(struct nmk_i2c_dev *priv) * plus operation. Currently we do not supprt high speed mode * so set brcr1 to 0. */ - brcr1 = 0 << 16; - brcr2 = (i2c_clk / (priv->clk_freq * div)) & 0xffff; + brcr1 = FIELD_PREP(I2C_BRCR_BRCNT1, 0); + brcr2 = FIELD_PREP(I2C_BRCR_BRCNT2, i2c_clk / (priv->clk_freq * div)); /* set the baud rate counter register */ writel((brcr1 | brcr2), priv->virtbase + I2C_BRCR); @@ -414,12 +421,13 @@ static void setup_i2c_controller(struct nmk_i2c_dev *priv) if (priv->sm > I2C_FREQ_MODE_FAST) { dev_err(&priv->adev->dev, "do not support this mode defaulting to std. mode\n"); - brcr2 = i2c_clk / (I2C_MAX_STANDARD_MODE_FREQ * 2) & 0xffff; + brcr2 = FIELD_PREP(I2C_BRCR_BRCNT2, + i2c_clk / (I2C_MAX_STANDARD_MODE_FREQ * 2)); writel((brcr1 | brcr2), priv->virtbase + I2C_BRCR); - writel(I2C_FREQ_MODE_STANDARD << 4, - priv->virtbase + I2C_CR); + writel(FIELD_PREP(I2C_CR_SM, I2C_FREQ_MODE_STANDARD), + priv->virtbase + I2C_CR); } - writel(priv->sm << 4, priv->virtbase + I2C_CR); + writel(FIELD_PREP(I2C_CR_SM, priv->sm), priv->virtbase + I2C_CR); /* set the Tx and Rx FIFO threshold */ writel(priv->tft, priv->virtbase + I2C_TFTR); @@ -583,13 +591,8 @@ static int nmk_i2c_xfer_one(struct nmk_i2c_dev *priv, u16 flags) u32 cause; i2c_sr = readl(priv->virtbase + I2C_SR); - /* - * Check if the controller I2C operation status - * is set to ABORT(11b). - */ - if (((i2c_sr >> 2) & 0x3) == 0x3) { - /* get the abort cause */ - cause = (i2c_sr >> 4) & 0x7; + if (FIELD_GET(I2C_SR_STATUS, i2c_sr) == I2C_ABORT) { + cause = FIELD_GET(I2C_SR_CAUSE, i2c_sr); dev_err(&priv->adev->dev, "%s\n", cause >= ARRAY_SIZE(abort_causes) ? "unknown reason" : @@ -730,7 +733,7 @@ static irqreturn_t i2c_irq_handler(int irq, void *arg) misr = readl(priv->virtbase + I2C_MISR); src = __ffs(misr); - switch ((1 << src)) { + switch (BIT(src)) { /* Transmit FIFO nearly empty interrupt */ case I2C_IT_TXFNE: @@ -824,15 +827,16 @@ static irqreturn_t i2c_irq_handler(int irq, void *arg) * during the transaction. */ case I2C_IT_BERR: + { + u32 sr = readl(priv->virtbase + I2C_SR); priv->result = -EIO; - /* get the status */ - if (((readl(priv->virtbase + I2C_SR) >> 2) & 0x3) == I2C_ABORT) + if (FIELD_GET(I2C_SR_STATUS, sr) == I2C_ABORT) init_hw(priv); i2c_set_bit(priv->virtbase + I2C_ICR, I2C_IT_BERR); complete(&priv->xfer_complete); - - break; + } + break; /* * Tx FIFO overrun interrupt. -- 2.44.0 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [PATCH v2 05/11] i2c: nomadik: use bitops helpers 2024-02-29 18:10 ` [PATCH v2 05/11] i2c: nomadik: use bitops helpers Théo Lebrun @ 2024-03-02 1:31 ` Andi Shyti 2024-03-04 10:00 ` Théo Lebrun 0 siblings, 1 reply; 54+ messages in thread From: Andi Shyti @ 2024-03-02 1:31 UTC (permalink / raw) To: Théo Lebrun Cc: Linus Walleij, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk Hi Theo, ... > @@ -284,7 +290,7 @@ static int init_hw(struct nmk_i2c_dev *priv) > } > > /* enable peripheral, master mode operation */ > -#define DEFAULT_I2C_REG_CR ((1 << 1) | I2C_CR_PE) > +#define DEFAULT_I2C_REG_CR (FIELD_PREP(I2C_CR_OM, 0b01) | I2C_CR_PE) 0b01? > /** > * load_i2c_mcr_reg() - load the MCR register > @@ -296,41 +302,42 @@ static u32 load_i2c_mcr_reg(struct nmk_i2c_dev *priv, u16 flags) > u32 mcr = 0; > unsigned short slave_adr_3msb_bits; > > - mcr |= GEN_MASK(priv->cli.slave_adr, I2C_MCR_A7, 1); > + mcr |= FIELD_PREP(I2C_MCR_A7, priv->cli.slave_adr); > > if (unlikely(flags & I2C_M_TEN)) { > /* 10-bit address transaction */ > - mcr |= GEN_MASK(2, I2C_MCR_AM, 12); > + mcr |= FIELD_PREP(I2C_MCR_AM, 2); > /* > * Get the top 3 bits. > * EA10 represents extended address in MCR. This includes > * the extension (MSB bits) of the 7 bit address loaded > * in A7 > */ > - slave_adr_3msb_bits = (priv->cli.slave_adr >> 7) & 0x7; > + slave_adr_3msb_bits = FIELD_GET(GENMASK(9, 7), > + priv->cli.slave_adr); This looks like the only one not having a define. Shall we give a definition to GENMASK(9, 7)? > > - mcr |= GEN_MASK(slave_adr_3msb_bits, I2C_MCR_EA10, 8); > + mcr |= FIELD_PREP(I2C_MCR_EA10, slave_adr_3msb_bits); ... > @@ -824,15 +827,16 @@ static irqreturn_t i2c_irq_handler(int irq, void *arg) > * during the transaction. > */ > case I2C_IT_BERR: > + { > + u32 sr = readl(priv->virtbase + I2C_SR); please give a blank line after the variable definition. Besides, I'd prefer the assignment, when it is a bit more complex, in a different line, as well. Rest looks OK, didn't see anything off. Andi ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 05/11] i2c: nomadik: use bitops helpers 2024-03-02 1:31 ` Andi Shyti @ 2024-03-04 10:00 ` Théo Lebrun 0 siblings, 0 replies; 54+ messages in thread From: Théo Lebrun @ 2024-03-04 10:00 UTC (permalink / raw) To: Andi Shyti Cc: Linus Walleij, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk Hello, On Sat Mar 2, 2024 at 2:31 AM CET, Andi Shyti wrote: [...] > > @@ -284,7 +290,7 @@ static int init_hw(struct nmk_i2c_dev *priv) > > } > > > > /* enable peripheral, master mode operation */ > > -#define DEFAULT_I2C_REG_CR ((1 << 1) | I2C_CR_PE) > > +#define DEFAULT_I2C_REG_CR (FIELD_PREP(I2C_CR_OM, 0b01) | I2C_CR_PE) > > 0b01? OM is a two-bit field. We want to put 0b01 in that. We do not declare constants for its 4 potential values. Values are: - 0b00 slave mode - 0b01 master mode - 0b10 master/slave mode - 0b11 reserved To me the comment above DEFAULT_I2C_REG_CR is enough to show that we go into master mode. We could declare all values as constants but only 0b01 would get used. > > > /** > > * load_i2c_mcr_reg() - load the MCR register > > @@ -296,41 +302,42 @@ static u32 load_i2c_mcr_reg(struct nmk_i2c_dev *priv, u16 flags) > > u32 mcr = 0; > > unsigned short slave_adr_3msb_bits; > > > > - mcr |= GEN_MASK(priv->cli.slave_adr, I2C_MCR_A7, 1); > > + mcr |= FIELD_PREP(I2C_MCR_A7, priv->cli.slave_adr); > > > > if (unlikely(flags & I2C_M_TEN)) { > > /* 10-bit address transaction */ > > - mcr |= GEN_MASK(2, I2C_MCR_AM, 12); > > + mcr |= FIELD_PREP(I2C_MCR_AM, 2); > > /* > > * Get the top 3 bits. > > * EA10 represents extended address in MCR. This includes > > * the extension (MSB bits) of the 7 bit address loaded > > * in A7 > > */ > > - slave_adr_3msb_bits = (priv->cli.slave_adr >> 7) & 0x7; > > + slave_adr_3msb_bits = FIELD_GET(GENMASK(9, 7), > > + priv->cli.slave_adr); > > This looks like the only one not having a define. Shall we give a > definition to GENMASK(9, 7)? Indeed. What should it be named? It could be generic; this is about getting the upper 3 bits from an extended (10-bit) I2C address? > > - mcr |= GEN_MASK(slave_adr_3msb_bits, I2C_MCR_EA10, 8); > > + mcr |= FIELD_PREP(I2C_MCR_EA10, slave_adr_3msb_bits); > > ... > > > @@ -824,15 +827,16 @@ static irqreturn_t i2c_irq_handler(int irq, void *arg) > > * during the transaction. > > */ > > case I2C_IT_BERR: > > + { > > + u32 sr = readl(priv->virtbase + I2C_SR); > > please give a blank line after the variable definition. > > Besides, I'd prefer the assignment, when it is a bit more > complex, in a different line, as well. Will do. > Rest looks OK, didn't see anything off. Thanks for the review Andi! -- Théo Lebrun, Bootlin Embedded Linux and Kernel engineering https://bootlin.com ^ permalink raw reply [flat|nested] 54+ messages in thread
* [PATCH v2 06/11] i2c: nomadik: support short xfer timeouts using waitqueue & hrtimer 2024-02-29 18:10 [PATCH v2 00/11] Add Mobileye EyeQ5 support to the Nomadik I2C controller & use hrtimers for timeouts Théo Lebrun ` (4 preceding siblings ...) 2024-02-29 18:10 ` [PATCH v2 05/11] i2c: nomadik: use bitops helpers Théo Lebrun @ 2024-02-29 18:10 ` Théo Lebrun 2024-03-04 9:18 ` Wolfram Sang 2024-03-04 13:54 ` [SPAM] " Andi Shyti 2024-02-29 18:10 ` [PATCH v2 07/11] i2c: nomadik: replace jiffies by ktime for FIFO flushing timeout Théo Lebrun ` (5 subsequent siblings) 11 siblings, 2 replies; 54+ messages in thread From: Théo Lebrun @ 2024-02-29 18:10 UTC (permalink / raw) To: Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer Cc: linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Théo Lebrun Replace the completion by a waitqueue for synchronization from IRQ handler to task. For short timeouts, use hrtimers, else use timers. Usecase: avoid blocking the I2C bus for too long when an issue occurs. The threshold picked is one jiffy: if timeout is below that, use hrtimers. This threshold is NOT configurable. Implement behavior but do NOT change fetching of timeout. This means the timeout is unchanged (200ms) and the hrtimer case will never trigger. A waitqueue is used because it supports both desired timeout approaches. See wait_event_timeout() and wait_event_hrtimeout(). An atomic boolean serves as synchronization condition. Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> --- drivers/i2c/busses/i2c-nomadik.c | 70 +++++++++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 22 deletions(-) diff --git a/drivers/i2c/busses/i2c-nomadik.c b/drivers/i2c/busses/i2c-nomadik.c index aa68ab402b10..e68b8e0d7919 100644 --- a/drivers/i2c/busses/i2c-nomadik.c +++ b/drivers/i2c/busses/i2c-nomadik.c @@ -162,10 +162,11 @@ struct i2c_nmk_client { * @clk_freq: clock frequency for the operation mode * @tft: Tx FIFO Threshold in bytes * @rft: Rx FIFO Threshold in bytes - * @timeout: Slave response timeout (ms) + * @timeout_usecs: Slave response timeout * @sm: speed mode * @stop: stop condition. - * @xfer_complete: acknowledge completion for a I2C message. + * @xfer_wq: xfer done wait queue. + * @xfer_done: xfer done boolean. * @result: controller propogated result. */ struct nmk_i2c_dev { @@ -179,10 +180,11 @@ struct nmk_i2c_dev { u32 clk_freq; unsigned char tft; unsigned char rft; - int timeout; + int timeout_usecs; enum i2c_freq_mode sm; int stop; - struct completion xfer_complete; + struct wait_queue_head xfer_wq; + bool xfer_done; int result; }; @@ -434,6 +436,22 @@ static void setup_i2c_controller(struct nmk_i2c_dev *priv) writel(priv->rft, priv->virtbase + I2C_RFTR); } +static bool nmk_i2c_wait_xfer_done(struct nmk_i2c_dev *priv) +{ + if (priv->timeout_usecs < jiffies_to_usecs(1)) { + unsigned long timeout_usecs = priv->timeout_usecs; + ktime_t timeout = ktime_set(0, timeout_usecs * NSEC_PER_USEC); + + wait_event_hrtimeout(priv->xfer_wq, priv->xfer_done, timeout); + } else { + unsigned long timeout = usecs_to_jiffies(priv->timeout_usecs); + + wait_event_timeout(priv->xfer_wq, priv->xfer_done, timeout); + } + + return priv->xfer_done; +} + /** * read_i2c() - Read from I2C client device * @priv: private data of I2C Driver @@ -445,9 +463,9 @@ static void setup_i2c_controller(struct nmk_i2c_dev *priv) */ static int read_i2c(struct nmk_i2c_dev *priv, u16 flags) { - int status = 0; u32 mcr, irq_mask; - unsigned long timeout; + int status = 0; + bool xfer_done; mcr = load_i2c_mcr_reg(priv, flags); writel(mcr, priv->virtbase + I2C_MCR); @@ -459,7 +477,8 @@ static int read_i2c(struct nmk_i2c_dev *priv, u16 flags) /* enable the controller */ i2c_set_bit(priv->virtbase + I2C_CR, I2C_CR_PE); - init_completion(&priv->xfer_complete); + init_waitqueue_head(&priv->xfer_wq); + priv->xfer_done = false; /* enable interrupts by setting the mask */ irq_mask = (I2C_IT_RXFNF | I2C_IT_RXFF | @@ -475,10 +494,9 @@ static int read_i2c(struct nmk_i2c_dev *priv, u16 flags) writel(readl(priv->virtbase + I2C_IMSCR) | irq_mask, priv->virtbase + I2C_IMSCR); - timeout = wait_for_completion_timeout( - &priv->xfer_complete, priv->adap.timeout); + xfer_done = nmk_i2c_wait_xfer_done(priv); - if (timeout == 0) { + if (!xfer_done) { /* Controller timed out */ dev_err(&priv->adev->dev, "read from slave 0x%x timed out\n", priv->cli.slave_adr); @@ -513,9 +531,9 @@ static void fill_tx_fifo(struct nmk_i2c_dev *priv, int no_bytes) */ static int write_i2c(struct nmk_i2c_dev *priv, u16 flags) { - u32 status = 0; u32 mcr, irq_mask; - unsigned long timeout; + u32 status = 0; + bool xfer_done; mcr = load_i2c_mcr_reg(priv, flags); @@ -528,7 +546,8 @@ static int write_i2c(struct nmk_i2c_dev *priv, u16 flags) /* enable the controller */ i2c_set_bit(priv->virtbase + I2C_CR, I2C_CR_PE); - init_completion(&priv->xfer_complete); + init_waitqueue_head(&priv->xfer_wq); + priv->xfer_done = false; /* enable interrupts by settings the masks */ irq_mask = (I2C_IT_TXFOVR | I2C_IT_MAL | I2C_IT_BERR); @@ -554,10 +573,9 @@ static int write_i2c(struct nmk_i2c_dev *priv, u16 flags) writel(readl(priv->virtbase + I2C_IMSCR) | irq_mask, priv->virtbase + I2C_IMSCR); - timeout = wait_for_completion_timeout( - &priv->xfer_complete, priv->adap.timeout); + xfer_done = nmk_i2c_wait_xfer_done(priv); - if (timeout == 0) { + if (!xfer_done) { /* Controller timed out */ dev_err(&priv->adev->dev, "write to slave 0x%x timed out\n", priv->cli.slave_adr); @@ -807,7 +825,9 @@ static irqreturn_t i2c_irq_handler(int irq, void *arg) priv->cli.count); init_hw(priv); } - complete(&priv->xfer_complete); + priv->xfer_done = true; + wake_up(&priv->xfer_wq); + break; @@ -817,7 +837,9 @@ static irqreturn_t i2c_irq_handler(int irq, void *arg) init_hw(priv); i2c_set_bit(priv->virtbase + I2C_ICR, I2C_IT_MAL); - complete(&priv->xfer_complete); + priv->xfer_done = true; + wake_up(&priv->xfer_wq); + break; @@ -834,7 +856,9 @@ static irqreturn_t i2c_irq_handler(int irq, void *arg) init_hw(priv); i2c_set_bit(priv->virtbase + I2C_ICR, I2C_IT_BERR); - complete(&priv->xfer_complete); + priv->xfer_done = true; + wake_up(&priv->xfer_wq); + } break; @@ -848,7 +872,9 @@ static irqreturn_t i2c_irq_handler(int irq, void *arg) init_hw(priv); dev_err(dev, "Tx Fifo Over run\n"); - complete(&priv->xfer_complete); + priv->xfer_done = true; + wake_up(&priv->xfer_wq); + break; @@ -949,7 +975,7 @@ static void nmk_i2c_of_probe(struct device_node *np, priv->sm = I2C_FREQ_MODE_FAST; priv->tft = 1; /* Tx FIFO threshold */ priv->rft = 8; /* Rx FIFO threshold */ - priv->timeout = 200; /* Slave response timeout(ms) */ + priv->timeout_usecs = 200 * USEC_PER_MSEC; /* Slave response timeout */ } static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id) @@ -1009,7 +1035,7 @@ static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id) adap->owner = THIS_MODULE; adap->class = I2C_CLASS_DEPRECATED; adap->algo = &nmk_i2c_algo; - adap->timeout = msecs_to_jiffies(priv->timeout); + adap->timeout = usecs_to_jiffies(priv->timeout_usecs); snprintf(adap->name, sizeof(adap->name), "Nomadik I2C at %pR", &adev->res); -- 2.44.0 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [PATCH v2 06/11] i2c: nomadik: support short xfer timeouts using waitqueue & hrtimer 2024-02-29 18:10 ` [PATCH v2 06/11] i2c: nomadik: support short xfer timeouts using waitqueue & hrtimer Théo Lebrun @ 2024-03-04 9:18 ` Wolfram Sang 2024-03-04 10:14 ` Théo Lebrun 2024-03-04 13:54 ` [SPAM] " Andi Shyti 1 sibling, 1 reply; 54+ messages in thread From: Wolfram Sang @ 2024-03-04 9:18 UTC (permalink / raw) To: Théo Lebrun Cc: Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk [-- Attachment #1: Type: text/plain, Size: 1065 bytes --] On Thu, Feb 29, 2024 at 07:10:54PM +0100, Théo Lebrun wrote: > Replace the completion by a waitqueue for synchronization from IRQ > handler to task. For short timeouts, use hrtimers, else use timers. > Usecase: avoid blocking the I2C bus for too long when an issue occurs. > > The threshold picked is one jiffy: if timeout is below that, use > hrtimers. This threshold is NOT configurable. > > Implement behavior but do NOT change fetching of timeout. This means the > timeout is unchanged (200ms) and the hrtimer case will never trigger. > > A waitqueue is used because it supports both desired timeout approaches. > See wait_event_timeout() and wait_event_hrtimeout(). An atomic boolean > serves as synchronization condition. > > Reviewed-by: Linus Walleij <linus.walleij@linaro.org> > Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> Largely: Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com> Nit: > - int timeout; > + int timeout_usecs; I think 'unsigned' makes a lot of sense here. Maybe u32 even? [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 06/11] i2c: nomadik: support short xfer timeouts using waitqueue & hrtimer 2024-03-04 9:18 ` Wolfram Sang @ 2024-03-04 10:14 ` Théo Lebrun 2024-03-04 11:37 ` Wolfram Sang 0 siblings, 1 reply; 54+ messages in thread From: Théo Lebrun @ 2024-03-04 10:14 UTC (permalink / raw) To: Wolfram Sang Cc: Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk Hello, On Mon Mar 4, 2024 at 10:18 AM CET, Wolfram Sang wrote: > On Thu, Feb 29, 2024 at 07:10:54PM +0100, Théo Lebrun wrote: > > Replace the completion by a waitqueue for synchronization from IRQ > > handler to task. For short timeouts, use hrtimers, else use timers. > > Usecase: avoid blocking the I2C bus for too long when an issue occurs. > > > > The threshold picked is one jiffy: if timeout is below that, use > > hrtimers. This threshold is NOT configurable. > > > > Implement behavior but do NOT change fetching of timeout. This means the > > timeout is unchanged (200ms) and the hrtimer case will never trigger. > > > > A waitqueue is used because it supports both desired timeout approaches. > > See wait_event_timeout() and wait_event_hrtimeout(). An atomic boolean > > serves as synchronization condition. > > > > Reviewed-by: Linus Walleij <linus.walleij@linaro.org> > > Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> > > Largely: > > Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com> Thanks for the reviews Wolfram. > Nit: > > > - int timeout; > > + int timeout_usecs; > > I think 'unsigned' makes a lot of sense here. Maybe u32 even? Yes unsigned would make sense. unsigned int or u32, I wouldn't know which to pick. Regards, -- Théo Lebrun, Bootlin Embedded Linux and Kernel engineering https://bootlin.com ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 06/11] i2c: nomadik: support short xfer timeouts using waitqueue & hrtimer 2024-03-04 10:14 ` Théo Lebrun @ 2024-03-04 11:37 ` Wolfram Sang 0 siblings, 0 replies; 54+ messages in thread From: Wolfram Sang @ 2024-03-04 11:37 UTC (permalink / raw) To: Théo Lebrun Cc: Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk [-- Attachment #1: Type: text/plain, Size: 362 bytes --] > > > - int timeout; > > > + int timeout_usecs; > > > > I think 'unsigned' makes a lot of sense here. Maybe u32 even? > > Yes unsigned would make sense. unsigned int or u32, I wouldn't know > which to pick. It gets (later) fed by of_property_read_u32(), so I tend to suggest u32. Sounds like least conversions then but please double check. [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [SPAM] [PATCH v2 06/11] i2c: nomadik: support short xfer timeouts using waitqueue & hrtimer 2024-02-29 18:10 ` [PATCH v2 06/11] i2c: nomadik: support short xfer timeouts using waitqueue & hrtimer Théo Lebrun 2024-03-04 9:18 ` Wolfram Sang @ 2024-03-04 13:54 ` Andi Shyti 2024-03-04 14:32 ` Théo Lebrun 1 sibling, 1 reply; 54+ messages in thread From: Andi Shyti @ 2024-03-04 13:54 UTC (permalink / raw) To: Théo Lebrun Cc: Linus Walleij, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk Hi Theo, ... > +static bool nmk_i2c_wait_xfer_done(struct nmk_i2c_dev *priv) > +{ > + if (priv->timeout_usecs < jiffies_to_usecs(1)) { > + unsigned long timeout_usecs = priv->timeout_usecs; > + ktime_t timeout = ktime_set(0, timeout_usecs * NSEC_PER_USEC); > + > + wait_event_hrtimeout(priv->xfer_wq, priv->xfer_done, timeout); > + } else { > + unsigned long timeout = usecs_to_jiffies(priv->timeout_usecs); > + > + wait_event_timeout(priv->xfer_wq, priv->xfer_done, timeout); > + } > + > + return priv->xfer_done; You could eventually write this as static bool nmk_i2c_wait_xfer_done(struct nmk_i2c_dev *priv) { if (priv->timeout_usecs < jiffies_to_usecs(1)) { ... return !wait_event_hrtimeout(...); } ... return wait_event_timeout(...); } It looks a bit cleaner to me... your choice. Rest looks good. Reviewed-by: Andi Shyti <andi.shyti@kernel.org> Andi ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [SPAM] [PATCH v2 06/11] i2c: nomadik: support short xfer timeouts using waitqueue & hrtimer 2024-03-04 13:54 ` [SPAM] " Andi Shyti @ 2024-03-04 14:32 ` Théo Lebrun 2024-03-04 15:09 ` Andi Shyti 0 siblings, 1 reply; 54+ messages in thread From: Théo Lebrun @ 2024-03-04 14:32 UTC (permalink / raw) To: Andi Shyti Cc: Linus Walleij, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk Hello, On Mon Mar 4, 2024 at 2:54 PM CET, Andi Shyti wrote: > Hi Theo, > > ... > > > +static bool nmk_i2c_wait_xfer_done(struct nmk_i2c_dev *priv) > > +{ > > + if (priv->timeout_usecs < jiffies_to_usecs(1)) { > > + unsigned long timeout_usecs = priv->timeout_usecs; > > + ktime_t timeout = ktime_set(0, timeout_usecs * NSEC_PER_USEC); > > + > > + wait_event_hrtimeout(priv->xfer_wq, priv->xfer_done, timeout); > > + } else { > > + unsigned long timeout = usecs_to_jiffies(priv->timeout_usecs); > > + > > + wait_event_timeout(priv->xfer_wq, priv->xfer_done, timeout); > > + } > > + > > + return priv->xfer_done; > > You could eventually write this as > > static bool nmk_i2c_wait_xfer_done(struct nmk_i2c_dev *priv) > { > if (priv->timeout_usecs < jiffies_to_usecs(1)) { > ... > > return !wait_event_hrtimeout(...); > } > > ... > return wait_event_timeout(...); > } > > It looks a bit cleaner to me... your choice. The full block would become: static bool nmk_i2c_wait_xfer_done(struct nmk_i2c_dev *priv) { if (priv->timeout_usecs < jiffies_to_usecs(1)) { unsigned long timeout_usecs = priv->timeout_usecs; ktime_t timeout = ktime_set(0, timeout_usecs * NSEC_PER_USEC); return !wait_event_hrtimeout(priv->xfer_wq, priv->xfer_done, timeout); } return wait_event_timeout(priv->xfer_wq, priv->xfer_done, usecs_to_jiffies(priv->timeout_usecs)); } Three things: - Deindenting the jiffy timeout case means no variable declaration after the if-block. This is fine from my point-of-view. - It means we depend on the half-mess that are return values from wait_event_*timeout() macros. I wanted to avoid that because it looks like an error when you read the above code and see one is negated while the other is not. - Also, I'm not confident in casting either return value to bool; what happens if either macro returns an error? This is a theoretical case that shouldn't happen, but behavior might change at some point or bugs could occur. We know priv->xfer_done will give us the right answer. My preference still goes to the original version, but I'm happy we are having a discussion about this code block. > Reviewed-by: Andi Shyti <andi.shyti@kernel.org> Thanks for your review Andi! -- Théo Lebrun, Bootlin Embedded Linux and Kernel engineering https://bootlin.com ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: Re: [PATCH v2 06/11] i2c: nomadik: support short xfer timeouts using waitqueue & hrtimer 2024-03-04 14:32 ` Théo Lebrun @ 2024-03-04 15:09 ` Andi Shyti 0 siblings, 0 replies; 54+ messages in thread From: Andi Shyti @ 2024-03-04 15:09 UTC (permalink / raw) To: Théo Lebrun Cc: Linus Walleij, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Andi Shyti Hi Theo, On Mon, Mar 04, 2024 at 03:32:38PM +0100, Théo Lebrun wrote: > On Mon Mar 4, 2024 at 2:54 PM CET, Andi Shyti wrote: > > > +static bool nmk_i2c_wait_xfer_done(struct nmk_i2c_dev *priv) > > > +{ > > > + if (priv->timeout_usecs < jiffies_to_usecs(1)) { > > > + unsigned long timeout_usecs = priv->timeout_usecs; > > > + ktime_t timeout = ktime_set(0, timeout_usecs * NSEC_PER_USEC); > > > + > > > + wait_event_hrtimeout(priv->xfer_wq, priv->xfer_done, timeout); > > > + } else { > > > + unsigned long timeout = usecs_to_jiffies(priv->timeout_usecs); > > > + > > > + wait_event_timeout(priv->xfer_wq, priv->xfer_done, timeout); > > > + } > > > + > > > + return priv->xfer_done; > > > > You could eventually write this as > > > > static bool nmk_i2c_wait_xfer_done(struct nmk_i2c_dev *priv) > > { > > if (priv->timeout_usecs < jiffies_to_usecs(1)) { > > ... > > > > return !wait_event_hrtimeout(...); > > } > > > > ... > > return wait_event_timeout(...); > > } > > > > It looks a bit cleaner to me... your choice. > > The full block would become: > > static bool nmk_i2c_wait_xfer_done(struct nmk_i2c_dev *priv) > { > if (priv->timeout_usecs < jiffies_to_usecs(1)) { > unsigned long timeout_usecs = priv->timeout_usecs; > ktime_t timeout = ktime_set(0, timeout_usecs * NSEC_PER_USEC); > > return !wait_event_hrtimeout(priv->xfer_wq, priv->xfer_done, > timeout); > } > > return wait_event_timeout(priv->xfer_wq, priv->xfer_done, > usecs_to_jiffies(priv->timeout_usecs)); > } > > Three things: > > - Deindenting the jiffy timeout case means no variable declaration > after the if-block. This is fine from my point-of-view. > > - It means we depend on the half-mess that are return values from > wait_event_*timeout() macros. I wanted to avoid that because it > looks like an error when you read the above code and see one is > negated while the other is not. > > - Also, I'm not confident in casting either return value to bool; what > happens if either macro returns an error? This is a theoretical case > that shouldn't happen, but behavior might change at some point or > bugs could occur. We know priv->xfer_done will give us the right > answer. > > My preference still goes to the original version, but I'm happy we are > having a discussion about this code block. sure... it's not a binding comment. Andi ^ permalink raw reply [flat|nested] 54+ messages in thread
* [PATCH v2 07/11] i2c: nomadik: replace jiffies by ktime for FIFO flushing timeout 2024-02-29 18:10 [PATCH v2 00/11] Add Mobileye EyeQ5 support to the Nomadik I2C controller & use hrtimers for timeouts Théo Lebrun ` (5 preceding siblings ...) 2024-02-29 18:10 ` [PATCH v2 06/11] i2c: nomadik: support short xfer timeouts using waitqueue & hrtimer Théo Lebrun @ 2024-02-29 18:10 ` Théo Lebrun 2024-03-04 9:23 ` Wolfram Sang 2024-03-04 13:55 ` Andi Shyti 2024-02-29 18:10 ` [PATCH v2 08/11] i2c: nomadik: fetch i2c-transfer-timeout-us property from devicetree Théo Lebrun ` (4 subsequent siblings) 11 siblings, 2 replies; 54+ messages in thread From: Théo Lebrun @ 2024-02-29 18:10 UTC (permalink / raw) To: Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer Cc: linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Théo Lebrun The FIFO flush function uses a jiffies amount to detect timeouts as the flushing is async. Replace with ktime to get more accurate precision and support short timeouts. Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> --- drivers/i2c/busses/i2c-nomadik.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/i2c/busses/i2c-nomadik.c b/drivers/i2c/busses/i2c-nomadik.c index e68b8e0d7919..afd54999bbbb 100644 --- a/drivers/i2c/busses/i2c-nomadik.c +++ b/drivers/i2c/busses/i2c-nomadik.c @@ -219,8 +219,8 @@ static inline void i2c_clr_bit(void __iomem *reg, u32 mask) static int flush_i2c_fifo(struct nmk_i2c_dev *priv) { #define LOOP_ATTEMPTS 10 + ktime_t timeout; int i; - unsigned long timeout; /* * flush the transmit and receive FIFO. The flushing @@ -232,9 +232,9 @@ static int flush_i2c_fifo(struct nmk_i2c_dev *priv) writel((I2C_CR_FTX | I2C_CR_FRX), priv->virtbase + I2C_CR); for (i = 0; i < LOOP_ATTEMPTS; i++) { - timeout = jiffies + priv->adap.timeout; + timeout = ktime_add_us(ktime_get(), priv->timeout_usecs); - while (!time_after(jiffies, timeout)) { + while (ktime_after(timeout, ktime_get())) { if ((readl(priv->virtbase + I2C_CR) & (I2C_CR_FTX | I2C_CR_FRX)) == 0) return 0; -- 2.44.0 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [PATCH v2 07/11] i2c: nomadik: replace jiffies by ktime for FIFO flushing timeout 2024-02-29 18:10 ` [PATCH v2 07/11] i2c: nomadik: replace jiffies by ktime for FIFO flushing timeout Théo Lebrun @ 2024-03-04 9:23 ` Wolfram Sang 2024-03-04 13:55 ` Andi Shyti 1 sibling, 0 replies; 54+ messages in thread From: Wolfram Sang @ 2024-03-04 9:23 UTC (permalink / raw) To: Théo Lebrun Cc: Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk [-- Attachment #1: Type: text/plain, Size: 425 bytes --] On Thu, Feb 29, 2024 at 07:10:55PM +0100, Théo Lebrun wrote: > The FIFO flush function uses a jiffies amount to detect timeouts as the > flushing is async. Replace with ktime to get more accurate precision > and support short timeouts. > > Reviewed-by: Linus Walleij <linus.walleij@linaro.org> > Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com> [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 07/11] i2c: nomadik: replace jiffies by ktime for FIFO flushing timeout 2024-02-29 18:10 ` [PATCH v2 07/11] i2c: nomadik: replace jiffies by ktime for FIFO flushing timeout Théo Lebrun 2024-03-04 9:23 ` Wolfram Sang @ 2024-03-04 13:55 ` Andi Shyti 1 sibling, 0 replies; 54+ messages in thread From: Andi Shyti @ 2024-03-04 13:55 UTC (permalink / raw) To: Théo Lebrun Cc: Linus Walleij, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk Hi Theo, On Thu, Feb 29, 2024 at 07:10:55PM +0100, Théo Lebrun wrote: > The FIFO flush function uses a jiffies amount to detect timeouts as the > flushing is async. Replace with ktime to get more accurate precision > and support short timeouts. > > Reviewed-by: Linus Walleij <linus.walleij@linaro.org> > Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> Reviewed-by: Andi Shyti <andi.shyti@kernel.org> Thanks, Andi ^ permalink raw reply [flat|nested] 54+ messages in thread
* [PATCH v2 08/11] i2c: nomadik: fetch i2c-transfer-timeout-us property from devicetree 2024-02-29 18:10 [PATCH v2 00/11] Add Mobileye EyeQ5 support to the Nomadik I2C controller & use hrtimers for timeouts Théo Lebrun ` (6 preceding siblings ...) 2024-02-29 18:10 ` [PATCH v2 07/11] i2c: nomadik: replace jiffies by ktime for FIFO flushing timeout Théo Lebrun @ 2024-02-29 18:10 ` Théo Lebrun 2024-02-29 21:04 ` Linus Walleij ` (2 more replies) 2024-02-29 18:10 ` [PATCH v2 09/11] i2c: nomadik: support Mobileye EyeQ5 I2C controller Théo Lebrun ` (3 subsequent siblings) 11 siblings, 3 replies; 54+ messages in thread From: Théo Lebrun @ 2024-02-29 18:10 UTC (permalink / raw) To: Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer Cc: linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Théo Lebrun Allow overriding the default timeout value (200ms) from devicetree, using the generic i2c-transfer-timeout-us property. The i2c_adapter->timeout field is an unaccurate jiffies amount; i2c-nomadik uses hrtimers for timeouts below one jiffy. Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> --- drivers/i2c/busses/i2c-nomadik.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/i2c/busses/i2c-nomadik.c b/drivers/i2c/busses/i2c-nomadik.c index afd54999bbbb..2d3247979e45 100644 --- a/drivers/i2c/busses/i2c-nomadik.c +++ b/drivers/i2c/busses/i2c-nomadik.c @@ -964,6 +964,8 @@ static const struct i2c_algorithm nmk_i2c_algo = { static void nmk_i2c_of_probe(struct device_node *np, struct nmk_i2c_dev *priv) { + u32 timeout_usecs; + /* Default to 100 kHz if no frequency is given in the node */ if (of_property_read_u32(np, "clock-frequency", &priv->clk_freq)) priv->clk_freq = I2C_MAX_STANDARD_MODE_FREQ; @@ -975,7 +977,12 @@ static void nmk_i2c_of_probe(struct device_node *np, priv->sm = I2C_FREQ_MODE_FAST; priv->tft = 1; /* Tx FIFO threshold */ priv->rft = 8; /* Rx FIFO threshold */ - priv->timeout_usecs = 200 * USEC_PER_MSEC; /* Slave response timeout */ + + /* Slave response timeout */ + if (!of_property_read_u32(np, "i2c-transfer-timeout-us", &timeout_usecs)) + priv->timeout_usecs = timeout_usecs; + else + priv->timeout_usecs = 200 * USEC_PER_MSEC; } static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id) -- 2.44.0 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [PATCH v2 08/11] i2c: nomadik: fetch i2c-transfer-timeout-us property from devicetree 2024-02-29 18:10 ` [PATCH v2 08/11] i2c: nomadik: fetch i2c-transfer-timeout-us property from devicetree Théo Lebrun @ 2024-02-29 21:04 ` Linus Walleij 2024-03-04 9:25 ` Wolfram Sang 2024-03-04 13:57 ` Andi Shyti 2 siblings, 0 replies; 54+ messages in thread From: Linus Walleij @ 2024-02-29 21:04 UTC (permalink / raw) To: Théo Lebrun Cc: Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk On Thu, Feb 29, 2024 at 7:10 PM Théo Lebrun <theo.lebrun@bootlin.com> wrote: > Allow overriding the default timeout value (200ms) from devicetree, > using the generic i2c-transfer-timeout-us property. > > The i2c_adapter->timeout field is an unaccurate jiffies amount; > i2c-nomadik uses hrtimers for timeouts below one jiffy. > > Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Yours, Linus Walleij ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 08/11] i2c: nomadik: fetch i2c-transfer-timeout-us property from devicetree 2024-02-29 18:10 ` [PATCH v2 08/11] i2c: nomadik: fetch i2c-transfer-timeout-us property from devicetree Théo Lebrun 2024-02-29 21:04 ` Linus Walleij @ 2024-03-04 9:25 ` Wolfram Sang 2024-03-04 13:57 ` Andi Shyti 2 siblings, 0 replies; 54+ messages in thread From: Wolfram Sang @ 2024-03-04 9:25 UTC (permalink / raw) To: Théo Lebrun Cc: Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk [-- Attachment #1: Type: text/plain, Size: 722 bytes --] On Thu, Feb 29, 2024 at 07:10:56PM +0100, Théo Lebrun wrote: > Allow overriding the default timeout value (200ms) from devicetree, > using the generic i2c-transfer-timeout-us property. > > The i2c_adapter->timeout field is an unaccurate jiffies amount; > i2c-nomadik uses hrtimers for timeouts below one jiffy. > > Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> I agree to get the DT property here in the driver. We may later refactor it to handle it in the I2C core. Syncing this new property with the existing 'adapter->timeout' will be a tad annoying, though. But I guess the shorter timeouts are a desired feature these days... Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com> [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 08/11] i2c: nomadik: fetch i2c-transfer-timeout-us property from devicetree 2024-02-29 18:10 ` [PATCH v2 08/11] i2c: nomadik: fetch i2c-transfer-timeout-us property from devicetree Théo Lebrun 2024-02-29 21:04 ` Linus Walleij 2024-03-04 9:25 ` Wolfram Sang @ 2024-03-04 13:57 ` Andi Shyti 2 siblings, 0 replies; 54+ messages in thread From: Andi Shyti @ 2024-03-04 13:57 UTC (permalink / raw) To: Théo Lebrun Cc: Linus Walleij, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Andi Shyti Hi Theo, On Thu, Feb 29, 2024 at 07:10:56PM +0100, Théo Lebrun wrote: > Allow overriding the default timeout value (200ms) from devicetree, > using the generic i2c-transfer-timeout-us property. > > The i2c_adapter->timeout field is an unaccurate jiffies amount; > i2c-nomadik uses hrtimers for timeouts below one jiffy. > > Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> Reviewed-by: Andi Shyti <andi.shyti@kernel.org> Thanks, Andi ^ permalink raw reply [flat|nested] 54+ messages in thread
* [PATCH v2 09/11] i2c: nomadik: support Mobileye EyeQ5 I2C controller 2024-02-29 18:10 [PATCH v2 00/11] Add Mobileye EyeQ5 support to the Nomadik I2C controller & use hrtimers for timeouts Théo Lebrun ` (7 preceding siblings ...) 2024-02-29 18:10 ` [PATCH v2 08/11] i2c: nomadik: fetch i2c-transfer-timeout-us property from devicetree Théo Lebrun @ 2024-02-29 18:10 ` Théo Lebrun 2024-02-29 21:08 ` Linus Walleij ` (2 more replies) 2024-02-29 18:10 ` [PATCH v2 10/11] MIPS: mobileye: eyeq5: add 5 I2C controller nodes Théo Lebrun ` (2 subsequent siblings) 11 siblings, 3 replies; 54+ messages in thread From: Théo Lebrun @ 2024-02-29 18:10 UTC (permalink / raw) To: Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer Cc: linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Théo Lebrun Add compatible for the integration of the same DB8500 IP block into the Mobileye EyeQ5 platform. Two quirks are present: - The memory bus only supports 32-bit accesses. Avoid writeb() and readb() by introducing helper functions that fallback to writel() and readl(). - A register must be configured for the I2C speed mode; it is located in a shared register region called OLB. We access that memory region using a syscon & regmap that gets passed as a phandle (mobileye,olb). A two-bit enum per controller is written into the register; that requires us to know the global index of the I2C controller (cell arg to the mobileye,olb phandle). We add #include <linux/mfd/syscon.h> and <linux/regmap.h> and sort headers. Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> --- drivers/i2c/busses/i2c-nomadik.c | 95 +++++++++++++++++++++++++++++++++++----- 1 file changed, 84 insertions(+), 11 deletions(-) diff --git a/drivers/i2c/busses/i2c-nomadik.c b/drivers/i2c/busses/i2c-nomadik.c index 2d3247979e45..e9a77377add4 100644 --- a/drivers/i2c/busses/i2c-nomadik.c +++ b/drivers/i2c/busses/i2c-nomadik.c @@ -6,22 +6,30 @@ * I2C master mode controller driver, used in Nomadik 8815 * and Ux500 platforms. * + * The Mobileye EyeQ5 platform is also supported; it uses + * the same Ux500/DB8500 IP block with two quirks: + * - The memory bus only supports 32-bit accesses. + * - A register must be configured for the I2C speed mode; + * it is located in a shared register region called OLB. + * * Author: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com> * Author: Sachin Verma <sachin.verma@st.com> */ +#include <linux/amba/bus.h> #include <linux/bitfield.h> +#include <linux/clk.h> +#include <linux/err.h> +#include <linux/i2c.h> #include <linux/init.h> -#include <linux/module.h> -#include <linux/amba/bus.h> -#include <linux/slab.h> #include <linux/interrupt.h> -#include <linux/i2c.h> -#include <linux/err.h> -#include <linux/clk.h> #include <linux/io.h> -#include <linux/pm_runtime.h> +#include <linux/mfd/syscon.h> +#include <linux/module.h> #include <linux/of.h> #include <linux/pinctrl/consumer.h> +#include <linux/pm_runtime.h> +#include <linux/regmap.h> +#include <linux/slab.h> #define DRIVER_NAME "nmk-i2c" @@ -110,6 +118,10 @@ enum i2c_freq_mode { I2C_FREQ_MODE_FAST_PLUS, /* up to 1 Mb/s */ }; +/* Mobileye EyeQ5 offset into a shared register region (called OLB) */ +#define NMK_I2C_EYEQ5_OLB_IOCR2 0x0B8 +#define NMK_I2C_EYEQ5_OLB_IOCR2_SHIFT(id) (4 + 2 * (id)) + /** * struct i2c_vendor_data - per-vendor variations * @has_mtdws: variant has the MTDWS bit @@ -168,6 +180,7 @@ struct i2c_nmk_client { * @xfer_wq: xfer done wait queue. * @xfer_done: xfer done boolean. * @result: controller propogated result. + * @has_32b_bus: controller is on a bus that only supports 32-bit accesses. */ struct nmk_i2c_dev { struct i2c_vendor_data *vendor; @@ -186,6 +199,7 @@ struct nmk_i2c_dev { struct wait_queue_head xfer_wq; bool xfer_done; int result; + bool has_32b_bus; }; /* controller's abort causes */ @@ -209,6 +223,24 @@ static inline void i2c_clr_bit(void __iomem *reg, u32 mask) writel(readl(reg) & ~mask, reg); } +static inline u8 nmk_i2c_readb(const struct nmk_i2c_dev *priv, + unsigned long reg) +{ + if (priv->has_32b_bus) + return readl(priv->virtbase + reg); + else + return readb(priv->virtbase + reg); +} + +static inline void nmk_i2c_writeb(const struct nmk_i2c_dev *priv, u32 val, + unsigned long reg) +{ + if (priv->has_32b_bus) + writel(val, priv->virtbase + reg); + else + writeb(val, priv->virtbase + reg); +} + /** * flush_i2c_fifo() - This function flushes the I2C FIFO * @priv: private data of I2C Driver @@ -514,7 +546,7 @@ static void fill_tx_fifo(struct nmk_i2c_dev *priv, int no_bytes) (priv->cli.count != 0); count--) { /* write to the Tx FIFO */ - writeb(*priv->cli.buffer, priv->virtbase + I2C_TFR); + nmk_i2c_writeb(priv, *priv->cli.buffer, I2C_TFR); priv->cli.buffer++; priv->cli.count--; priv->cli.xfer_bytes++; @@ -783,7 +815,7 @@ static irqreturn_t i2c_irq_handler(int irq, void *arg) case I2C_IT_RXFNF: for (count = rft; count > 0; count--) { /* Read the Rx FIFO */ - *priv->cli.buffer = readb(priv->virtbase + I2C_RFR); + *priv->cli.buffer = nmk_i2c_readb(priv, I2C_RFR); priv->cli.buffer++; } priv->cli.count -= rft; @@ -793,7 +825,7 @@ static irqreturn_t i2c_irq_handler(int irq, void *arg) /* Rx FIFO full */ case I2C_IT_RXFF: for (count = MAX_I2C_FIFO_THRESHOLD; count > 0; count--) { - *priv->cli.buffer = readb(priv->virtbase + I2C_RFR); + *priv->cli.buffer = nmk_i2c_readb(priv, I2C_RFR); priv->cli.buffer++; } priv->cli.count -= MAX_I2C_FIFO_THRESHOLD; @@ -809,7 +841,7 @@ static irqreturn_t i2c_irq_handler(int irq, void *arg) if (priv->cli.count == 0) break; *priv->cli.buffer = - readb(priv->virtbase + I2C_RFR); + nmk_i2c_readb(priv, I2C_RFR); priv->cli.buffer++; priv->cli.count--; priv->cli.xfer_bytes++; @@ -985,6 +1017,38 @@ static void nmk_i2c_of_probe(struct device_node *np, priv->timeout_usecs = 200 * USEC_PER_MSEC; } +static int nmk_i2c_eyeq5_probe(struct nmk_i2c_dev *priv) +{ + struct device *dev = &priv->adev->dev; + struct device_node *np = dev->of_node; + unsigned int shift, speed_mode; + struct regmap *olb; + unsigned int id; + + priv->has_32b_bus = true; + + olb = syscon_regmap_lookup_by_phandle_args(np, "mobileye,olb", 1, &id); + if (IS_ERR_OR_NULL(olb)) { + if (!olb) + olb = ERR_PTR(-ENOENT); + return dev_err_probe(dev, PTR_ERR(olb), + "failed OLB lookup: %lu\n", PTR_ERR(olb)); + } + + if (priv->clk_freq <= 400000) + speed_mode = 0b00; + else if (priv->clk_freq <= 1000000) + speed_mode = 0b01; + else + speed_mode = 0b10; + + shift = NMK_I2C_EYEQ5_OLB_IOCR2_SHIFT(id); + regmap_update_bits(olb, NMK_I2C_EYEQ5_OLB_IOCR2, + 0b11 << shift, speed_mode << shift); + + return 0; +} + static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id) { int ret = 0; @@ -1001,8 +1065,17 @@ static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id) priv->vendor = vendor; priv->adev = adev; + priv->has_32b_bus = false; nmk_i2c_of_probe(np, priv); + if (of_device_is_compatible(np, "mobileye,eyeq5-i2c")) { + ret = nmk_i2c_eyeq5_probe(priv); + if (ret) { + dev_info(dev, "%s: %d: %d\n", __func__, __LINE__, ret); + return ret; + } + } + if (priv->tft > max_fifo_threshold) { dev_warn(dev, "requested TX FIFO threshold %u, adjusted down to %u\n", priv->tft, max_fifo_threshold); -- 2.44.0 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [PATCH v2 09/11] i2c: nomadik: support Mobileye EyeQ5 I2C controller 2024-02-29 18:10 ` [PATCH v2 09/11] i2c: nomadik: support Mobileye EyeQ5 I2C controller Théo Lebrun @ 2024-02-29 21:08 ` Linus Walleij 2024-03-04 9:27 ` Wolfram Sang 2024-03-04 14:08 ` Andi Shyti 2 siblings, 0 replies; 54+ messages in thread From: Linus Walleij @ 2024-02-29 21:08 UTC (permalink / raw) To: Théo Lebrun Cc: Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk On Thu, Feb 29, 2024 at 7:10 PM Théo Lebrun <theo.lebrun@bootlin.com> wrote: > Add compatible for the integration of the same DB8500 IP block into the > Mobileye EyeQ5 platform. Two quirks are present: > > - The memory bus only supports 32-bit accesses. Avoid writeb() and > readb() by introducing helper functions that fallback to writel() > and readl(). > > - A register must be configured for the I2C speed mode; it is located > in a shared register region called OLB. We access that memory region > using a syscon & regmap that gets passed as a phandle (mobileye,olb). > > A two-bit enum per controller is written into the register; that > requires us to know the global index of the I2C controller (cell arg > to the mobileye,olb phandle). > > We add #include <linux/mfd/syscon.h> and <linux/regmap.h> and sort > headers. > > Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Yours, Linus Walleij ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 09/11] i2c: nomadik: support Mobileye EyeQ5 I2C controller 2024-02-29 18:10 ` [PATCH v2 09/11] i2c: nomadik: support Mobileye EyeQ5 I2C controller Théo Lebrun 2024-02-29 21:08 ` Linus Walleij @ 2024-03-04 9:27 ` Wolfram Sang 2024-03-04 10:25 ` Théo Lebrun 2024-03-04 14:08 ` Andi Shyti 2 siblings, 1 reply; 54+ messages in thread From: Wolfram Sang @ 2024-03-04 9:27 UTC (permalink / raw) To: Théo Lebrun Cc: Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk [-- Attachment #1: Type: text/plain, Size: 292 bytes --] > + if (of_device_is_compatible(np, "mobileye,eyeq5-i2c")) { > + ret = nmk_i2c_eyeq5_probe(priv); > + if (ret) { > + dev_info(dev, "%s: %d: %d\n", __func__, __LINE__, ret); This is debug code, or? Please remove it. Especially since nmk_i2c_eyeq5_probe() prints something out on error. [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 09/11] i2c: nomadik: support Mobileye EyeQ5 I2C controller 2024-03-04 9:27 ` Wolfram Sang @ 2024-03-04 10:25 ` Théo Lebrun 0 siblings, 0 replies; 54+ messages in thread From: Théo Lebrun @ 2024-03-04 10:25 UTC (permalink / raw) To: Wolfram Sang Cc: Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk Hello, On Mon Mar 4, 2024 at 10:27 AM CET, Wolfram Sang wrote: > > > + if (of_device_is_compatible(np, "mobileye,eyeq5-i2c")) { > > + ret = nmk_i2c_eyeq5_probe(priv); > > + if (ret) { > > + dev_info(dev, "%s: %d: %d\n", __func__, __LINE__, ret); > > This is debug code, or? Please remove it. Especially since > nmk_i2c_eyeq5_probe() prints something out on error. It is. Nice catch, sorry about that. Regards, -- Théo Lebrun, Bootlin Embedded Linux and Kernel engineering https://bootlin.com ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 09/11] i2c: nomadik: support Mobileye EyeQ5 I2C controller 2024-02-29 18:10 ` [PATCH v2 09/11] i2c: nomadik: support Mobileye EyeQ5 I2C controller Théo Lebrun 2024-02-29 21:08 ` Linus Walleij 2024-03-04 9:27 ` Wolfram Sang @ 2024-03-04 14:08 ` Andi Shyti 2024-03-04 14:53 ` Théo Lebrun 2 siblings, 1 reply; 54+ messages in thread From: Andi Shyti @ 2024-03-04 14:08 UTC (permalink / raw) To: Théo Lebrun Cc: Linus Walleij, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Andi Shyti Hi Theo, ... > +#include <linux/amba/bus.h> > #include <linux/bitfield.h> > +#include <linux/clk.h> > +#include <linux/err.h> > +#include <linux/i2c.h> > #include <linux/init.h> > -#include <linux/module.h> > -#include <linux/amba/bus.h> > -#include <linux/slab.h> > #include <linux/interrupt.h> > -#include <linux/i2c.h> > -#include <linux/err.h> > -#include <linux/clk.h> > #include <linux/io.h> > -#include <linux/pm_runtime.h> > +#include <linux/mfd/syscon.h> > +#include <linux/module.h> > #include <linux/of.h> > #include <linux/pinctrl/consumer.h> > +#include <linux/pm_runtime.h> > +#include <linux/regmap.h> > +#include <linux/slab.h> Please reorder the headers in a different patch. > #define DRIVER_NAME "nmk-i2c" > ... > +static inline u8 nmk_i2c_readb(const struct nmk_i2c_dev *priv, > + unsigned long reg) > +{ > + if (priv->has_32b_bus) > + return readl(priv->virtbase + reg); > + else > + return readb(priv->virtbase + reg); nit: no need for the else (your choice though, if you want to have ti coherent with the write counterpart). > +} > + > +static inline void nmk_i2c_writeb(const struct nmk_i2c_dev *priv, u32 val, > + unsigned long reg) > +{ > + if (priv->has_32b_bus) > + writel(val, priv->virtbase + reg); > + else > + writeb(val, priv->virtbase + reg); > +} ... > +static int nmk_i2c_eyeq5_probe(struct nmk_i2c_dev *priv) > +{ > + struct device *dev = &priv->adev->dev; > + struct device_node *np = dev->of_node; > + unsigned int shift, speed_mode; > + struct regmap *olb; > + unsigned int id; > + > + priv->has_32b_bus = true; > + > + olb = syscon_regmap_lookup_by_phandle_args(np, "mobileye,olb", 1, &id); > + if (IS_ERR_OR_NULL(olb)) { > + if (!olb) > + olb = ERR_PTR(-ENOENT); > + return dev_err_probe(dev, PTR_ERR(olb), > + "failed OLB lookup: %lu\n", PTR_ERR(olb)); just return PTR_ERR(olb) and use dev_err_probe() in the upper layer probe. > + } > + > + if (priv->clk_freq <= 400000) > + speed_mode = 0b00; > + else if (priv->clk_freq <= 1000000) > + speed_mode = 0b01; > + else > + speed_mode = 0b10; would be nice to have these as defines. > + > + shift = NMK_I2C_EYEQ5_OLB_IOCR2_SHIFT(id); > + regmap_update_bits(olb, NMK_I2C_EYEQ5_OLB_IOCR2, > + 0b11 << shift, speed_mode << shift); please define these values and for hexadecimals use 0x... > + return 0; > +} > + > static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id) > { > int ret = 0; > @@ -1001,8 +1065,17 @@ static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id) > > priv->vendor = vendor; > priv->adev = adev; > + priv->has_32b_bus = false; > nmk_i2c_of_probe(np, priv); > > + if (of_device_is_compatible(np, "mobileye,eyeq5-i2c")) { > + ret = nmk_i2c_eyeq5_probe(priv); > + if (ret) { > + dev_info(dev, "%s: %d: %d\n", __func__, __LINE__, ret); > + return ret; > + } as said above, use dev_err_probe here. Andi > + } > + > if (priv->tft > max_fifo_threshold) { > dev_warn(dev, "requested TX FIFO threshold %u, adjusted down to %u\n", > priv->tft, max_fifo_threshold); > > -- > 2.44.0 > ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 09/11] i2c: nomadik: support Mobileye EyeQ5 I2C controller 2024-03-04 14:08 ` Andi Shyti @ 2024-03-04 14:53 ` Théo Lebrun 0 siblings, 0 replies; 54+ messages in thread From: Théo Lebrun @ 2024-03-04 14:53 UTC (permalink / raw) To: Andi Shyti Cc: Linus Walleij, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk Hello, On Mon Mar 4, 2024 at 3:08 PM CET, Andi Shyti wrote: > Hi Theo, > > ... > > > +#include <linux/amba/bus.h> > > #include <linux/bitfield.h> > > +#include <linux/clk.h> > > +#include <linux/err.h> > > +#include <linux/i2c.h> > > #include <linux/init.h> > > -#include <linux/module.h> > > -#include <linux/amba/bus.h> > > -#include <linux/slab.h> > > #include <linux/interrupt.h> > > -#include <linux/i2c.h> > > -#include <linux/err.h> > > -#include <linux/clk.h> > > #include <linux/io.h> > > -#include <linux/pm_runtime.h> > > +#include <linux/mfd/syscon.h> > > +#include <linux/module.h> > > #include <linux/of.h> > > #include <linux/pinctrl/consumer.h> > > +#include <linux/pm_runtime.h> > > +#include <linux/regmap.h> > > +#include <linux/slab.h> > > Please reorder the headers in a different patch. Will do. > > > #define DRIVER_NAME "nmk-i2c" > > > > ... > > > +static inline u8 nmk_i2c_readb(const struct nmk_i2c_dev *priv, > > + unsigned long reg) > > +{ > > + if (priv->has_32b_bus) > > + return readl(priv->virtbase + reg); > > + else > > + return readb(priv->virtbase + reg); > > nit: no need for the else (your choice though, if you want to > have ti coherent with the write counterpart). Indeed, the useless else block can be removed. Will do. > > +} > > + > > +static inline void nmk_i2c_writeb(const struct nmk_i2c_dev *priv, u32 val, > > + unsigned long reg) > > +{ > > + if (priv->has_32b_bus) > > + writel(val, priv->virtbase + reg); > > + else > > + writeb(val, priv->virtbase + reg); > > +} > > ... > > > +static int nmk_i2c_eyeq5_probe(struct nmk_i2c_dev *priv) > > +{ > > + struct device *dev = &priv->adev->dev; > > + struct device_node *np = dev->of_node; > > + unsigned int shift, speed_mode; > > + struct regmap *olb; > > + unsigned int id; > > + > > + priv->has_32b_bus = true; > > + > > + olb = syscon_regmap_lookup_by_phandle_args(np, "mobileye,olb", 1, &id); > > + if (IS_ERR_OR_NULL(olb)) { > > + if (!olb) > > + olb = ERR_PTR(-ENOENT); > > + return dev_err_probe(dev, PTR_ERR(olb), > > + "failed OLB lookup: %lu\n", PTR_ERR(olb)); > > just return PTR_ERR(olb) and use dev_err_probe() in the upper > layer probe. Good catch. In previous revisions nmk_i2c_eyeq5_probe() had multiple error cases so it had to be the one doing the logging. Now that there is a single possible error parent can do it. It should simplify code. > > > + } > > + > > + if (priv->clk_freq <= 400000) > > + speed_mode = 0b00; > > + else if (priv->clk_freq <= 1000000) > > + speed_mode = 0b01; > > + else > > + speed_mode = 0b10; > > would be nice to have these as defines. Agreed. Will be named based on I2C mode names, eg standard, fast, high speed, fast plus. > > > + > > + shift = NMK_I2C_EYEQ5_OLB_IOCR2_SHIFT(id); > > + regmap_update_bits(olb, NMK_I2C_EYEQ5_OLB_IOCR2, > > + 0b11 << shift, speed_mode << shift); > > please define these values and for hexadecimals use 0x... 0b11 is a two-bit mask. What do you mean by "these values"? Something like: #define NMK_I2C_EYEQ5_SPEED_MODE_FAST 0b00 #define NMK_I2C_EYEQ5_SPEED_MODE_FAST_PLUS 0b01 #define NMK_I2C_EYEQ5_SPEED_MODE_HIGH_SPEED 0b10 static const u8 nmk_i2c_eyeq5_masks[] = { [0] = 0x0030, [1] = 0x00C0, [2] = 0x0300, [3] = 0x0C00, [4] = 0x3000, }; static int nmk_i2c_eyeq5_probe(struct nmk_i2c_dev *priv) { // ... unsigned int id, mask, speed_mode; priv->has_32b_bus = true; olb = syscon_regmap_lookup_by_phandle_args(np, "mobileye,olb", 1, &id); // TODO: olb error checking // TODO: check id is valid if (priv->clk_freq <= 400000) speed_mode = NMK_I2C_EYEQ5_SPEED_MODE_FAST; else if (priv->clk_freq <= 1000000) speed_mode = NMK_I2C_EYEQ5_SPEED_MODE_FAST_PLUS; else speed_mode = NMK_I2C_EYEQ5_SPEED_MODE_HIGH_SPEED; mask = nmk_i2c_eyeq5_masks[id]; regmap_update_bits(olb, NMK_I2C_EYEQ5_OLB_IOCR2, mask, speed_mode << __fls(mask)); return 0; } Else I do not see what you are suggesting by "please define these values". Have a nice day, -- Théo Lebrun, Bootlin Embedded Linux and Kernel engineering https://bootlin.com ^ permalink raw reply [flat|nested] 54+ messages in thread
* [PATCH v2 10/11] MIPS: mobileye: eyeq5: add 5 I2C controller nodes 2024-02-29 18:10 [PATCH v2 00/11] Add Mobileye EyeQ5 support to the Nomadik I2C controller & use hrtimers for timeouts Théo Lebrun ` (8 preceding siblings ...) 2024-02-29 18:10 ` [PATCH v2 09/11] i2c: nomadik: support Mobileye EyeQ5 I2C controller Théo Lebrun @ 2024-02-29 18:10 ` Théo Lebrun 2024-02-29 21:09 ` Linus Walleij 2024-02-29 18:10 ` [PATCH v2 11/11] MIPS: mobileye: eyeq5: add evaluation board I2C temp sensor Théo Lebrun 2024-03-06 1:49 ` [PATCH v2 00/11] Add Mobileye EyeQ5 support to the Nomadik I2C controller & use hrtimers for timeouts Andi Shyti 11 siblings, 1 reply; 54+ messages in thread From: Théo Lebrun @ 2024-02-29 18:10 UTC (permalink / raw) To: Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer Cc: linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Théo Lebrun Add the SoC I2C controller nodes to the platform devicetree. Use a default bus frequency of 400kHz. They are AMBA devices that are matched on PeriphID. Set transfer timeout to 10ms instead of Linux's default of 200ms. Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> --- arch/mips/boot/dts/mobileye/eyeq5.dtsi | 75 ++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/arch/mips/boot/dts/mobileye/eyeq5.dtsi b/arch/mips/boot/dts/mobileye/eyeq5.dtsi index 8d4f65ec912d..540d55503f3b 100644 --- a/arch/mips/boot/dts/mobileye/eyeq5.dtsi +++ b/arch/mips/boot/dts/mobileye/eyeq5.dtsi @@ -70,6 +70,81 @@ soc: soc { ranges; compatible = "simple-bus"; + i2c0: i2c@300000 { + compatible = "mobileye,eyeq5-i2c", "arm,primecell"; + reg = <0 0x300000 0x0 0x1000>; + interrupt-parent = <&gic>; + interrupts = <GIC_SHARED 1 IRQ_TYPE_LEVEL_HIGH>; + clock-frequency = <400000>; /* Fast mode */ + #address-cells = <1>; + #size-cells = <0>; + clocks = <&i2c_ser_clk>, <&i2c_clk>; + clock-names = "i2cclk", "apb_pclk"; + resets = <&reset 0 13>; + i2c-transfer-timeout-us = <10000>; + mobileye,olb = <&olb 0>; + }; + + i2c1: i2c@400000 { + compatible = "mobileye,eyeq5-i2c", "arm,primecell"; + reg = <0 0x400000 0x0 0x1000>; + interrupt-parent = <&gic>; + interrupts = <GIC_SHARED 2 IRQ_TYPE_LEVEL_HIGH>; + clock-frequency = <400000>; /* Fast mode */ + #address-cells = <1>; + #size-cells = <0>; + clocks = <&i2c_ser_clk>, <&i2c_clk>; + clock-names = "i2cclk", "apb_pclk"; + resets = <&reset 0 14>; + i2c-transfer-timeout-us = <10000>; + mobileye,olb = <&olb 1>; + }; + + i2c2: i2c@500000 { + compatible = "mobileye,eyeq5-i2c", "arm,primecell"; + reg = <0 0x500000 0x0 0x1000>; + interrupt-parent = <&gic>; + interrupts = <GIC_SHARED 3 IRQ_TYPE_LEVEL_HIGH>; + clock-frequency = <400000>; /* Fast mode */ + #address-cells = <1>; + #size-cells = <0>; + clocks = <&i2c_ser_clk>, <&i2c_clk>; + clock-names = "i2cclk", "apb_pclk"; + resets = <&reset 0 15>; + i2c-transfer-timeout-us = <10000>; + mobileye,olb = <&olb 2>; + }; + + i2c3: i2c@600000 { + compatible = "mobileye,eyeq5-i2c", "arm,primecell"; + reg = <0 0x600000 0x0 0x1000>; + interrupt-parent = <&gic>; + interrupts = <GIC_SHARED 4 IRQ_TYPE_LEVEL_HIGH>; + clock-frequency = <400000>; /* Fast mode */ + #address-cells = <1>; + #size-cells = <0>; + clocks = <&i2c_ser_clk>, <&i2c_clk>; + clock-names = "i2cclk", "apb_pclk"; + resets = <&reset 0 16>; + i2c-transfer-timeout-us = <10000>; + mobileye,olb = <&olb 3>; + }; + + i2c4: i2c@700000 { + compatible = "mobileye,eyeq5-i2c", "arm,primecell"; + reg = <0 0x700000 0x0 0x1000>; + interrupt-parent = <&gic>; + interrupts = <GIC_SHARED 5 IRQ_TYPE_LEVEL_HIGH>; + clock-frequency = <400000>; /* Fast mode */ + #address-cells = <1>; + #size-cells = <0>; + clocks = <&i2c_ser_clk>, <&i2c_clk>; + clock-names = "i2cclk", "apb_pclk"; + resets = <&reset 0 17>; + i2c-transfer-timeout-us = <10000>; + mobileye,olb = <&olb 4>; + }; + uart0: serial@800000 { compatible = "arm,pl011", "arm,primecell"; reg = <0 0x800000 0x0 0x1000>; -- 2.44.0 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [PATCH v2 10/11] MIPS: mobileye: eyeq5: add 5 I2C controller nodes 2024-02-29 18:10 ` [PATCH v2 10/11] MIPS: mobileye: eyeq5: add 5 I2C controller nodes Théo Lebrun @ 2024-02-29 21:09 ` Linus Walleij 0 siblings, 0 replies; 54+ messages in thread From: Linus Walleij @ 2024-02-29 21:09 UTC (permalink / raw) To: Théo Lebrun Cc: Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk On Thu, Feb 29, 2024 at 7:11 PM Théo Lebrun <theo.lebrun@bootlin.com> wrote: > Add the SoC I2C controller nodes to the platform devicetree. Use a > default bus frequency of 400kHz. They are AMBA devices that are matched > on PeriphID. > > Set transfer timeout to 10ms instead of Linux's default of 200ms. > > Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> Acked-by: Linus Walleij <linus.walleij@linaro.org> Yours, Linus Walleij ^ permalink raw reply [flat|nested] 54+ messages in thread
* [PATCH v2 11/11] MIPS: mobileye: eyeq5: add evaluation board I2C temp sensor 2024-02-29 18:10 [PATCH v2 00/11] Add Mobileye EyeQ5 support to the Nomadik I2C controller & use hrtimers for timeouts Théo Lebrun ` (9 preceding siblings ...) 2024-02-29 18:10 ` [PATCH v2 10/11] MIPS: mobileye: eyeq5: add 5 I2C controller nodes Théo Lebrun @ 2024-02-29 18:10 ` Théo Lebrun 2024-02-29 21:09 ` Linus Walleij 2024-03-06 1:49 ` [PATCH v2 00/11] Add Mobileye EyeQ5 support to the Nomadik I2C controller & use hrtimers for timeouts Andi Shyti 11 siblings, 1 reply; 54+ messages in thread From: Théo Lebrun @ 2024-02-29 18:10 UTC (permalink / raw) To: Linus Walleij, Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer Cc: linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Théo Lebrun Declare the temperature sensor on I2C bus 2. Its label is the schematics identifier. Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> --- arch/mips/boot/dts/mobileye/eyeq5-epm5.dts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/arch/mips/boot/dts/mobileye/eyeq5-epm5.dts b/arch/mips/boot/dts/mobileye/eyeq5-epm5.dts index 6898b2d8267d..9fc1a1b0a81b 100644 --- a/arch/mips/boot/dts/mobileye/eyeq5-epm5.dts +++ b/arch/mips/boot/dts/mobileye/eyeq5-epm5.dts @@ -21,3 +21,11 @@ memory@0 { <0x8 0x02000000 0x0 0x7E000000>; }; }; + +&i2c2 { + temperature-sensor@48 { + compatible = "ti,tmp112"; + reg = <0x48>; + label = "U60"; + }; +}; -- 2.44.0 ^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [PATCH v2 11/11] MIPS: mobileye: eyeq5: add evaluation board I2C temp sensor 2024-02-29 18:10 ` [PATCH v2 11/11] MIPS: mobileye: eyeq5: add evaluation board I2C temp sensor Théo Lebrun @ 2024-02-29 21:09 ` Linus Walleij 0 siblings, 0 replies; 54+ messages in thread From: Linus Walleij @ 2024-02-29 21:09 UTC (permalink / raw) To: Théo Lebrun Cc: Andi Shyti, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk On Thu, Feb 29, 2024 at 7:11 PM Théo Lebrun <theo.lebrun@bootlin.com> wrote: > Declare the temperature sensor on I2C bus 2. Its label is the schematics > identifier. > > Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> Acked-by: Linus Walleij <linus.walleij@linaro.org> Yours, Linus Walleij ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 00/11] Add Mobileye EyeQ5 support to the Nomadik I2C controller & use hrtimers for timeouts 2024-02-29 18:10 [PATCH v2 00/11] Add Mobileye EyeQ5 support to the Nomadik I2C controller & use hrtimers for timeouts Théo Lebrun ` (10 preceding siblings ...) 2024-02-29 18:10 ` [PATCH v2 11/11] MIPS: mobileye: eyeq5: add evaluation board I2C temp sensor Théo Lebrun @ 2024-03-06 1:49 ` Andi Shyti 2024-03-06 9:34 ` Théo Lebrun 11 siblings, 1 reply; 54+ messages in thread From: Andi Shyti @ 2024-03-06 1:49 UTC (permalink / raw) To: Théo Lebrun Cc: Linus Walleij, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Jean Delvare, Guenter Roeck, linux-hwmon Hi Theo, > Théo Lebrun (11): > dt-bindings: i2c: nomadik: add mobileye,eyeq5-i2c bindings and example > dt-bindings: hwmon: lm75: use common hwmon schema > i2c: nomadik: rename private struct pointers from dev to priv > i2c: nomadik: simplify IRQ masking logic > i2c: nomadik: use bitops helpers > i2c: nomadik: support short xfer timeouts using waitqueue & hrtimer > i2c: nomadik: replace jiffies by ktime for FIFO flushing timeout > i2c: nomadik: fetch i2c-transfer-timeout-us property from devicetree > i2c: nomadik: support Mobileye EyeQ5 I2C controller > MIPS: mobileye: eyeq5: add 5 I2C controller nodes > MIPS: mobileye: eyeq5: add evaluation board I2C temp sensor what's your plan for this series? If you extract into a separate series the refactoring patches that are not dependent on the bindings I could queue them up for the merge window. Andi ^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH v2 00/11] Add Mobileye EyeQ5 support to the Nomadik I2C controller & use hrtimers for timeouts 2024-03-06 1:49 ` [PATCH v2 00/11] Add Mobileye EyeQ5 support to the Nomadik I2C controller & use hrtimers for timeouts Andi Shyti @ 2024-03-06 9:34 ` Théo Lebrun 0 siblings, 0 replies; 54+ messages in thread From: Théo Lebrun @ 2024-03-06 9:34 UTC (permalink / raw) To: Andi Shyti Cc: Linus Walleij, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Thomas Bogendoerfer, linux-arm-kernel, linux-i2c, devicetree, linux-kernel, linux-mips, Gregory Clement, Vladimir Kondratiev, Thomas Petazzoni, Tawfik Bayouk, Jean Delvare, Guenter Roeck, linux-hwmon Hello Andi, On Wed Mar 6, 2024 at 2:49 AM CET, Andi Shyti wrote: > > Théo Lebrun (11): > > dt-bindings: i2c: nomadik: add mobileye,eyeq5-i2c bindings and example > > dt-bindings: hwmon: lm75: use common hwmon schema > > i2c: nomadik: rename private struct pointers from dev to priv > > i2c: nomadik: simplify IRQ masking logic > > i2c: nomadik: use bitops helpers > > i2c: nomadik: support short xfer timeouts using waitqueue & hrtimer > > i2c: nomadik: replace jiffies by ktime for FIFO flushing timeout > > i2c: nomadik: fetch i2c-transfer-timeout-us property from devicetree > > i2c: nomadik: support Mobileye EyeQ5 I2C controller > > MIPS: mobileye: eyeq5: add 5 I2C controller nodes > > MIPS: mobileye: eyeq5: add evaluation board I2C temp sensor > > what's your plan for this series? If you extract into a separate > series the refactoring patches that are not dependent on the > bindings I could queue them up for the merge window. V3 is ready and will be sent today. I think we can get trailers from dt-bindings maintainers as the discussion has been caried out on this revision. Am I being too optimistic of seeing this series queued before the merge window? Thanks Andi, -- Théo Lebrun, Bootlin Embedded Linux and Kernel engineering https://bootlin.com ^ permalink raw reply [flat|nested] 54+ messages in thread
end of thread, other threads:[~2024-03-06 9:34 UTC | newest] Thread overview: 54+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-02-29 18:10 [PATCH v2 00/11] Add Mobileye EyeQ5 support to the Nomadik I2C controller & use hrtimers for timeouts Théo Lebrun 2024-02-29 18:10 ` [PATCH v2 01/11] dt-bindings: i2c: nomadik: add mobileye,eyeq5-i2c bindings and example Théo Lebrun 2024-02-29 19:26 ` Rob Herring 2024-03-01 15:11 ` Rob Herring 2024-03-01 15:47 ` Théo Lebrun 2024-02-29 18:10 ` [PATCH v2 02/11] dt-bindings: hwmon: lm75: use common hwmon schema Théo Lebrun 2024-02-29 19:26 ` Rob Herring 2024-03-01 6:37 ` Krzysztof Kozlowski 2024-03-01 6:53 ` Guenter Roeck 2024-03-01 9:41 ` Théo Lebrun 2024-03-01 10:13 ` Krzysztof Kozlowski 2024-03-01 10:44 ` Théo Lebrun 2024-03-01 11:35 ` Krzysztof Kozlowski 2024-03-01 14:09 ` Théo Lebrun 2024-03-01 14:13 ` Krzysztof Kozlowski 2024-03-01 15:35 ` Rob Herring 2024-03-01 15:52 ` Théo Lebrun 2024-03-01 15:38 ` Rob Herring 2024-03-01 19:21 ` Guenter Roeck 2024-02-29 18:10 ` [PATCH v2 03/11] i2c: nomadik: rename private struct pointers from dev to priv Théo Lebrun 2024-03-02 0:16 ` [SPAM] " Andi Shyti 2024-03-04 9:13 ` Wolfram Sang 2024-02-29 18:10 ` [PATCH v2 04/11] i2c: nomadik: simplify IRQ masking logic Théo Lebrun 2024-03-02 0:39 ` [SPAM] " Andi Shyti 2024-03-04 9:46 ` Théo Lebrun 2024-02-29 18:10 ` [PATCH v2 05/11] i2c: nomadik: use bitops helpers Théo Lebrun 2024-03-02 1:31 ` Andi Shyti 2024-03-04 10:00 ` Théo Lebrun 2024-02-29 18:10 ` [PATCH v2 06/11] i2c: nomadik: support short xfer timeouts using waitqueue & hrtimer Théo Lebrun 2024-03-04 9:18 ` Wolfram Sang 2024-03-04 10:14 ` Théo Lebrun 2024-03-04 11:37 ` Wolfram Sang 2024-03-04 13:54 ` [SPAM] " Andi Shyti 2024-03-04 14:32 ` Théo Lebrun 2024-03-04 15:09 ` Andi Shyti 2024-02-29 18:10 ` [PATCH v2 07/11] i2c: nomadik: replace jiffies by ktime for FIFO flushing timeout Théo Lebrun 2024-03-04 9:23 ` Wolfram Sang 2024-03-04 13:55 ` Andi Shyti 2024-02-29 18:10 ` [PATCH v2 08/11] i2c: nomadik: fetch i2c-transfer-timeout-us property from devicetree Théo Lebrun 2024-02-29 21:04 ` Linus Walleij 2024-03-04 9:25 ` Wolfram Sang 2024-03-04 13:57 ` Andi Shyti 2024-02-29 18:10 ` [PATCH v2 09/11] i2c: nomadik: support Mobileye EyeQ5 I2C controller Théo Lebrun 2024-02-29 21:08 ` Linus Walleij 2024-03-04 9:27 ` Wolfram Sang 2024-03-04 10:25 ` Théo Lebrun 2024-03-04 14:08 ` Andi Shyti 2024-03-04 14:53 ` Théo Lebrun 2024-02-29 18:10 ` [PATCH v2 10/11] MIPS: mobileye: eyeq5: add 5 I2C controller nodes Théo Lebrun 2024-02-29 21:09 ` Linus Walleij 2024-02-29 18:10 ` [PATCH v2 11/11] MIPS: mobileye: eyeq5: add evaluation board I2C temp sensor Théo Lebrun 2024-02-29 21:09 ` Linus Walleij 2024-03-06 1:49 ` [PATCH v2 00/11] Add Mobileye EyeQ5 support to the Nomadik I2C controller & use hrtimers for timeouts Andi Shyti 2024-03-06 9:34 ` Théo Lebrun
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).