From patchwork Tue Oct 20 06:41:00 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: charu@ti.com X-Patchwork-Id: 54896 X-Patchwork-Delegate: tony@atomide.com Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n9K6f8oP013221 for ; Tue, 20 Oct 2009 06:41:08 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754638AbZJTGlD (ORCPT ); Tue, 20 Oct 2009 02:41:03 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1754613AbZJTGlC (ORCPT ); Tue, 20 Oct 2009 02:41:02 -0400 Received: from arroyo.ext.ti.com ([192.94.94.40]:35061 "EHLO arroyo.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750781AbZJTGlB (ORCPT ); Tue, 20 Oct 2009 02:41:01 -0400 Received: from dbdp31.itg.ti.com ([172.24.170.98]) by arroyo.ext.ti.com (8.13.7/8.13.7) with ESMTP id n9K6f3Sc000512 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 20 Oct 2009 01:41:05 -0500 Received: from linfarm476.india.ti.com (localhost [127.0.0.1]) by dbdp31.itg.ti.com (8.13.8/8.13.8) with ESMTP id n9K6f1A2001894; Tue, 20 Oct 2009 12:11:02 +0530 (IST) Received: from linfarm476.india.ti.com (localhost [127.0.0.1]) by linfarm476.india.ti.com (8.12.11/8.12.11) with ESMTP id n9K6f1SO001564; Tue, 20 Oct 2009 12:11:01 +0530 Received: (from x0084895@localhost) by linfarm476.india.ti.com (8.12.11/8.12.11/Submit) id n9K6f0vi001546; Tue, 20 Oct 2009 12:11:00 +0530 From: charu@ti.com To: linux-omap@vger.kernel.org Cc: Charulatha V , Syed Rafiuddin Subject: [PATCH V2] FIX OMAP3:McBSP poll read and write for OMAP3 Date: Tue, 20 Oct 2009 12:11:00 +0530 Message-Id: <1256020860-1108-1-git-send-email-charu@ti.com> X-Mailer: git-send-email 1.5.5 Sender: linux-omap-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org diff --git a/arch/arm/plat-omap/include/mach/mcbsp.h b/arch/arm/plat-omap/include/mach/mcbsp.h index 0c5f937..b0f9260 100644 --- a/arch/arm/plat-omap/include/mach/mcbsp.h +++ b/arch/arm/plat-omap/include/mach/mcbsp.h @@ -406,6 +406,10 @@ void omap_mcbsp_set_spi_mode(unsigned int id, const struct omap_mcbsp_spi_cfg * /* Polled read/write functions */ int omap_mcbsp_pollread(unsigned int id, u16 * buf); int omap_mcbsp_pollwrite(unsigned int id, u16 buf); + +int omap3_mcbsp_pollread(unsigned int id, u32 *buf); +int omap3_mcbsp_pollwrite(unsigned int id, u32 buf); + int omap_mcbsp_set_io_type(unsigned int id, omap_mcbsp_io_type_t io_type); #endif diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c index b6b520d..1212d11 100644 --- a/arch/arm/plat-omap/mcbsp.c +++ b/arch/arm/plat-omap/mcbsp.c @@ -425,7 +425,7 @@ void omap_mcbsp_stop(unsigned int id) } EXPORT_SYMBOL(omap_mcbsp_stop); -/* polled mcbsp i/o operations */ +/* polled mcbsp i/o operations for omap1 and omap2420 */ int omap_mcbsp_pollwrite(unsigned int id, u16 buf) { struct omap_mcbsp *mcbsp; @@ -515,6 +515,96 @@ int omap_mcbsp_pollread(unsigned int id, u16 *buf) } EXPORT_SYMBOL(omap_mcbsp_pollread); +/* polled mcbsp i/o operations for omap3 */ +int omap3_mcbsp_pollwrite(unsigned int id, u32 buf) +{ + struct omap_mcbsp *mcbsp; + void __iomem *base; + + if (!omap_mcbsp_check_valid_id(id)) { + printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); + return -ENODEV; + } + + mcbsp = id_to_mcbsp_ptr(id); + base = mcbsp->io_base; + + OMAP_MCBSP_WRITE(base, DXR, buf); + /* if frame sync error - clear the error */ + if (OMAP_MCBSP_READ(base, SPCR2) & XSYNC_ERR) { + /* clear error */ + OMAP_MCBSP_WRITE(base, SPCR2, OMAP_MCBSP_READ(base, SPCR2) + & (~XSYNC_ERR)); + /* resend */ + return -EPERM; + } else { + /* wait for transmit confirmation */ + int attemps = 0; + while (!(OMAP_MCBSP_READ(base, SPCR2) & XRDY)) { + if (attemps++ > 1000) { + OMAP_MCBSP_WRITE(base, SPCR2, + OMAP_MCBSP_READ(base, SPCR2) & + (~XRST)); + udelay(10); + OMAP_MCBSP_WRITE(base, SPCR2, + OMAP_MCBSP_READ(base, SPCR2) | + (XRST)); + udelay(10); + dev_err(mcbsp->dev, "Could not write to" + " McBSP%d Register\n", mcbsp->id); + return -ENOENT; + } + } + } + + return 0; +} +EXPORT_SYMBOL(omap3_mcbsp_pollwrite); + +int omap3_mcbsp_pollread(unsigned int id, u32 *buf) +{ + struct omap_mcbsp *mcbsp; + void __iomem *base; + + if (!omap_mcbsp_check_valid_id(id)) { + printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); + return -ENODEV; + } + mcbsp = id_to_mcbsp_ptr(id); + + base = mcbsp->io_base; + /* if frame sync error - clear the error */ + if (OMAP_MCBSP_READ(base, SPCR1) & RSYNC_ERR) { + /* clear error */ + OMAP_MCBSP_WRITE(base, SPCR1, OMAP_MCBSP_READ(base, SPCR1) + & (~RSYNC_ERR)); + /* resend */ + return -EPERM; + } else { + /* wait for recieve confirmation */ + int attemps = 0; + while (!(OMAP_MCBSP_READ(base, SPCR1) & RRDY)) { + if (attemps++ > 1000) { + OMAP_MCBSP_WRITE(base, SPCR1, + OMAP_MCBSP_READ(base, SPCR1) & + (~RRST)); + udelay(10); + OMAP_MCBSP_WRITE(base, SPCR1, + OMAP_MCBSP_READ(base, SPCR1) | + (RRST)); + udelay(10); + dev_err(mcbsp->dev, "Could not read from" + " McBSP%d Register\n", mcbsp->id); + return -ENOENT; + } + } + } + *buf = OMAP_MCBSP_READ(base, DRR); + + return 0; +} +EXPORT_SYMBOL(omap3_mcbsp_pollread); + /* * IRQ based word transmission. */