On 1/9/19 8:08 PM, tristram...@microchip.com wrote: >>>>> + { \ >>>>> + .val_bits = (width), \ >>>>> + .reg_stride = (width) / 8, \ >>>>> + .reg_bits = (regbits) + (regalign), \ >>>>> + .pad_bits = (regpad), \ >>>>> + .max_register = 0xF00, \ >>>>> + .cache_type = REGCACHE_NONE, >>>>> \ >>>>> + .read_flag_mask = \ >>>>> + KSZ_SPI_OP_FLAG_MASK(KSZ_SPI_OP_RD, regbits, >>>>> regpad), \ >>>>> + .write_flag_mask = \ >>>>> + KSZ_SPI_OP_FLAG_MASK(KSZ_SPI_OP_WR, regbits, >>>>> regpad), \ >>>>> + .reg_format_endian = REGMAP_ENDIAN_BIG, >>>>> \ >>>>> + .val_format_endian = REGMAP_ENDIAN_BIG >>>>> \ >>>>> + } >>>> >>>> max_registers for KSZ9477 should be 0x8000. >>>> >>>> I found that the SPI access works with these settings: >>>> reg_bits = 32 - 5, val_bits = 8, pad_bits = 5, read_flag_mask = >> KS_SPIOP_RD << 5. >>> >>> This is wrong, val_bits must match the register width (8 for 8bit >>> regmap, 16 for 16bit regmap etc). Anyway, can you prepare a short diff >>> to give me an idea what needs to be changed ? >>> >> >> Bump ? >> > > 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.
Can you prepare a patch ? One which can apply on top of this series , so we get the authorship information and stuff ? Also, can you test this on net-next or next ? -- Best regards, Marek Vasut