Linux clock framework development
 help / color / mirror / Atom feed
From: dongxuyang@eswincomputing.com
To: mturquette@baylibre.com, sboyd@kernel.org, robh@kernel.org,
	krzk+dt@kernel.org, conor+dt@kernel.org,
	linux-clk@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, p.zabel@pengutronix.de,
	huangyifeng@eswincomputing.com, dongxuyang@eswincomputing.com,
	benoit.monin@bootlin.com, bmasney@redhat.com
Cc: ningyu@eswincomputing.com, linmin@eswincomputing.com,
	pinkesh.vaghela@einfochips.com
Subject: [PATCH v4 0/3] Add driver support for ESWIN EIC7700 HSP clock and reset generator
Date: Tue, 12 May 2026 10:04:32 +0800	[thread overview]
Message-ID: <20260512020432.671-1-dongxuyang@eswincomputing.com> (raw)

From: Xuyang Dong <dongxuyang@eswincomputing.com>

Add support for the ESWIN EIC7700 HSP (high-speed peripherals). The drivers
provide basic functionality to manage and control the clock and reset
signals for EIC7700 HSP, including mmc, USB, ethernet, SATA and DMAC.

The clock and reset registers are mapped to overlapping I/O address ranges.
This causes a resource conflict when two drivers attempt to request the
same region. Use the auxiliary device framework: the main driver
allocates the shared register region and passes it to auxiliary
devices, avoiding resource contention and duplicate remapping.

Features:
Implements support for the ESWIN EIC7700 HSP clock and reset controller.
Provide API to manage clock and reset signals for the EIC7700 HSP.

Supported chips:
ESWIN EIC7700 series SoC.

Test:
Test this patch on the Sifive HiFive Premier P550 (which used the EIC7700
SoC), include USB and other peripherals. All the drivers of these modules
use the clock module and reset module.

Updates:
  Changes in v4:
  - Clock driver:
    - Remove "Reviewed-by: Benoît Monin <benoit.monin@bootlin.com>" and
      "Reviewed-by: Brian Masney <bmasney@redhat.com>", because the clock
      driver has been updated.
    - Remove inclusion of io.h.
    - Add struct regmap to eic7700_hsp_clk_gate.
      Replace 'void __iomem *reg' with 'unsigned int reg'.
      Replace 'void __iomem *ref_reg' with 'unsigned int ref_reg'.
      Replace long with int for 'offset' and 'ref_offset'.
      Remove 'spinlock_t *lock'.
      Apply the same changes to hsp_clk_register_gate().
    - Remove the structure eic7700_hsp_regmap_lock, and the functions
      eic7700_hsp_regmap_lock() and eic7700_hsp_regmap_unlock().
    - Remove the 'guard(spinlock_irqsave)(gate->lock)' in
      hsp_clk_gate_endisable().
    - Replace readl() and writel() with regmap_assign_bits() in
      hsp_clk_gate_endisable().
    - Change the parameter enable from int to bool.
    - Replace readl() with regmap_read() in hsp_clk_gate_is_enabled().
    - Remove the lock_ctx variable.
    - Move eic7700_hsp_regmap_config from inside the probe function to global
      scope.
      Remove '.lock', '.unlock' and 'lock_arg'.
      Add '.fast_io = true' and '.use_raw_spinlock = true'.
  - Reset driver:
    - Add "Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>" for reset.
    - Drop the temporary variable, just return regmap_assign_bits(...) directly.
    - Replace -EINVAL with -ENODEV for dev_get_regmap() check.
    - Drop the '_dt'.

  - Link to v3: https://lore.kernel.org/all/20260423090904.2108-1-dongxuyang@eswincomputing.com/

  Changes in v3:
  - Bindings:
    - Added "Acked-by: Conor Dooley <conor.dooley@microchip.com>" for bindings.
  - Clock driver:
    - Remove 'gate_flags'.
    - Add __acquires for eic7700_hsp_regmap_lock() and add __releases for
      eic7700_hsp_regmap_unlock().
    - Move writel(USB_REF_XTAL24M, gate->ref_reg) into enable. Because this
      is only used for USB gate clock on the enable path. And modify the
      comments.
    - Simplify to: 'return !!(readl(gate->reg) & BIT(gate->bit_idx));'.
    - Drop const from eic7700_hsp_regmap_config.
    - Declare eic7700_hsp_regmap_config as a regular variable at the top.

  - Link to v2: https://lore.kernel.org/all/20260420093929.1895-1-dongxuyang@eswincomputing.com/

  Changes in v2:
  - Bindings:
    - Remove "hsp_" from clock-names.
    - Replace "eswin,eic7700-clock.yaml" and "eswin,eic7700-hspcrg.yaml" with
      "eswin,eic7700*".
    - Replace "eswin,eic7700-clock.h" and "eswin,eic7700-hspcrg.h" with
      "eswin,eic7700*".
  - Clock driver:
    - Use guard(spinlock_irqsave)(gate->lock) instead of spin_lock_irqsave()
      and remove spin_unlock_irqrestore().
    - Remove the newline in function hsp_clk_gate_is_enabled().
    - Use struct clk_init_data init = {}.
    - Replace 'static struct clk_parent_data' with
      'static const struct clk_parent_data'.
    - Change '.fw_name' to '.index', because the function
      eswin_clk_register_fixed_factor() uses .index.
    - The structures of clocks should use static struct. When registering a clock,
      the 'hw' field in the structure will be assigned.
    - Remove __force.
    - Create the regmap in the clock driver and remove (__force void*)data->base.
      The reset driver uses dev_get_regmap() to get the regmap from the clock.
    - Move 'const struct regmap_config eic7700_hsp_regmap_config' from reset
      driver to clock driver.
    - The USB clock gate (hsp_clk_gate_endisable) and the reset driver both
      perform read-modify-write cycles on registers 0x800 and 0x900. Use
      custom regmap lock callbacks so that regmap operations hold data->lock
      with IRQs disabled, the same lock the clock gate path uses, preventing
      concurrent RMW races on those shared registers.
    - Change to 'ret = eswin_clk_register_fixed_factor(dev, eic7700_hsp_factor_clks,'.
      The next line will be over 80 characters and under 100 characters.
  - Reset driver:
    - Remove 'depends on COMMON_CLK_EIC7700_HSP' and 'default COMMON_CLK_EIC7700_HSP'.
    - Use regmap_assign_bits() in assert and deassert functions.
    - Remove eic7700_hsp_reset_reset().
    - The clock driver creates the regmap, and the reset driver uses dev_get_regmap().
    - Remove of_reset_n_cells.

  - Link to v1: https://lore.kernel.org/all/20260403093459.612-1-dongxuyang@eswincomputing.com/

