Lines Matching refs:hw

43 static int altr_spi_writel(struct altera_spi *hw, unsigned int reg,
48 ret = regmap_write(hw->regmap, hw->regoff + reg, val);
50 dev_err(hw->dev, "fail to write reg 0x%x val 0x%x: %d\n",
56 static int altr_spi_readl(struct altera_spi *hw, unsigned int reg,
61 ret = regmap_read(hw->regmap, hw->regoff + reg, val);
63 dev_err(hw->dev, "fail to read reg 0x%x: %d\n", reg, ret);
75 struct altera_spi *hw = altera_spi_to_hw(spi);
78 hw->imr &= ~ALTERA_SPI_CONTROL_SSO_MSK;
79 altr_spi_writel(hw, ALTERA_SPI_CONTROL, hw->imr);
80 altr_spi_writel(hw, ALTERA_SPI_TARGET_SEL, 0);
82 altr_spi_writel(hw, ALTERA_SPI_TARGET_SEL,
84 hw->imr |= ALTERA_SPI_CONTROL_SSO_MSK;
85 altr_spi_writel(hw, ALTERA_SPI_CONTROL, hw->imr);
89 static void altera_spi_tx_word(struct altera_spi *hw)
93 if (hw->tx) {
94 switch (hw->bytes_per_word) {
96 txd = hw->tx[hw->count];
99 txd = (hw->tx[hw->count * 2]
100 | (hw->tx[hw->count * 2 + 1] << 8));
103 txd = (hw->tx[hw->count * 4]
104 | (hw->tx[hw->count * 4 + 1] << 8)
105 | (hw->tx[hw->count * 4 + 2] << 16)
106 | (hw->tx[hw->count * 4 + 3] << 24));
112 altr_spi_writel(hw, ALTERA_SPI_TXDATA, txd);
115 static void altera_spi_rx_word(struct altera_spi *hw)
119 altr_spi_readl(hw, ALTERA_SPI_RXDATA, &rxd);
120 if (hw->rx) {
121 switch (hw->bytes_per_word) {
123 hw->rx[hw->count] = rxd;
126 hw->rx[hw->count * 2] = rxd;
127 hw->rx[hw->count * 2 + 1] = rxd >> 8;
130 hw->rx[hw->count * 4] = rxd;
131 hw->rx[hw->count * 4 + 1] = rxd >> 8;
132 hw->rx[hw->count * 4 + 2] = rxd >> 16;
133 hw->rx[hw->count * 4 + 3] = rxd >> 24;
139 hw->count++;
145 struct altera_spi *hw = spi_controller_get_devdata(host);
148 hw->tx = t->tx_buf;
149 hw->rx = t->rx_buf;
150 hw->count = 0;
151 hw->bytes_per_word = DIV_ROUND_UP(t->bits_per_word, 8);
152 hw->len = t->len / hw->bytes_per_word;
154 if (hw->irq >= 0) {
156 hw->imr |= ALTERA_SPI_CONTROL_IRRDY_MSK;
157 altr_spi_writel(hw, ALTERA_SPI_CONTROL, hw->imr);
160 altera_spi_tx_word(hw);
165 while (hw->count < hw->len) {
166 altera_spi_tx_word(hw);
169 altr_spi_readl(hw, ALTERA_SPI_STATUS, &val);
176 altera_spi_rx_word(hw);
186 struct altera_spi *hw = spi_controller_get_devdata(host);
188 altera_spi_rx_word(hw);
190 if (hw->count < hw->len) {
191 altera_spi_tx_word(hw);
194 hw->imr &= ~ALTERA_SPI_CONTROL_IRRDY_MSK;
195 altr_spi_writel(hw, ALTERA_SPI_CONTROL, hw->imr);
206 struct altera_spi *hw = spi_controller_get_devdata(host);
213 hw->imr = 0; /* disable spi interrupts */
214 altr_spi_writel(hw, ALTERA_SPI_CONTROL, hw->imr);
215 altr_spi_writel(hw, ALTERA_SPI_STATUS, 0); /* clear status reg */
216 altr_spi_readl(hw, ALTERA_SPI_STATUS, &val);
218 altr_spi_readl(hw, ALTERA_SPI_RXDATA, &val); /* flush rxdata */