{"id":520,"url":"http://patchwork.ozlabs.org/api/1.0/patches/520/?format=json","project":{"id":2,"url":"http://patchwork.ozlabs.org/api/1.0/projects/2/?format=json","name":"Linux PPC development","link_name":"linuxppc-dev","list_id":"linuxppc-dev.lists.ozlabs.org","list_email":"linuxppc-dev@lists.ozlabs.org","web_url":"https://github.com/linuxppc/wiki/wiki","scm_url":"https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git","webscm_url":"https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git/"},"msgid":"<20080918151735.GB31187@oksana.dev.rtsoft.ru>","date":"2008-09-18T15:17:35","name":"[2/3] powerpc/qe: new call to revert a gpio to a dedicated function","commit_ref":null,"pull_url":null,"state":"superseded","archived":true,"hash":"d25529c116b113e3b98c72ebb1ebfd93b74d4966","submitter":{"id":45,"url":"http://patchwork.ozlabs.org/api/1.0/people/45/?format=json","name":"Anton Vorontsov","email":"avorontsov@ru.mvista.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20080918151735.GB31187@oksana.dev.rtsoft.ru/mbox/","series":[],"check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/520/checks/","tags":{},"headers":{"Return-Path":"<linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@ozlabs.org>","X-Original-To":["patchwork-incoming@ozlabs.org","linuxppc-dev@ozlabs.org"],"Delivered-To":["patchwork-incoming@ozlabs.org","linuxppc-dev@ozlabs.org"],"Received":["from ozlabs.org (localhost [127.0.0.1])\n\tby ozlabs.org (Postfix) with ESMTP id 32700DE513\n\tfor <patchwork-incoming@ozlabs.org>;\n\tFri, 19 Sep 2008 01:18:00 +1000 (EST)","from buildserver.ru.mvista.com (unknown [85.21.88.6])\n\tby ozlabs.org (Postfix) with ESMTP id 8CD26DE1C8\n\tfor <linuxppc-dev@ozlabs.org>; Fri, 19 Sep 2008 01:17:36 +1000 (EST)","from localhost (unknown [10.150.0.9])\n\tby buildserver.ru.mvista.com (Postfix) with ESMTP\n\tid 11243881C; Thu, 18 Sep 2008 20:17:35 +0500 (SAMST)"],"Date":"Thu, 18 Sep 2008 19:17:35 +0400","From":"Anton Vorontsov <avorontsov@ru.mvista.com>","To":"Andrew Morton <akpm@linux-foundation.org>","Subject":"[PATCH 2/3] powerpc/qe: new call to revert a gpio to a dedicated\n\tfunction","Message-ID":"<20080918151735.GB31187@oksana.dev.rtsoft.ru>","References":"<20080918151659.GA20140@oksana.dev.rtsoft.ru>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20080918151659.GA20140@oksana.dev.rtsoft.ru>","User-Agent":"Mutt/1.5.18 (2008-05-17)","Cc":"David Brownell <dbrownell@users.sourceforge.net>,\n\tGreg Kroah-Hartman <greg@kroah.com>, linux-usb@vger.kernel.org,\n\tlinux-kernel@vger.kernel.org, linuxppc-dev@ozlabs.org,\n\tLi Yang <leoli@freescale.com>, Timur Tabi <timur@freescale.com>","X-BeenThere":"linuxppc-dev@ozlabs.org","X-Mailman-Version":"2.1.11","Precedence":"list","List-Id":"Linux on PowerPC Developers Mail List <linuxppc-dev.ozlabs.org>","List-Unsubscribe":"<https://ozlabs.org/mailman/options/linuxppc-dev>,\n\t<mailto:linuxppc-dev-request@ozlabs.org?subject=unsubscribe>","List-Archive":"<http://ozlabs.org/pipermail/linuxppc-dev>","List-Post":"<mailto:linuxppc-dev@ozlabs.org>","List-Help":"<mailto:linuxppc-dev-request@ozlabs.org?subject=help>","List-Subscribe":"<https://ozlabs.org/mailman/listinfo/linuxppc-dev>,\n\t<mailto:linuxppc-dev-request@ozlabs.org?subject=subscribe>","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Sender":"linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@ozlabs.org","Errors-To":"linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@ozlabs.org"},"content":"qe_gpio_set_dedicated() is a platform specific function, which is used\nto revert a pin to a dedicated function. Caller should have already\nobtained the gpio via gpio_request().\n\nThis is needed to support Freescale USB Host Controller.\n\nSigned-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>","diff":"diff --git a/arch/powerpc/include/asm/qe.h b/arch/powerpc/include/asm/qe.h\nindex edee15d..c926147 100644\n--- a/arch/powerpc/include/asm/qe.h\n+++ b/arch/powerpc/include/asm/qe.h\n@@ -111,6 +111,7 @@ extern void __par_io_config_pin(struct qe_pio_regs __iomem *par_io, u8 pin,\n extern int par_io_config_pin(u8 port, u8 pin, int dir, int open_drain,\n \t\t\t     int assignment, int has_irq);\n extern int par_io_data_set(u8 port, u8 pin, u8 val);\n+extern int qe_gpio_set_dedicated(unsigned int gpio);\n \n /* QE internal API */\n int qe_issue_cmd(u32 cmd, u32 device, u8 mcn_protocol, u32 cmd_input);\ndiff --git a/arch/powerpc/sysdev/qe_lib/gpio.c b/arch/powerpc/sysdev/qe_lib/gpio.c\nindex 8e5a0bc..bd7278f 100644\n--- a/arch/powerpc/sysdev/qe_lib/gpio.c\n+++ b/arch/powerpc/sysdev/qe_lib/gpio.c\n@@ -26,6 +26,9 @@ struct qe_gpio_chip {\n \n \t/* shadowed data register to clear/set bits safely */\n \tu32 cpdata;\n+\n+\t/* saved_regs used to restore dedicated functions */\n+\tstruct qe_pio_regs saved_regs;\n };\n \n static inline struct qe_gpio_chip *\n@@ -40,6 +43,12 @@ static void qe_gpio_save_regs(struct of_mm_gpio_chip *mm_gc)\n \tstruct qe_pio_regs __iomem *regs = mm_gc->regs;\n \n \tqe_gc->cpdata = in_be32(&regs->cpdata);\n+\tqe_gc->saved_regs.cpdata = qe_gc->cpdata;\n+\tqe_gc->saved_regs.cpdir1 = in_be32(&regs->cpdir1);\n+\tqe_gc->saved_regs.cpdir2 = in_be32(&regs->cpdir2);\n+\tqe_gc->saved_regs.cppar1 = in_be32(&regs->cppar1);\n+\tqe_gc->saved_regs.cppar2 = in_be32(&regs->cppar2);\n+\tqe_gc->saved_regs.cpodr = in_be32(&regs->cpodr);\n }\n \n static int qe_gpio_get(struct gpio_chip *gc, unsigned int gpio)\n@@ -103,6 +112,43 @@ static int qe_gpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val)\n \treturn 0;\n }\n \n+int qe_gpio_set_dedicated(unsigned int gpio)\n+{\n+\tstruct gpio_chip *gc = gpio_to_chip(gpio);\n+\tstruct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);\n+\tstruct qe_gpio_chip *qe_gc = to_qe_gpio_chip(mm_gc);\n+\tstruct qe_pio_regs __iomem *regs = mm_gc->regs;\n+\tstruct qe_pio_regs *sregs = &qe_gc->saved_regs;\n+\tu8 pin = gpio - gc->base;\n+\tu32 mask1 = 1 << (QE_PIO_PINS - (pin + 1));\n+\tu32 mask2 = 0x3 << (QE_PIO_PINS - (pin % (QE_PIO_PINS / 2) + 1) * 2);\n+\tbool second_reg = pin > (QE_PIO_PINS / 2) - 1;\n+\tunsigned long flags;\n+\n+\tspin_lock_irqsave(&qe_gc->lock, flags);\n+\n+\tif (second_reg) {\n+\t\tclrsetbits_be32(&regs->cpdir2, mask2, sregs->cpdir2 & mask2);\n+\t\tclrsetbits_be32(&regs->cppar2, mask2, sregs->cppar2 & mask2);\n+\t} else {\n+\t\tclrsetbits_be32(&regs->cpdir1, mask2, sregs->cpdir1 & mask2);\n+\t\tclrsetbits_be32(&regs->cppar1, mask2, sregs->cppar1 & mask2);\n+\t}\n+\n+\tif (sregs->cpdata & mask1)\n+\t\tqe_gc->cpdata |= mask1;\n+\telse\n+\t\tqe_gc->cpdata &= ~mask1;\n+\n+\tout_be32(&regs->cpdata, qe_gc->cpdata);\n+\tclrsetbits_be32(&regs->cpodr, mask1, sregs->cpodr & mask1);\n+\n+\tspin_unlock_irqrestore(&qe_gc->lock, flags);\n+\n+\treturn 0;\n+}\n+EXPORT_SYMBOL(qe_gpio_set_dedicated);\n+\n static int __init qe_add_gpiochips(void)\n {\n \tstruct device_node *np;\n","prefixes":["2/3"]}