> This is the regmap_config I used in Linux 4.9:
> 
>       .reg_bits               = SPI_REGMAP_REG,
>       .val_bits               = SPI_REGMAP_VAL,
>       .pad_bits               = SPI_REGMAP_PAD,
>       .read_flag_mask = KS_SPIOP_RD << SPI_REGMAP_MASK_S,
>       .write_flag_mask        = KS_SPIOP_WR << SPI_REGMAP_MASK_S,
>       .reg_format_endian      = REGMAP_ENDIAN_BIG,
>       .val_format_endian      = REGMAP_ENDIAN_BIG,
> 
> For KSZ9477:
> 
> SPI_CMD_LEN           4
> SPI_REGMAP_PAD        SPI_TURNAROUND_SHIFT
> SPI_REGMAP_VAL        8
> SPI_REGMAP_REG        \
>       (SPI_CMD_LEN * SPI_REGMAP_VAL - SPI_TURNAROUND_SHIFT)
> SPI_REGMAP_MASK_S     \
>       (SPI_ADDR_SHIFT + SPI_TURNAROUND_SHIFT - \
>       (SPI_CMD_LEN * SPI_REGMAP_VAL - 8))
> 
> For KSZ8795:
> 
> SPI_CMD_LEN           2
> SPI_REGMAP_PAD        SPI_TURNAROUND_S
> SPI_REGMAP_VAL        8
> SPI_REGMAP_REG        \
>       (SPI_CMD_LEN * SPI_REGMAP_VAL - SPI_TURNAROUND_S)
> SPI_REGMAP_MASK_S     \
>       (SPI_ADDR_S + SPI_TURNAROUND_S - \
>       (SPI_CMD_LEN * SPI_REGMAP_VAL - 8))
> 
> So the differences between KSZ9477 and KSZ8795 are SPI_CMD_LEN,
> SPI_ADDR_S, and SPI_TURNAROUND_S.
> 
> KSZ9477:
> 
> .reg_bits = 32 - 5 = 27
> .val_bits = 8
> .pad_bits = 5
> .read_flag_mask = KS_SPIOP_RD << 5,
> 
> KSZ8795:
> 
> .reg_bits = 16 - 1 = 15
> .val_bits = 8
> .pad_bits = 1
> .read_flag_mask = KS_SPIOP_RD << 5,
> 
> The regmap.c code uses reg_bits + reg_shift (which comes from pad_bits) to
> decide whether the register space is 16-bit or 32-bit.  The value space is
> always 8-bit.
> 
> The shift for _flag_mask turns out to be the same for both KSZ9477 and
> KSZ8795.

I just looked at your regmap code and you use 3 regmap pointers for specific 
8-bit, 16-bit, and 32-bit accesses.  The switch access is always 8-bit.  It has 
automatic register increment so that you can access arbitrary length of 
registers.  The use of 16-bit and 32-bit accesses makes access efficient if it 
makes sense.

Most older switches define registers in 8-bit.  Exceptions are the default VID 
and indirect access.

A specific switch mostly defines registers in 16-bit because it shares the core 
design with an Ethernet controller.

KSZ9477 is the newer designed switch and it gets some designs from older 
switches and that is why it has a mix of 8-bit, 16-bit, and 32-bit register 
definitions.

In my code I just use regmap_bulk_read and regmap_bulk_write and still use the 
old spi access functions for specific 8-bit, 16-bit, and 32-bit accesses.

We can combine the logic of ksz_spi_read8 and others into ksz_read8 and so they 
can be used for both SPI and I2C accesses.

Reply via email to