summaryrefslogtreecommitdiffstats
path: root/drivers/staging/rtl8192e/rtl8192e/rtl_eeprom.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/rtl8192e/rtl8192e/rtl_eeprom.c')
-rw-r--r--drivers/staging/rtl8192e/rtl8192e/rtl_eeprom.c84
1 files changed, 84 insertions, 0 deletions
diff --git a/drivers/staging/rtl8192e/rtl8192e/rtl_eeprom.c b/drivers/staging/rtl8192e/rtl8192e/rtl_eeprom.c
new file mode 100644
index 0000000000..db57c655c6
--- /dev/null
+++ b/drivers/staging/rtl8192e/rtl8192e/rtl_eeprom.c
@@ -0,0 +1,84 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * Based on the r8180 driver, which is:
+ * Copyright 2004-2005 Andrea Merello <andrea.merello@gmail.com>, et al.
+ *
+ * Contact Information: wlanfae <wlanfae@realtek.com>
+ */
+#include "rtl_core.h"
+#include "rtl_eeprom.h"
+
+static void _rtl92e_gpio_write_bit(struct net_device *dev, int no, bool val)
+{
+ u8 reg = rtl92e_readb(dev, EPROM_CMD);
+
+ if (val)
+ reg |= 1 << no;
+ else
+ reg &= ~(1 << no);
+
+ rtl92e_writeb(dev, EPROM_CMD, reg);
+ udelay(EPROM_DELAY);
+}
+
+static bool _rtl92e_gpio_get_bit(struct net_device *dev, int no)
+{
+ u8 reg = rtl92e_readb(dev, EPROM_CMD);
+
+ return (reg >> no) & 0x1;
+}
+
+static void _rtl92e_eeprom_ck_cycle(struct net_device *dev)
+{
+ _rtl92e_gpio_write_bit(dev, EPROM_CK_BIT, 1);
+ _rtl92e_gpio_write_bit(dev, EPROM_CK_BIT, 0);
+}
+
+static u16 _rtl92e_eeprom_xfer(struct net_device *dev, u16 data, int tx_len)
+{
+ u16 ret = 0;
+ int rx_len = 16;
+
+ _rtl92e_gpio_write_bit(dev, EPROM_CS_BIT, 1);
+ _rtl92e_eeprom_ck_cycle(dev);
+
+ while (tx_len--) {
+ _rtl92e_gpio_write_bit(dev, EPROM_W_BIT,
+ (data >> tx_len) & 0x1);
+ _rtl92e_eeprom_ck_cycle(dev);
+ }
+
+ _rtl92e_gpio_write_bit(dev, EPROM_W_BIT, 0);
+
+ while (rx_len--) {
+ _rtl92e_eeprom_ck_cycle(dev);
+ ret |= _rtl92e_gpio_get_bit(dev, EPROM_R_BIT) << rx_len;
+ }
+
+ _rtl92e_gpio_write_bit(dev, EPROM_CS_BIT, 0);
+ _rtl92e_eeprom_ck_cycle(dev);
+
+ return ret;
+}
+
+u32 rtl92e_eeprom_read(struct net_device *dev, u32 addr)
+{
+ struct r8192_priv *priv = rtllib_priv(dev);
+ u32 ret = 0;
+
+ rtl92e_writeb(dev, EPROM_CMD,
+ (EPROM_CMD_PROGRAM << EPROM_CMD_OPERATING_MODE_SHIFT));
+ udelay(EPROM_DELAY);
+
+ /* EEPROM is configured as x16 */
+ if (priv->epromtype == EEPROM_93C56)
+ ret = _rtl92e_eeprom_xfer(dev, (addr & 0xFF) | (0x6 << 8), 11);
+ else
+ ret = _rtl92e_eeprom_xfer(dev, (addr & 0x3F) | (0x6 << 6), 9);
+
+ rtl92e_writeb(dev, EPROM_CMD,
+ (EPROM_CMD_NORMAL << EPROM_CMD_OPERATING_MODE_SHIFT));
+ return ret;
+}