On 1/9/19 8:58 PM, tristram...@microchip.com wrote: >> 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.
Right, that's what happens here. > 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. Right, that's quite horrible. > 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. Let's not mix regmap and non-regmap accesses, that'd be a mess. Let's stick to one, regmap. > 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. You can just use regmap_*() accessors and regmap will deal with i2c/spi abstraction for you, that's the idea. -- Best regards, Marek Vasut