On Wed Aug 19, 2026 at 8:09 PM JST, Gary Guo wrote:
> Add a rule to allow creating `IoLoc` in `register!()` using an existing
> type and not create a bitfield. Add an example to demonstrate this for FIFO
> registers.
>
> This rule is also going to be used to create subregions for registers; the
> example of doing so will be added later when relative registers are
> removed.
>
> Signed-off-by: Gary Guo <[email protected]>

Reviewed-by: Alexandre Courbot <[email protected]>

> ---
>  rust/kernel/io/register.rs | 30 ++++++++++++++++
>  rust/macros/io/register.rs | 86 
> +++++++++++++++++++++++++++++++---------------
>  2 files changed, 89 insertions(+), 27 deletions(-)
>
> diff --git a/rust/kernel/io/register.rs b/rust/kernel/io/register.rs
> index f622057f7346..63c054162e54 100644
> --- a/rust/kernel/io/register.rs
> +++ b/rust/kernel/io/register.rs
> @@ -182,6 +182,23 @@ fn offset(self) -> usize {
>      }
>  }
>  
> +#[doc(hidden)]
> +pub struct OffsetLoc<Base: ?Sized, T>(usize, PhantomData<(T, Base)>);

A short comment (not doccomment) quickly explaining the purpose of this
type would be helpful to readers.

<...>
> diff --git a/rust/macros/io/register.rs b/rust/macros/io/register.rs
> index cb02e850b23f..0b4e0d1903dd 100644
> --- a/rust/macros/io/register.rs
> +++ b/rust/macros/io/register.rs
> @@ -14,9 +14,11 @@
>      bracketed,
>      parenthesized,
>      parse::Parse,
> +    parse_quote,
>      spanned::Spanned,
>      token,
>      Attribute,
> +    Error,
>      Expr,
>      Ident,
>      Path,
> @@ -49,11 +51,11 @@ struct Reg {
>      attrs: Vec<Attribute>,
>      vis: Visibility,
>      name: Ident,
> -    storage: Type,
> +    ty: Type,
>      array: Option<RegArrayDef>,
>      relative_base: Option<Path>,
>      offset: RegOffset,
> -    bitfield_args: Group,
> +    bitfield: Option<(Type, Group)>,
>  }
>  
>  impl Parse for Reg {
> @@ -61,11 +63,23 @@ fn parse(input: syn::parse::ParseStream<'_>) -> 
> Result<Self> {
>          let attrs = input.call(Attribute::parse_outer)?;
>          let vis = input.parse()?;
>          let name = input.parse()?;
> -        let storage = {
> +
> +        let lh = input.lookahead1();
> +        let mut bitfield_storage = None;

You can avoid using `mut` if you turn the next line into `let
(bitfield_storage, ty) = ...`. The final form of the patchset already
uses a tuple due to `unique` anyway.

Reply via email to