Xuyang Dong (3):
  dt-bindings: clock: Add ESWIN eic7700 HSP clock and reset generator
  clk: eswin: Add eic7700 HSP clock driver
  reset: eswin: Add eic7700 HSP reset driver

 .../bindings/clock/eswin,eic7700-hspcrg.yaml  |  63 ++++
 MAINTAINERS                                   |   5 +-
 drivers/clk/eswin/Kconfig                     |  12 +
 drivers/clk/eswin/Makefile                    |   1 +
 drivers/clk/eswin/clk-eic7700-hsp.c           | 338 ++++++++++++++++++
 drivers/reset/Kconfig                         |  11 +
 drivers/reset/Makefile                        |   1 +
 drivers/reset/reset-eic7700-hsp.c             | 112 ++++++
 .../dt-bindings/clock/eswin,eic7700-hspcrg.h  |  33 ++
 .../dt-bindings/reset/eswin,eic7700-hspcrg.h  |  21 ++
 10 files changed, 595 insertions(+), 2 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/clock/eswin,eic7700-hspcrg.yaml
 create mode 100644 drivers/clk/eswin/clk-eic7700-hsp.c
 create mode 100644 drivers/reset/reset-eic7700-hsp.c
 create mode 100644 include/dt-bindings/clock/eswin,eic7700-hspcrg.h
 create mode 100644 include/dt-bindings/reset/eswin,eic7700-hspcrg.h

--
2.34.1


             reply	other threads:[~2026-05-12  2:05 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-12  2:04 dongxuyang [this message]
2026-05-12  2:05 ` [PATCH v4 1/3] dt-bindings: clock: Add ESWIN eic7700 HSP clock and reset generator dongxuyang
2026-05-12 15:48   ` Brian Masney
2026-05-12 16:40     ` Conor Dooley
2026-05-12 17:27       ` Brian Masney
2026-05-12  2:07 ` [PATCH v4 2/3] clk: eswin: Add eic7700 HSP clock driver Xuyang Dong
2026-05-12 15:45   ` Brian Masney
2026-05-12  2:08 ` [PATCH v4 3/3] reset: eswin: Add eic7700 HSP reset driver dongxuyang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260512020432.671-1-dongxuyang@eswincomputing.com \
    --to=dongxuyang@eswincomputing.com \
    --cc=benoit.monin@bootlin.com \
    --cc=bmasney@redhat.com \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=huangyifeng@eswincomputing.com \
    --cc=krzk+dt@kernel.org \
    --cc=linmin@eswincomputing.com \
    --cc=linux-clk@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mturquette@baylibre.com \
    --cc=ningyu@eswincomputing.com \
    --cc=p.zabel@pengutronix.de \
    --cc=pinkesh.vaghela@einfochips.com \
    --cc=robh@kernel.org \
    --cc=sboyd@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox