Lines Matching defs:ms

87 	int (*state)(int irq, struct mpc52xx_spi *ms, u8 status, u8 data);
100 static void mpc52xx_spi_chipsel(struct mpc52xx_spi *ms, int value)
104 if (ms->gpio_cs_count > 0) {
105 cs = spi_get_chipselect(ms->message->spi, 0);
106 gpiod_set_value(ms->gpio_cs[cs], value);
108 out_8(ms->regs + SPI_PORTDATA, value ? 0 : 0x08);
117 static void mpc52xx_spi_start_transfer(struct mpc52xx_spi *ms)
119 ms->rx_buf = ms->transfer->rx_buf;
120 ms->tx_buf = ms->transfer->tx_buf;
121 ms->len = ms->transfer->len;
124 if (ms->cs_change)
125 mpc52xx_spi_chipsel(ms, 1);
126 ms->cs_change = ms->transfer->cs_change;
129 ms->wcol_tx_timestamp = mftb();
130 if (ms->tx_buf)
131 out_8(ms->regs + SPI_DATA, *ms->tx_buf++);
133 out_8(ms->regs + SPI_DATA, 0);
137 static int mpc52xx_spi_fsmstate_transfer(int irq, struct mpc52xx_spi *ms,
139 static int mpc52xx_spi_fsmstate_wait(int irq, struct mpc52xx_spi *ms,
149 mpc52xx_spi_fsmstate_idle(int irq, struct mpc52xx_spi *ms, u8 status, u8 data)
156 dev_err(&ms->host->dev, "spurious irq, status=0x%.2x\n",
160 if (list_empty(&ms->queue))
164 ms->message = list_first_entry(&ms->queue, struct spi_message, queue);
165 list_del_init(&ms->message->queue);
169 spi = ms->message->spi;
176 out_8(ms->regs + SPI_CTRL1, ctrl1);
181 sppr = ((ms->ipb_freq / ms->message->spi->max_speed_hz) + 1) >> 1;
195 out_8(ms->regs + SPI_BRR, sppr << 4 | spr); /* Set speed */
197 ms->cs_change = 1;
198 ms->transfer = container_of(ms->message->transfers.next,
201 mpc52xx_spi_start_transfer(ms);
202 ms->state = mpc52xx_spi_fsmstate_transfer;
215 static int mpc52xx_spi_fsmstate_transfer(int irq, struct mpc52xx_spi *ms,
219 return ms->irq0 ? FSM_STOP : FSM_POLL;
229 ms->wcol_count++;
230 ms->wcol_ticks += mftb() - ms->wcol_tx_timestamp;
231 ms->wcol_tx_timestamp = mftb();
233 if (ms->tx_buf)
234 data = *(ms->tx_buf - 1);
235 out_8(ms->regs + SPI_DATA, data); /* try again */
238 ms->modf_count++;
239 dev_err(&ms->host->dev, "mode fault\n");
240 mpc52xx_spi_chipsel(ms, 0);
241 ms->message->status = -EIO;
242 if (ms->message->complete)
243 ms->message->complete(ms->message->context);
244 ms->state = mpc52xx_spi_fsmstate_idle;
249 ms->byte_count++;
250 if (ms->rx_buf)
251 *ms->rx_buf++ = data;
254 ms->len--;
255 if (ms->len == 0) {
256 ms->timestamp = mftb();
257 if (ms->transfer->delay.unit == SPI_DELAY_UNIT_USECS)
258 ms->timestamp += ms->transfer->delay.value *
260 ms->state = mpc52xx_spi_fsmstate_wait;
265 ms->wcol_tx_timestamp = mftb();
266 if (ms->tx_buf)
267 out_8(ms->regs + SPI_DATA, *ms->tx_buf++);
269 out_8(ms->regs + SPI_DATA, 0);
281 mpc52xx_spi_fsmstate_wait(int irq, struct mpc52xx_spi *ms, u8 status, u8 data)
284 dev_err(&ms->host->dev, "spurious irq, status=0x%.2x\n",
287 if (((int)mftb()) - ms->timestamp < 0)
290 ms->message->actual_length += ms->transfer->len;
295 if (ms->transfer->transfer_list.next == &ms->message->transfers) {
296 ms->msg_count++;
297 mpc52xx_spi_chipsel(ms, 0);
298 ms->message->status = 0;
299 if (ms->message->complete)
300 ms->message->complete(ms->message->context);
301 ms->state = mpc52xx_spi_fsmstate_idle;
307 if (ms->cs_change)
308 mpc52xx_spi_chipsel(ms, 0);
310 ms->transfer = container_of(ms->transfer->transfer_list.next,
312 mpc52xx_spi_start_transfer(ms);
313 ms->state = mpc52xx_spi_fsmstate_transfer;
320 * @ms: pointer to mpc52xx_spi driver data
322 static void mpc52xx_spi_fsm_process(int irq, struct mpc52xx_spi *ms)
330 status = in_8(ms->regs + SPI_STATUS);
331 data = in_8(ms->regs + SPI_DATA);
332 rc = ms->state(irq, ms, status, data);
336 schedule_work(&ms->work);
344 struct mpc52xx_spi *ms = _ms;
345 spin_lock(&ms->lock);
346 mpc52xx_spi_fsm_process(irq, ms);
347 spin_unlock(&ms->lock);
356 struct mpc52xx_spi *ms = container_of(work, struct mpc52xx_spi, work);
359 spin_lock_irqsave(&ms->lock, flags);
360 mpc52xx_spi_fsm_process(0, ms);
361 spin_unlock_irqrestore(&ms->lock, flags);
370 struct mpc52xx_spi *ms = spi_controller_get_devdata(spi->controller);
376 spin_lock_irqsave(&ms->lock, flags);
377 list_add_tail(&m->queue, &ms->queue);
378 spin_unlock_irqrestore(&ms->lock, flags);
379 schedule_work(&ms->work);
390 struct mpc52xx_spi *ms;
424 host = spi_alloc_host(&op->dev, sizeof(*ms));
437 ms = spi_controller_get_devdata(host);
438 ms->host = host;
439 ms->regs = regs;
440 ms->irq0 = irq_of_parse_and_map(op->dev.of_node, 0);
441 ms->irq1 = irq_of_parse_and_map(op->dev.of_node, 1);
442 ms->state = mpc52xx_spi_fsmstate_idle;
443 ms->ipb_freq = mpc5xxx_get_bus_frequency(&op->dev);
444 ms->gpio_cs_count = gpiod_count(&op->dev, NULL);
445 if (ms->gpio_cs_count > 0) {
446 host->num_chipselect = ms->gpio_cs_count;
447 ms->gpio_cs = kmalloc_array(ms->gpio_cs_count,
448 sizeof(*ms->gpio_cs),
450 if (!ms->gpio_cs) {
455 for (i = 0; i < ms->gpio_cs_count; i++) {
466 ms->gpio_cs[i] = gpio_cs;
470 spin_lock_init(&ms->lock);
471 INIT_LIST_HEAD(&ms->queue);
472 INIT_WORK(&ms->work, mpc52xx_spi_wq);
475 if (ms->irq0 && ms->irq1) {
476 rc = request_irq(ms->irq0, mpc52xx_spi_irq, 0,
477 "mpc5200-spi-modf", ms);
478 rc |= request_irq(ms->irq1, mpc52xx_spi_irq, 0,
479 "mpc5200-spi-spif", ms);
481 free_irq(ms->irq0, ms);
482 free_irq(ms->irq1, ms);
483 ms->irq0 = ms->irq1 = 0;
487 ms->irq0 = ms->irq1 = 0;
490 if (!ms->irq0)
498 dev_info(&ms->host->dev, "registered MPC5200 SPI bus\n");
503 dev_err(&ms->host->dev, "initialization failed\n");
506 gpiod_put(ms->gpio_cs[i]);
508 kfree(ms->gpio_cs);
520 struct mpc52xx_spi *ms = spi_controller_get_devdata(host);
523 free_irq(ms->irq0, ms);
524 free_irq(ms->irq1, ms);
526 for (i = 0; i < ms->gpio_cs_count; i++)
527 gpiod_put(ms->gpio_cs[i]);
529 kfree(ms->gpio_cs);
531 iounmap(ms->regs);