From patchwork Sat Nov 21 16:08:47 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Torsten Fleischer X-Patchwork-Id: 38985 X-Patchwork-Delegate: grant.likely@secretlab.ca Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from bilbo.ozlabs.org (localhost [127.0.0.1]) by ozlabs.org (Postfix) with ESMTP id F091C1007F2 for ; Sun, 22 Nov 2009 03:09:02 +1100 (EST) Received: from mailout08.t-online.de (mailout08.t-online.de [194.25.134.20]) by ozlabs.org (Postfix) with ESMTP id 24BDDB6EF5 for ; Sun, 22 Nov 2009 03:08:52 +1100 (EST) Received: from fwd07.aul.t-online.de by mailout08.t-online.de with smtp id 1NBsW2-0002lf-01; Sat, 21 Nov 2009 17:08:50 +0100 Received: from linux-z6s0.localnet (GtWlrgZVohofmtkHn4GqJvpggA6YLKPgf5SM+nWNnjA0auKGmWY-zsIkC+ITm+Lg2Q@[87.163.65.212]) by fwd07.t-online.de with esmtp id 1NBsW0-0pNwdk0; Sat, 21 Nov 2009 17:08:48 +0100 From: Torsten Fleischer Organization: privat To: Grant Likely Subject: Re: spi_mpc8xxx.c: chip select polarity problem Date: Sat, 21 Nov 2009 17:08:47 +0100 User-Agent: KMail/1.12.2 (Linux/2.6.31.5-0.1-default; KDE/4.3.1; i686; ; ) References: <200911161742.46663.to-fleischer@t-online.de> <20091118232920.GA24307@oksana.dev.rtsoft.ru> In-Reply-To: MIME-Version: 1.0 Message-Id: <200911211708.47253.to-fleischer@t-online.de> X-ID: GtWlrgZVohofmtkHn4GqJvpggA6YLKPgf5SM+nWNnjA0auKGmWY-zsIkC+ITm+Lg2Q X-TOI-MSGID: a8ac4eb8-cf54-4a7d-81f6-3a05b282d67b Cc: linuxppc-dev@lists.ozlabs.org X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org On Sat, Nov 21, 2009 at 09:45:50 Grant Likely wrote: [...] > Hey Torsten, do you have an updated version of this change to address > the comments? I'm collecting the last few things for some linux-next > exposure now. Hey Grant, here is the updated version of the patch containing the recommended changes. Best Regards Torsten Signed-off-by: Torsten Fleischer diff -u -r -N linux-2.6.31.6_orig//drivers/spi/spi_mpc8xxx.c linux-2.6.31.6/drivers/spi/spi_mpc8xxx.c --- linux-2.6.31.6_orig//drivers/spi/spi_mpc8xxx.c 2009-11-10 01:32:31.000000000 +0100 +++ linux-2.6.31.6/drivers/spi/spi_mpc8xxx.c 2009-11-19 08:15:33.000000000 +0100 @@ -114,6 +114,7 @@ u32 rx_shift; /* RX data reg shift when in qe mode */ u32 tx_shift; /* TX data reg shift when in qe mode */ u32 hw_mode; /* Holds HW mode register settings */ + int initialized; }; static inline void mpc8xxx_spi_write_reg(__be32 __iomem *reg, u32 val) @@ -503,15 +504,52 @@ return ret; } + + +struct mpc8xxx_spi_probe_info { + struct fsl_spi_platform_data pdata; + int *gpios; + bool *alow_flags; +}; + +static struct mpc8xxx_spi_probe_info * +to_of_pinfo(struct fsl_spi_platform_data *pdata) +{ + return container_of(pdata, struct mpc8xxx_spi_probe_info, pdata); +} + +static int mpc8xxx_spi_cs_init(struct spi_device *spi) +{ + struct device *dev = spi->dev.parent; + struct mpc8xxx_spi_probe_info *pinfo = to_of_pinfo(dev->platform_data); + u16 cs = spi->chip_select; + int gpio = pinfo->gpios[cs]; + bool on = pinfo->alow_flags[cs] ^ !(spi->mode & SPI_CS_HIGH); + + return gpio_direction_output(gpio, on); +} + static int mpc8xxx_spi_transfer(struct spi_device *spi, struct spi_message *m) { struct mpc8xxx_spi *mpc8xxx_spi = spi_master_get_devdata(spi->master); + struct spi_mpc8xxx_cs *cs = spi->controller_state; unsigned long flags; m->actual_length = 0; m->status = -EINPROGRESS; + if (cs && !cs->initialized) { + int ret; + + ret = mpc8xxx_spi_cs_init(spi); + if (ret) { + dev_dbg(&spi->dev, "cs_init failed: %d\n", ret); + return ret; + } + cs->initialized = 1; + } + spin_lock_irqsave(&mpc8xxx_spi->lock, flags); list_add_tail(&m->queue, &mpc8xxx_spi->queue); queue_work(mpc8xxx_spi->workqueue, &mpc8xxx_spi->work); @@ -648,18 +686,6 @@ return 0; } -struct mpc8xxx_spi_probe_info { - struct fsl_spi_platform_data pdata; - int *gpios; - bool *alow_flags; -}; - -static struct mpc8xxx_spi_probe_info * -to_of_pinfo(struct fsl_spi_platform_data *pdata) -{ - return container_of(pdata, struct mpc8xxx_spi_probe_info, pdata); -} - static void mpc8xxx_spi_cs_control(struct spi_device *spi, bool on) { struct device *dev = spi->dev.parent; @@ -720,14 +746,6 @@ pinfo->gpios[i] = gpio; pinfo->alow_flags[i] = flags & OF_GPIO_ACTIVE_LOW; - - ret = gpio_direction_output(pinfo->gpios[i], - pinfo->alow_flags[i]); - if (ret) { - dev_err(dev, "can't set output direction for gpio " - "#%d: %d\n", i, ret); - goto err_loop; - } } pdata->max_chipselect = ngpios;