| /****************************************************************************** |
| * |
| * Copyright(c) 2015 - 2016 Realtek Corporation. All rights reserved. |
| * |
| * This program is free software; you can redistribute it and/or modify it |
| * under the terms of version 2 of the GNU General Public License as |
| * published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
| * more details. |
| * |
| * You should have received a copy of the GNU General Public License along with |
| * this program; if not, write to the Free Software Foundation, Inc., |
| * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA |
| * |
| ******************************************************************************/ |
| #define _RTW_SDIO_C_ |
| |
| #include <drv_types.h> /* struct dvobj_priv and etc. */ |
| #include <drv_types_sdio.h> /* RTW_SDIO_ADDR_CMD52_GEN */ |
| |
| /* |
| * Description: |
| * Use SDIO cmd52 or cmd53 to read/write data |
| * |
| * Parameters: |
| * d pointer of device object(struct dvobj_priv) |
| * addr SDIO address, 17 bits |
| * buf buffer for I/O |
| * len length |
| * write 0:read, 1:write |
| * cmd52 0:cmd52, 1:cmd53 |
| * |
| * Return: |
| * _SUCCESS I/O ok. |
| * _FAIL I/O fail. |
| */ |
| static u8 sdio_io(struct dvobj_priv *d, u32 addr, void *buf, size_t len, u8 write, u8 cmd52) |
| { |
| int err; |
| |
| |
| if (cmd52) |
| addr = RTW_SDIO_ADDR_CMD52_GEN(addr); |
| |
| if (write) |
| err = d->intf_ops->write(d, addr, buf, len, 0); |
| else |
| err = d->intf_ops->read(d, addr, buf, len, 0); |
| if (err) { |
| RTW_INFO("%s: [ERROR] %s FAIL! error(%d)\n", |
| __FUNCTION__, write ? "write" : "read", err); |
| return _FAIL; |
| } |
| |
| return _SUCCESS; |
| } |
| |
| u8 rtw_sdio_read_cmd52(struct dvobj_priv *d, u32 addr, void *buf, size_t len) |
| { |
| return sdio_io(d, addr, buf, len, 0, 1); |
| } |
| |
| u8 rtw_sdio_read_cmd53(struct dvobj_priv *d, u32 addr, void *buf, size_t len) |
| { |
| return sdio_io(d, addr, buf, len, 0, 0); |
| } |
| |
| u8 rtw_sdio_write_cmd52(struct dvobj_priv *d, u32 addr, void *buf, size_t len) |
| { |
| return sdio_io(d, addr, buf, len, 1, 1); |
| } |
| |
| u8 rtw_sdio_write_cmd53(struct dvobj_priv *d, u32 addr, void *buf, size_t len) |
| { |
| return sdio_io(d, addr, buf, len, 1, 0); |
| } |
| |
| u8 rtw_sdio_f0_read(struct dvobj_priv *d, u32 addr, void *buf, size_t len) |
| { |
| int err; |
| u8 ret; |
| |
| |
| ret = _SUCCESS; |
| addr = RTW_SDIO_ADDR_F0_GEN(addr); |
| |
| err = d->intf_ops->read(d, addr, buf, len, 0); |
| if (err) { |
| RTW_INFO("%s: [ERROR] Read f0 register FAIL!\n", __FUNCTION__); |
| ret = _FAIL; |
| } |
| |
| |
| return ret; |
| } |