[U-Boot] [PATCH 1/2] MIPS: add clrbits and setbits and add phy_to_bus support.

Daniel Schwierzeck daniel.schwierzeck at gmail.com
Thu Aug 20 14:06:39 CEST 2015


2015-08-19 20:19 GMT+02:00 Govindraj Raja <govindraj.raja at imgtec.com>:
> From: Govindraj Raja <Govindraj.Raja at imgtec.com>
>
> usb stack utilizes the clr/set_bits macros
> also usb stack needs phy_to_bus/bus_to_phys functions.
> Thus adding these macro and functions for mips platform.
>
> This makes usb stack usable with mips platform.
> Also fixes a checkpatch warning with virt_to_phys
> forward declaration.
>
> Signed-off-by: Govindraj Raja <govindraj.raja at imgtec.com>
> ---
>  arch/mips/include/asm/io.h | 71 +++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 70 insertions(+), 1 deletion(-)
>
> diff --git a/arch/mips/include/asm/io.h b/arch/mips/include/asm/io.h
> index a7ab087..8dc521c 100644
> --- a/arch/mips/include/asm/io.h
> +++ b/arch/mips/include/asm/io.h
> @@ -117,7 +117,7 @@ static inline void set_io_port_base(unsigned long base)
>   * Change virtual addresses to physical addresses and vv.
>   * These are trivial on the 1:1 Linux/MIPS mapping
>   */
> -static inline phys_addr_t virt_to_phys(volatile void * address)
> +static inline phys_addr_t virt_to_phys(volatile void *address)

please do not make cosmetic fixes and code changes in the same commit.
Because this file
is imported from Linux kernel, you could ignore this style error until
we do a resync with the
current kernel sources.

>  {
>  #ifndef CONFIG_64BIT
>         return CPHYSADDR(address);
> @@ -504,4 +504,73 @@ static inline void unmap_physmem(void *vaddr, unsigned long flags)
>
>  }
>
> +#define out_arch(type, endian, a, v)   __raw_write##type(cpu_to_##endian(v), a)
> +#define in_arch(type, endian, a)       endian##_to_cpu(__raw_read##type(a))
> +
> +#define out_le32(a, v) out_arch(l, le32, a, v)
> +#define out_le16(a, v) out_arch(w, le16, a, v)
> +
> +#define in_le32(a)     in_arch(l, le32, a)
> +#define in_le16(a)     in_arch(w, le16, a)
> +
> +#define out_be32(a, v) out_arch(l, be32, a, v)
> +#define out_be16(a, v) out_arch(w, be16, a, v)
> +
> +#define in_be32(a)     in_arch(l, be32, a)
> +#define in_be16(a)     in_arch(w, be16, a)
> +
> +#define out_8(a, v)    __raw_writeb(v, a)
> +#define in_8(a)                __raw_readb(a)
> +
> +/*
> + * Clear and set bits in one shot. These macros can be used to clear and
> + * set multiple bits in a register using a single call. These macros can
> + * also be used to set a multiple-bit bit pattern using a mask, by
> + * specifying the mask in the 'clear' parameter and the new bit pattern
> + * in the 'set' parameter.
> + */
> +
> +#define clrbits(type, addr, clear) \
> +       out_##type((addr), in_##type(addr) & ~(clear))
> +
> +#define setbits(type, addr, set) \
> +       out_##type((addr), in_##type(addr) | (set))
> +
> +#define clrsetbits(type, addr, clear, set) \
> +       out_##type((addr), (in_##type(addr) & ~(clear)) | (set))
> +
> +#define clrbits_be32(addr, clear) clrbits(be32, addr, clear)
> +#define setbits_be32(addr, set) setbits(be32, addr, set)
> +#define clrsetbits_be32(addr, clear, set) clrsetbits(be32, addr, clear, set)
> +
> +#define clrbits_le32(addr, clear) clrbits(le32, addr, clear)
> +#define setbits_le32(addr, set) setbits(le32, addr, set)
> +#define clrsetbits_le32(addr, clear, set) clrsetbits(le32, addr, clear, set)
> +
> +#define clrbits_be16(addr, clear) clrbits(be16, addr, clear)
> +#define setbits_be16(addr, set) setbits(be16, addr, set)
> +#define clrsetbits_be16(addr, clear, set) clrsetbits(be16, addr, clear, set)
> +
> +#define clrbits_le16(addr, clear) clrbits(le16, addr, clear)
> +#define setbits_le16(addr, set) setbits(le16, addr, set)
> +#define clrsetbits_le16(addr, clear, set) clrsetbits(le16, addr, clear, set)
> +
> +#define clrbits_8(addr, clear) clrbits(8, addr, clear)
> +#define setbits_8(addr, set) setbits(8, addr, set)
> +
> +#ifdef CONFIG_PHYS_TO_BUS
> +
> +extern inline unsigned long phys_to_bus(unsigned long phys)
> +{
> +       return (unsigned long)virt_to_phys((void *)phys);
> +}
> +
> +extern inline unsigned long bus_to_phys(unsigned long bus)
> +{
> +       return (unsigned long)phys_to_virt(bus);
> +}
> +
> +#endif

could you move those two functions to arch/mips/lib/io.c and mark it
with __weak?
Funtions declared with "extern inline" seems to have issues with gcc-5.x.
Also marking them with __weak would one allow to create SoC specific
implementations if needed.

> +
> +
>  #endif /* _ASM_IO_H */
> --
> 1.9.1
>

-- 
- Daniel


More information about the U-Boot mailing list