mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-11 07:39:47 +00:00
spi_mpc83xx: split mpc83xx_spi_work() into two routines
mpc83xx_spi_work() is quite large, with up to five indentation levels and is quite difficult to read. So, split the function in two parts: 1. mpc83xx_spi_work() now only traverse queued spi messages; 2. mpc83xx_spi_do_one_msg() only manages single messages. There should be no functional changes. Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com> Cc: Kumar Gala <galak@gate.crashing.org> Cc: David Brownell <david-b@pacbell.net> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
9effb959de
commit
b9b9af11fe
@ -350,71 +350,76 @@ static int mpc83xx_spi_bufs(struct spi_device *spi, struct spi_transfer *t)
|
|||||||
return mpc83xx_spi->count;
|
return mpc83xx_spi->count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void mpc83xx_spi_do_one_msg(struct spi_message *m)
|
||||||
|
{
|
||||||
|
struct spi_device *spi = m->spi;
|
||||||
|
struct spi_transfer *t;
|
||||||
|
unsigned int cs_change;
|
||||||
|
const int nsecs = 50;
|
||||||
|
int status;
|
||||||
|
|
||||||
|
cs_change = 1;
|
||||||
|
status = 0;
|
||||||
|
list_for_each_entry(t, &m->transfers, transfer_list) {
|
||||||
|
if (t->bits_per_word || t->speed_hz) {
|
||||||
|
/* Don't allow changes if CS is active */
|
||||||
|
status = -EINVAL;
|
||||||
|
|
||||||
|
if (cs_change)
|
||||||
|
status = mpc83xx_spi_setup_transfer(spi, t);
|
||||||
|
if (status < 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cs_change) {
|
||||||
|
mpc83xx_spi_chipselect(spi, BITBANG_CS_ACTIVE);
|
||||||
|
ndelay(nsecs);
|
||||||
|
}
|
||||||
|
cs_change = t->cs_change;
|
||||||
|
if (t->len)
|
||||||
|
status = mpc83xx_spi_bufs(spi, t);
|
||||||
|
if (status) {
|
||||||
|
status = -EMSGSIZE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
m->actual_length += t->len;
|
||||||
|
|
||||||
|
if (t->delay_usecs)
|
||||||
|
udelay(t->delay_usecs);
|
||||||
|
|
||||||
|
if (cs_change) {
|
||||||
|
ndelay(nsecs);
|
||||||
|
mpc83xx_spi_chipselect(spi, BITBANG_CS_INACTIVE);
|
||||||
|
ndelay(nsecs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m->status = status;
|
||||||
|
m->complete(m->context);
|
||||||
|
|
||||||
|
if (status || !cs_change) {
|
||||||
|
ndelay(nsecs);
|
||||||
|
mpc83xx_spi_chipselect(spi, BITBANG_CS_INACTIVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
mpc83xx_spi_setup_transfer(spi, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static void mpc83xx_spi_work(struct work_struct *work)
|
static void mpc83xx_spi_work(struct work_struct *work)
|
||||||
{
|
{
|
||||||
struct mpc83xx_spi *mpc83xx_spi =
|
struct mpc83xx_spi *mpc83xx_spi = container_of(work, struct mpc83xx_spi,
|
||||||
container_of(work, struct mpc83xx_spi, work);
|
work);
|
||||||
|
|
||||||
spin_lock_irq(&mpc83xx_spi->lock);
|
spin_lock_irq(&mpc83xx_spi->lock);
|
||||||
mpc83xx_spi->busy = 1;
|
mpc83xx_spi->busy = 1;
|
||||||
while (!list_empty(&mpc83xx_spi->queue)) {
|
while (!list_empty(&mpc83xx_spi->queue)) {
|
||||||
struct spi_message *m;
|
struct spi_message *m = container_of(mpc83xx_spi->queue.next,
|
||||||
struct spi_device *spi;
|
struct spi_message, queue);
|
||||||
struct spi_transfer *t = NULL;
|
|
||||||
unsigned cs_change;
|
|
||||||
int status, nsecs = 50;
|
|
||||||
|
|
||||||
m = container_of(mpc83xx_spi->queue.next,
|
|
||||||
struct spi_message, queue);
|
|
||||||
list_del_init(&m->queue);
|
list_del_init(&m->queue);
|
||||||
spin_unlock_irq(&mpc83xx_spi->lock);
|
spin_unlock_irq(&mpc83xx_spi->lock);
|
||||||
|
|
||||||
spi = m->spi;
|
mpc83xx_spi_do_one_msg(m);
|
||||||
cs_change = 1;
|
|
||||||
status = 0;
|
|
||||||
list_for_each_entry(t, &m->transfers, transfer_list) {
|
|
||||||
if (t->bits_per_word || t->speed_hz) {
|
|
||||||
/* Don't allow changes if CS is active */
|
|
||||||
status = -EINVAL;
|
|
||||||
|
|
||||||
if (cs_change)
|
|
||||||
status = mpc83xx_spi_setup_transfer(spi, t);
|
|
||||||
if (status < 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cs_change) {
|
|
||||||
mpc83xx_spi_chipselect(spi, BITBANG_CS_ACTIVE);
|
|
||||||
ndelay(nsecs);
|
|
||||||
}
|
|
||||||
cs_change = t->cs_change;
|
|
||||||
if (t->len)
|
|
||||||
status = mpc83xx_spi_bufs(spi, t);
|
|
||||||
if (status) {
|
|
||||||
status = -EMSGSIZE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
m->actual_length += t->len;
|
|
||||||
|
|
||||||
if (t->delay_usecs)
|
|
||||||
udelay(t->delay_usecs);
|
|
||||||
|
|
||||||
if (cs_change) {
|
|
||||||
ndelay(nsecs);
|
|
||||||
mpc83xx_spi_chipselect(spi, BITBANG_CS_INACTIVE);
|
|
||||||
ndelay(nsecs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m->status = status;
|
|
||||||
m->complete(m->context);
|
|
||||||
|
|
||||||
if (status || !cs_change) {
|
|
||||||
ndelay(nsecs);
|
|
||||||
mpc83xx_spi_chipselect(spi, BITBANG_CS_INACTIVE);
|
|
||||||
}
|
|
||||||
|
|
||||||
mpc83xx_spi_setup_transfer(spi, NULL);
|
|
||||||
|
|
||||||
spin_lock_irq(&mpc83xx_spi->lock);
|
spin_lock_irq(&mpc83xx_spi->lock);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user