From patchwork Sun Apr 27 01:14:25 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrey Danin X-Patchwork-Id: 343141 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 7A57F1400E6 for ; Sun, 27 Apr 2014 20:39:34 +1000 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id ECE544BBD2; Sun, 27 Apr 2014 12:39:29 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id RK3vX4tW6b-X; Sun, 27 Apr 2014 12:39:29 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 741A84BBD4; Sun, 27 Apr 2014 12:39:20 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 04F8E4BB75 for ; Sun, 27 Apr 2014 12:39:18 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id IVlrOb5bXFoO for ; Sun, 27 Apr 2014 12:39:13 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from fallback5.mail.ru (fallback5.mail.ru [94.100.176.59]) by theia.denx.de (Postfix) with ESMTP id 5AB704BBC1 for ; Sun, 27 Apr 2014 12:39:09 +0200 (CEST) Received: from smtp33.i.mail.ru (smtp33.i.mail.ru [94.100.177.93]) by fallback5.mail.ru (mPOP.Fallback_MX) with ESMTP id 26A2E11544B6F for ; Sun, 27 Apr 2014 14:32:59 +0400 (MSK) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mail.ru; s=mail2; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=DHckytdoqWM1IlI/oQCS3wxOus3OK3no9jkVg4U4r7c=; b=fZqsb8SOuxH4ex9hVhKdps9DwnAqnxFcdffjGp8xYVVn7FKZh7kG/vPLJBVTZ1A/Q4Sor/HgQHb6GLXAR/U8fa6XUkvHFlozriD9M9l+TYkSHaSK46qszmXHcC76jlEbQFJjXO0ZZFMY50hLUAzMSjcE6pFg1fODJTjS0DREhIs=; Received: from [87.255.14.112] (port=50586 helo=localhost.localdomain) by smtp33.i.mail.ru with esmtpa (envelope-from ) id 1WeMOE-00061u-FU; Sun, 27 Apr 2014 14:32:54 +0400 From: Andrey Danin To: Tom Warren , u-boot@lists.denx.de Date: Sun, 27 Apr 2014 05:14:25 +0400 Message-Id: <1398561270-25091-2-git-send-email-danindrey@mail.ru> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1398561270-25091-1-git-send-email-danindrey@mail.ru> References: <[PATCH 0/3] ARM: tegra: add nvec keyboard support for paz00> <1398561270-25091-1-git-send-email-danindrey@mail.ru> X-Spam: Not detected X-Mras: Ok Cc: Julian Andres Klode , Stephen Warren , ac100@lists.launchpad.net Subject: [U-Boot] [PATCH v2 1/6] i2c: add slave mode support X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.11 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de Signed-off-by: Andrey Danin CC: Stephen Warren CC: Marc Dietrich CC: Julian Andres Klode CC: ac100@lists.launchpad.net --- drivers/i2c/i2c_core.c | 13 +++++++++++++ include/i2c.h | 30 +++++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/drivers/i2c/i2c_core.c b/drivers/i2c/i2c_core.c index 18d6736..105aa0a 100644 --- a/drivers/i2c/i2c_core.c +++ b/drivers/i2c/i2c_core.c @@ -395,6 +395,19 @@ void i2c_reg_write(uint8_t addr, uint8_t reg, uint8_t val) i2c_write(addr, reg, 1, &val, 1); } +int i2c_slave_io(struct i2c_transaction *trans) +{ + struct i2c_adapter *cur = I2C_ADAP; + + if (!cur->slave_io) { + printf("Error: slave IO is not supported on adap %d\n", + cur->hwadapnr); + return -1; + } + + return cur->slave_io(cur, trans); +} + void __i2c_init(int speed, int slaveaddr) { i2c_init_bus(i2c_get_bus_num(), speed, slaveaddr); diff --git a/include/i2c.h b/include/i2c.h index f93a183..165b919 100644 --- a/include/i2c.h +++ b/include/i2c.h @@ -55,6 +55,20 @@ #define CONFIG_SYS_SPD_BUS_NUM 0 #endif +struct i2c_transaction { + char rx_buf[34]; + int rx_pos; + + char tx_buf[34]; + int tx_pos; + int tx_size; + + unsigned int start_timeout; + unsigned int timeout; + + int res; +}; + struct i2c_adapter { void (*init)(struct i2c_adapter *adap, int speed, int slaveaddr); @@ -65,6 +79,8 @@ struct i2c_adapter { int (*write)(struct i2c_adapter *adap, uint8_t chip, uint addr, int alen, uint8_t *buffer, int len); + int (*slave_io)(struct i2c_adapter *adap, + struct i2c_transaction *trans); uint (*set_bus_speed)(struct i2c_adapter *adap, uint speed); int speed; @@ -81,12 +97,13 @@ struct i2c_adapter { .probe = _probe, \ .read = _read, \ .write = _write, \ + .slave_io = 0, \ .set_bus_speed = _set_speed, \ .speed = _speed, \ .slaveaddr = _slaveaddr, \ .init_done = 0, \ .hwadapnr = _hwadapnr, \ - .name = #_name \ + .name = #_name, \ }; #define U_BOOT_I2C_ADAP_COMPLETE(_name, _init, _probe, _read, _write, \ @@ -450,4 +467,15 @@ int i2c_get_bus_num_fdt(int node); * @return 0 if port was reset, -1 if not found */ int i2c_reset_port_fdt(const void *blob, int node); + +/** + * Perform I2C transaction with master device. + * + * @param trans I2C transaction object + * @return 0 if succeeded, -1 if not supported, + * 1 if not ready, 2 if operation timed out, + * 3 if not our packet, other - unknown error. + */ +int i2c_slave_io(struct i2c_transaction *trans); + #endif /* _I2C_H_ */