Loading arch/arm/mach-msm/board-8226-gpiomux.c +163 −0 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ * */ #include <linux/gpio.h> #include <linux/init.h> #include <linux/ioport.h> #include <mach/board.h> Loading @@ -18,6 +19,12 @@ #include <mach/gpiomux.h> #include <soc/qcom/socinfo.h> #define WLAN_CLK 44 #define WLAN_SET 43 #define WLAN_DATA0 42 #define WLAN_DATA1 41 #define WLAN_DATA2 40 #ifdef CONFIG_USB_EHCI_MSM_HSIC static struct gpiomux_setting hsic_sus_cfg = { .func = GPIOMUX_FUNC_GPIO, Loading Loading @@ -140,6 +147,18 @@ static struct gpiomux_setting wcnss_5wire_active_cfg = { .pull = GPIOMUX_PULL_DOWN, }; static struct gpiomux_setting wcnss_5gpio_suspend_cfg = { .func = GPIOMUX_FUNC_GPIO, .drv = GPIOMUX_DRV_2MA, .pull = GPIOMUX_PULL_UP, }; static struct gpiomux_setting wcnss_5gpio_active_cfg = { .func = GPIOMUX_FUNC_GPIO, .drv = GPIOMUX_DRV_6MA, .pull = GPIOMUX_PULL_DOWN, }; static struct gpiomux_setting gpio_i2c_config = { .func = GPIOMUX_FUNC_3, .drv = GPIOMUX_DRV_2MA, Loading Loading @@ -520,6 +539,44 @@ static struct msm_gpiomux_config wcnss_5wire_interface[] = { }, }; static struct msm_gpiomux_config wcnss_5gpio_interface[] = { { .gpio = 40, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, { .gpio = 41, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, { .gpio = 42, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, { .gpio = 43, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, { .gpio = 44, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, }; static struct gpiomux_setting gpio_suspend_config[] = { { .func = GPIOMUX_FUNC_GPIO, /* IN-NP */ Loading Loading @@ -861,3 +918,109 @@ void __init msm8226_init_gpiomux(void) msm_gpiomux_install(msm_hsic_configs, ARRAY_SIZE(msm_hsic_configs)); #endif } static void wcnss_switch_to_gpio(void) { /* Switch MUX to GPIO */ msm_gpiomux_install(wcnss_5gpio_interface, ARRAY_SIZE(wcnss_5gpio_interface)); /* Ensure GPIO config */ gpio_direction_input(WLAN_DATA2); gpio_direction_input(WLAN_DATA1); gpio_direction_input(WLAN_DATA0); gpio_direction_output(WLAN_SET, 0); gpio_direction_output(WLAN_CLK, 0); } static void wcnss_switch_to_5wire(void) { msm_gpiomux_install(wcnss_5wire_interface, ARRAY_SIZE(wcnss_5wire_interface)); } u32 wcnss_rf_read_reg(u32 rf_reg_addr) { int count = 0; u32 rf_cmd_and_addr = 0; u32 rf_data_received = 0; u32 rf_bit = 0; wcnss_switch_to_gpio(); /* Reset the signal if it is already being used. */ gpio_set_value(WLAN_SET, 0); gpio_set_value(WLAN_CLK, 0); /* We start with cmd_set high WLAN_SET = 1. */ gpio_set_value(WLAN_SET, 1); gpio_direction_output(WLAN_DATA0, 1); gpio_direction_output(WLAN_DATA1, 1); gpio_direction_output(WLAN_DATA2, 1); gpio_set_value(WLAN_DATA0, 0); gpio_set_value(WLAN_DATA1, 0); gpio_set_value(WLAN_DATA2, 0); /* Prepare command and RF register address that need to sent out. * Make sure that we send only 14 bits from LSB. */ rf_cmd_and_addr = (((WLAN_RF_READ_REG_CMD) | (rf_reg_addr << WLAN_RF_REG_ADDR_START_OFFSET)) & WLAN_RF_READ_CMD_MASK); for (count = 0; count < 5; count++) { gpio_set_value(WLAN_CLK, 0); rf_bit = (rf_cmd_and_addr & 0x1); gpio_set_value(WLAN_DATA0, rf_bit ? 1 : 0); rf_cmd_and_addr = (rf_cmd_and_addr >> 1); rf_bit = (rf_cmd_and_addr & 0x1); gpio_set_value(WLAN_DATA1, rf_bit ? 1 : 0); rf_cmd_and_addr = (rf_cmd_and_addr >> 1); rf_bit = (rf_cmd_and_addr & 0x1); gpio_set_value(WLAN_DATA2, rf_bit ? 1 : 0); rf_cmd_and_addr = (rf_cmd_and_addr >> 1); /* Send the data out WLAN_CLK = 1 */ gpio_set_value(WLAN_CLK, 1); } /* Pull down the clock signal */ gpio_set_value(WLAN_CLK, 0); /* Configure data pins to input IO pins */ gpio_direction_input(WLAN_DATA0); gpio_direction_input(WLAN_DATA1); gpio_direction_input(WLAN_DATA2); for (count = 0; count < 2; count++) { gpio_set_value(WLAN_CLK, 1); gpio_set_value(WLAN_CLK, 0); } rf_bit = 0; for (count = 0; count < 6; count++) { gpio_set_value(WLAN_CLK, 1); gpio_set_value(WLAN_CLK, 0); rf_bit = gpio_get_value(WLAN_DATA0); rf_data_received |= (rf_bit << (count * 3 + 0)); if (count != 5) { rf_bit = gpio_get_value(WLAN_DATA1); rf_data_received |= (rf_bit << (count * 3 + 1)); rf_bit = gpio_get_value(WLAN_DATA2); rf_data_received |= (rf_bit << (count * 3 + 2)); } } gpio_set_value(WLAN_SET, 0); wcnss_switch_to_5wire(); return rf_data_received; } arch/arm/mach-msm/board-8610-gpiomux.c +163 −0 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ * */ #include <linux/gpio.h> #include <linux/init.h> #include <linux/ioport.h> #include <mach/board.h> Loading @@ -18,6 +19,12 @@ #include <mach/gpiomux.h> #include <soc/qcom/socinfo.h> #define WLAN_CLK 27 #define WLAN_SET 26 #define WLAN_DATA0 25 #define WLAN_DATA1 24 #define WLAN_DATA2 23 static struct gpiomux_setting gpio_spi_config = { .func = GPIOMUX_FUNC_1, .drv = GPIOMUX_DRV_6MA, Loading Loading @@ -112,6 +119,18 @@ static struct gpiomux_setting wcnss_5wire_active_cfg = { .pull = GPIOMUX_PULL_DOWN, }; static struct gpiomux_setting wcnss_5gpio_suspend_cfg = { .func = GPIOMUX_FUNC_GPIO, .drv = GPIOMUX_DRV_2MA, .pull = GPIOMUX_PULL_UP, }; static struct gpiomux_setting wcnss_5gpio_active_cfg = { .func = GPIOMUX_FUNC_GPIO, .drv = GPIOMUX_DRV_6MA, .pull = GPIOMUX_PULL_DOWN, }; static struct gpiomux_setting lcd_en_act_cfg = { .func = GPIOMUX_FUNC_GPIO, .drv = GPIOMUX_DRV_8MA, Loading Loading @@ -404,6 +423,44 @@ static struct msm_gpiomux_config wcnss_5wire_interface[] = { }, }; static struct msm_gpiomux_config wcnss_5gpio_interface[] = { { .gpio = 23, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, { .gpio = 24, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, { .gpio = 25, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, { .gpio = 26, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, { .gpio = 27, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, }; static struct gpiomux_setting gpio_suspend_config[] = { { .func = GPIOMUX_FUNC_GPIO, /* IN-NP */ Loading Loading @@ -663,3 +720,109 @@ void __init msm8610_init_gpiomux(void) ARRAY_SIZE(msm_non_qrd_configs)); } } static void wcnss_switch_to_gpio(void) { /* Switch MUX to GPIO */ msm_gpiomux_install(wcnss_5gpio_interface, ARRAY_SIZE(wcnss_5gpio_interface)); /* Ensure GPIO config */ gpio_direction_input(WLAN_DATA2); gpio_direction_input(WLAN_DATA1); gpio_direction_input(WLAN_DATA0); gpio_direction_output(WLAN_SET, 0); gpio_direction_output(WLAN_CLK, 0); } static void wcnss_switch_to_5wire(void) { msm_gpiomux_install(wcnss_5wire_interface, ARRAY_SIZE(wcnss_5wire_interface)); } u32 wcnss_rf_read_reg(u32 rf_reg_addr) { int count = 0; u32 rf_cmd_and_addr = 0; u32 rf_data_received = 0; u32 rf_bit = 0; wcnss_switch_to_gpio(); /* Reset the signal if it is already being used. */ gpio_set_value(WLAN_SET, 0); gpio_set_value(WLAN_CLK, 0); /* We start with cmd_set high WLAN_SET = 1. */ gpio_set_value(WLAN_SET, 1); gpio_direction_output(WLAN_DATA0, 1); gpio_direction_output(WLAN_DATA1, 1); gpio_direction_output(WLAN_DATA2, 1); gpio_set_value(WLAN_DATA0, 0); gpio_set_value(WLAN_DATA1, 0); gpio_set_value(WLAN_DATA2, 0); /* Prepare command and RF register address that need to sent out. * Make sure that we send only 14 bits from LSB. */ rf_cmd_and_addr = (((WLAN_RF_READ_REG_CMD) | (rf_reg_addr << WLAN_RF_REG_ADDR_START_OFFSET)) & WLAN_RF_READ_CMD_MASK); for (count = 0; count < 5; count++) { gpio_set_value(WLAN_CLK, 0); rf_bit = (rf_cmd_and_addr & 0x1); gpio_set_value(WLAN_DATA0, rf_bit ? 1 : 0); rf_cmd_and_addr = (rf_cmd_and_addr >> 1); rf_bit = (rf_cmd_and_addr & 0x1); gpio_set_value(WLAN_DATA1, rf_bit ? 1 : 0); rf_cmd_and_addr = (rf_cmd_and_addr >> 1); rf_bit = (rf_cmd_and_addr & 0x1); gpio_set_value(WLAN_DATA2, rf_bit ? 1 : 0); rf_cmd_and_addr = (rf_cmd_and_addr >> 1); /* Send the data out WLAN_CLK = 1 */ gpio_set_value(WLAN_CLK, 1); } /* Pull down the clock signal */ gpio_set_value(WLAN_CLK, 0); /* Configure data pins to input IO pins */ gpio_direction_input(WLAN_DATA0); gpio_direction_input(WLAN_DATA1); gpio_direction_input(WLAN_DATA2); for (count = 0; count < 2; count++) { gpio_set_value(WLAN_CLK, 1); gpio_set_value(WLAN_CLK, 0); } rf_bit = 0; for (count = 0; count < 6; count++) { gpio_set_value(WLAN_CLK, 1); gpio_set_value(WLAN_CLK, 0); rf_bit = gpio_get_value(WLAN_DATA0); rf_data_received |= (rf_bit << (count * 3 + 0)); if (count != 5) { rf_bit = gpio_get_value(WLAN_DATA1); rf_data_received |= (rf_bit << (count * 3 + 1)); rf_bit = gpio_get_value(WLAN_DATA2); rf_data_received |= (rf_bit << (count * 3 + 2)); } } gpio_set_value(WLAN_SET, 0); wcnss_switch_to_5wire(); return rf_data_received; } arch/arm/mach-msm/board-8974-gpiomux.c +162 −0 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ * */ #include <linux/gpio.h> #include <linux/init.h> #include <linux/ioport.h> #include <mach/board.h> Loading @@ -20,6 +21,12 @@ #define KS8851_IRQ_GPIO 94 #define WLAN_CLK 40 #define WLAN_SET 39 #define WLAN_DATA0 38 #define WLAN_DATA1 37 #define WLAN_DATA2 36 static struct gpiomux_setting ap2mdm_cfg = { .func = GPIOMUX_FUNC_GPIO, .drv = GPIOMUX_DRV_8MA, Loading Loading @@ -205,6 +212,18 @@ static struct gpiomux_setting wcnss_5wire_active_cfg = { .pull = GPIOMUX_PULL_DOWN, }; static struct gpiomux_setting wcnss_5gpio_suspend_cfg = { .func = GPIOMUX_FUNC_GPIO, .drv = GPIOMUX_DRV_2MA, .pull = GPIOMUX_PULL_UP, }; static struct gpiomux_setting wcnss_5gpio_active_cfg = { .func = GPIOMUX_FUNC_GPIO, .drv = GPIOMUX_DRV_6MA, .pull = GPIOMUX_PULL_DOWN, }; static struct gpiomux_setting ath_gpio_active_cfg = { .func = GPIOMUX_FUNC_GPIO, .drv = GPIOMUX_DRV_2MA, Loading Loading @@ -1155,6 +1174,43 @@ static struct msm_gpiomux_config wcnss_5wire_interface[] = { }, }; static struct msm_gpiomux_config wcnss_5gpio_interface[] = { { .gpio = 36, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, { .gpio = 37, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, { .gpio = 38, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, { .gpio = 39, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, { .gpio = 40, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, }; static struct msm_gpiomux_config ath_gpio_configs[] = { { Loading Loading @@ -1526,3 +1582,109 @@ void __init msm_8974_init_gpiomux(void) msm_gpiomux_install(apq8074_interposer_config, ARRAY_SIZE(apq8074_interposer_config)); } static void wcnss_switch_to_gpio(void) { /* Switch MUX to GPIO */ msm_gpiomux_install(wcnss_5gpio_interface, ARRAY_SIZE(wcnss_5gpio_interface)); /* Ensure GPIO config */ gpio_direction_input(WLAN_DATA2); gpio_direction_input(WLAN_DATA1); gpio_direction_input(WLAN_DATA0); gpio_direction_output(WLAN_SET, 0); gpio_direction_output(WLAN_CLK, 0); } static void wcnss_switch_to_5wire(void) { msm_gpiomux_install(wcnss_5wire_interface, ARRAY_SIZE(wcnss_5wire_interface)); } u32 wcnss_rf_read_reg(u32 rf_reg_addr) { int count = 0; u32 rf_cmd_and_addr = 0; u32 rf_data_received = 0; u32 rf_bit = 0; wcnss_switch_to_gpio(); /* Reset the signal if it is already being used. */ gpio_set_value(WLAN_SET, 0); gpio_set_value(WLAN_CLK, 0); /* We start with cmd_set high WLAN_SET = 1. */ gpio_set_value(WLAN_SET, 1); gpio_direction_output(WLAN_DATA0, 1); gpio_direction_output(WLAN_DATA1, 1); gpio_direction_output(WLAN_DATA2, 1); gpio_set_value(WLAN_DATA0, 0); gpio_set_value(WLAN_DATA1, 0); gpio_set_value(WLAN_DATA2, 0); /* Prepare command and RF register address that need to sent out. * Make sure that we send only 14 bits from LSB. */ rf_cmd_and_addr = (((WLAN_RF_READ_REG_CMD) | (rf_reg_addr << WLAN_RF_REG_ADDR_START_OFFSET)) & WLAN_RF_READ_CMD_MASK); for (count = 0; count < 5; count++) { gpio_set_value(WLAN_CLK, 0); rf_bit = (rf_cmd_and_addr & 0x1); gpio_set_value(WLAN_DATA0, rf_bit ? 1 : 0); rf_cmd_and_addr = (rf_cmd_and_addr >> 1); rf_bit = (rf_cmd_and_addr & 0x1); gpio_set_value(WLAN_DATA1, rf_bit ? 1 : 0); rf_cmd_and_addr = (rf_cmd_and_addr >> 1); rf_bit = (rf_cmd_and_addr & 0x1); gpio_set_value(WLAN_DATA2, rf_bit ? 1 : 0); rf_cmd_and_addr = (rf_cmd_and_addr >> 1); /* Send the data out WLAN_CLK = 1 */ gpio_set_value(WLAN_CLK, 1); } /* Pull down the clock signal */ gpio_set_value(WLAN_CLK, 0); /* Configure data pins to input IO pins */ gpio_direction_input(WLAN_DATA0); gpio_direction_input(WLAN_DATA1); gpio_direction_input(WLAN_DATA2); for (count = 0; count < 2; count++) { gpio_set_value(WLAN_CLK, 1); gpio_set_value(WLAN_CLK, 0); } rf_bit = 0; for (count = 0; count < 6; count++) { gpio_set_value(WLAN_CLK, 1); gpio_set_value(WLAN_CLK, 0); rf_bit = gpio_get_value(WLAN_DATA0); rf_data_received |= (rf_bit << (count * 3 + 0)); if (count != 5) { rf_bit = gpio_get_value(WLAN_DATA1); rf_data_received |= (rf_bit << (count * 3 + 1)); rf_bit = gpio_get_value(WLAN_DATA2); rf_data_received |= (rf_bit << (count * 3 + 2)); } } gpio_set_value(WLAN_SET, 0); wcnss_switch_to_5wire(); return rf_data_received; } arch/arm/mach-msm/include/mach/board.h +7 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,12 @@ #define RF_TYPE_48 0x30 #define RF_TYPE_49 0x31 #define WLAN_RF_REG_ADDR_START_OFFSET 0x3 #define WLAN_RF_REG_DATA_START_OFFSET 0xf #define WLAN_RF_READ_REG_CMD 0x3 #define WLAN_RF_WRITE_REG_CMD 0x2 #define WLAN_RF_READ_CMD_MASK 0x3fff struct msm_camera_io_ext { uint32_t mdcphy; uint32_t mdcsz; Loading Loading @@ -690,4 +696,5 @@ int smd_debugfs_init(void); static inline int smd_debugfs_init(void) { return 0; } #endif u32 wcnss_rf_read_reg(u32 rf_reg_addr); #endif drivers/net/wireless/wcnss/wcnss_wlan.c +22 −3 Original line number Diff line number Diff line Loading @@ -35,11 +35,12 @@ #include <linux/rwsem.h> #include <linux/mfd/pm8xxx/misc.h> #include <linux/qpnp/qpnp-adc.h> #include <soc/qcom/subsystem_restart.h> #include <soc/qcom/subsystem_notif.h> #include <soc/qcom/smd.h> #include <mach/board.h> #include <mach/msm_iomap.h> #ifdef CONFIG_WCNSS_MEM_PRE_ALLOC Loading Loading @@ -795,6 +796,22 @@ void wcnss_pronto_log_debug_regs(void) EXPORT_SYMBOL(wcnss_pronto_log_debug_regs); #ifdef CONFIG_WCNSS_REGISTER_DUMP_ON_BITE static void wcnss_log_iris_regs(void) { int i; u32 reg_val; u32 regs_array[] = { 0x04, 0x05, 0x11, 0x1e, 0x40, 0x48, 0x49, 0x4b, 0x00, 0x01, 0x4d}; pr_info("IRIS Registers [address] : value\n"); for (i = 0; i < ARRAY_SIZE(regs_array); i++) { reg_val = wcnss_rf_read_reg(regs_array[i]); pr_info("[0x%08x] : 0x%08x\n", regs_array[i], reg_val); } } void wcnss_log_debug_regs_on_bite(void) { struct platform_device *pdev = wcnss_get_platform_device(); Loading @@ -815,10 +832,12 @@ void wcnss_log_debug_regs_on_bite(void) clk_rate = clk_get_rate(measure); pr_debug("wcnss: clock frequency is: %luHz\n", clk_rate); if (clk_rate) if (clk_rate) { wcnss_pronto_log_debug_regs(); else } else { pr_err("clock frequency is zero, cannot access PMU or other registers\n"); wcnss_log_iris_regs(); } } } #endif Loading Loading
arch/arm/mach-msm/board-8226-gpiomux.c +163 −0 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ * */ #include <linux/gpio.h> #include <linux/init.h> #include <linux/ioport.h> #include <mach/board.h> Loading @@ -18,6 +19,12 @@ #include <mach/gpiomux.h> #include <soc/qcom/socinfo.h> #define WLAN_CLK 44 #define WLAN_SET 43 #define WLAN_DATA0 42 #define WLAN_DATA1 41 #define WLAN_DATA2 40 #ifdef CONFIG_USB_EHCI_MSM_HSIC static struct gpiomux_setting hsic_sus_cfg = { .func = GPIOMUX_FUNC_GPIO, Loading Loading @@ -140,6 +147,18 @@ static struct gpiomux_setting wcnss_5wire_active_cfg = { .pull = GPIOMUX_PULL_DOWN, }; static struct gpiomux_setting wcnss_5gpio_suspend_cfg = { .func = GPIOMUX_FUNC_GPIO, .drv = GPIOMUX_DRV_2MA, .pull = GPIOMUX_PULL_UP, }; static struct gpiomux_setting wcnss_5gpio_active_cfg = { .func = GPIOMUX_FUNC_GPIO, .drv = GPIOMUX_DRV_6MA, .pull = GPIOMUX_PULL_DOWN, }; static struct gpiomux_setting gpio_i2c_config = { .func = GPIOMUX_FUNC_3, .drv = GPIOMUX_DRV_2MA, Loading Loading @@ -520,6 +539,44 @@ static struct msm_gpiomux_config wcnss_5wire_interface[] = { }, }; static struct msm_gpiomux_config wcnss_5gpio_interface[] = { { .gpio = 40, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, { .gpio = 41, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, { .gpio = 42, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, { .gpio = 43, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, { .gpio = 44, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, }; static struct gpiomux_setting gpio_suspend_config[] = { { .func = GPIOMUX_FUNC_GPIO, /* IN-NP */ Loading Loading @@ -861,3 +918,109 @@ void __init msm8226_init_gpiomux(void) msm_gpiomux_install(msm_hsic_configs, ARRAY_SIZE(msm_hsic_configs)); #endif } static void wcnss_switch_to_gpio(void) { /* Switch MUX to GPIO */ msm_gpiomux_install(wcnss_5gpio_interface, ARRAY_SIZE(wcnss_5gpio_interface)); /* Ensure GPIO config */ gpio_direction_input(WLAN_DATA2); gpio_direction_input(WLAN_DATA1); gpio_direction_input(WLAN_DATA0); gpio_direction_output(WLAN_SET, 0); gpio_direction_output(WLAN_CLK, 0); } static void wcnss_switch_to_5wire(void) { msm_gpiomux_install(wcnss_5wire_interface, ARRAY_SIZE(wcnss_5wire_interface)); } u32 wcnss_rf_read_reg(u32 rf_reg_addr) { int count = 0; u32 rf_cmd_and_addr = 0; u32 rf_data_received = 0; u32 rf_bit = 0; wcnss_switch_to_gpio(); /* Reset the signal if it is already being used. */ gpio_set_value(WLAN_SET, 0); gpio_set_value(WLAN_CLK, 0); /* We start with cmd_set high WLAN_SET = 1. */ gpio_set_value(WLAN_SET, 1); gpio_direction_output(WLAN_DATA0, 1); gpio_direction_output(WLAN_DATA1, 1); gpio_direction_output(WLAN_DATA2, 1); gpio_set_value(WLAN_DATA0, 0); gpio_set_value(WLAN_DATA1, 0); gpio_set_value(WLAN_DATA2, 0); /* Prepare command and RF register address that need to sent out. * Make sure that we send only 14 bits from LSB. */ rf_cmd_and_addr = (((WLAN_RF_READ_REG_CMD) | (rf_reg_addr << WLAN_RF_REG_ADDR_START_OFFSET)) & WLAN_RF_READ_CMD_MASK); for (count = 0; count < 5; count++) { gpio_set_value(WLAN_CLK, 0); rf_bit = (rf_cmd_and_addr & 0x1); gpio_set_value(WLAN_DATA0, rf_bit ? 1 : 0); rf_cmd_and_addr = (rf_cmd_and_addr >> 1); rf_bit = (rf_cmd_and_addr & 0x1); gpio_set_value(WLAN_DATA1, rf_bit ? 1 : 0); rf_cmd_and_addr = (rf_cmd_and_addr >> 1); rf_bit = (rf_cmd_and_addr & 0x1); gpio_set_value(WLAN_DATA2, rf_bit ? 1 : 0); rf_cmd_and_addr = (rf_cmd_and_addr >> 1); /* Send the data out WLAN_CLK = 1 */ gpio_set_value(WLAN_CLK, 1); } /* Pull down the clock signal */ gpio_set_value(WLAN_CLK, 0); /* Configure data pins to input IO pins */ gpio_direction_input(WLAN_DATA0); gpio_direction_input(WLAN_DATA1); gpio_direction_input(WLAN_DATA2); for (count = 0; count < 2; count++) { gpio_set_value(WLAN_CLK, 1); gpio_set_value(WLAN_CLK, 0); } rf_bit = 0; for (count = 0; count < 6; count++) { gpio_set_value(WLAN_CLK, 1); gpio_set_value(WLAN_CLK, 0); rf_bit = gpio_get_value(WLAN_DATA0); rf_data_received |= (rf_bit << (count * 3 + 0)); if (count != 5) { rf_bit = gpio_get_value(WLAN_DATA1); rf_data_received |= (rf_bit << (count * 3 + 1)); rf_bit = gpio_get_value(WLAN_DATA2); rf_data_received |= (rf_bit << (count * 3 + 2)); } } gpio_set_value(WLAN_SET, 0); wcnss_switch_to_5wire(); return rf_data_received; }
arch/arm/mach-msm/board-8610-gpiomux.c +163 −0 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ * */ #include <linux/gpio.h> #include <linux/init.h> #include <linux/ioport.h> #include <mach/board.h> Loading @@ -18,6 +19,12 @@ #include <mach/gpiomux.h> #include <soc/qcom/socinfo.h> #define WLAN_CLK 27 #define WLAN_SET 26 #define WLAN_DATA0 25 #define WLAN_DATA1 24 #define WLAN_DATA2 23 static struct gpiomux_setting gpio_spi_config = { .func = GPIOMUX_FUNC_1, .drv = GPIOMUX_DRV_6MA, Loading Loading @@ -112,6 +119,18 @@ static struct gpiomux_setting wcnss_5wire_active_cfg = { .pull = GPIOMUX_PULL_DOWN, }; static struct gpiomux_setting wcnss_5gpio_suspend_cfg = { .func = GPIOMUX_FUNC_GPIO, .drv = GPIOMUX_DRV_2MA, .pull = GPIOMUX_PULL_UP, }; static struct gpiomux_setting wcnss_5gpio_active_cfg = { .func = GPIOMUX_FUNC_GPIO, .drv = GPIOMUX_DRV_6MA, .pull = GPIOMUX_PULL_DOWN, }; static struct gpiomux_setting lcd_en_act_cfg = { .func = GPIOMUX_FUNC_GPIO, .drv = GPIOMUX_DRV_8MA, Loading Loading @@ -404,6 +423,44 @@ static struct msm_gpiomux_config wcnss_5wire_interface[] = { }, }; static struct msm_gpiomux_config wcnss_5gpio_interface[] = { { .gpio = 23, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, { .gpio = 24, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, { .gpio = 25, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, { .gpio = 26, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, { .gpio = 27, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, }; static struct gpiomux_setting gpio_suspend_config[] = { { .func = GPIOMUX_FUNC_GPIO, /* IN-NP */ Loading Loading @@ -663,3 +720,109 @@ void __init msm8610_init_gpiomux(void) ARRAY_SIZE(msm_non_qrd_configs)); } } static void wcnss_switch_to_gpio(void) { /* Switch MUX to GPIO */ msm_gpiomux_install(wcnss_5gpio_interface, ARRAY_SIZE(wcnss_5gpio_interface)); /* Ensure GPIO config */ gpio_direction_input(WLAN_DATA2); gpio_direction_input(WLAN_DATA1); gpio_direction_input(WLAN_DATA0); gpio_direction_output(WLAN_SET, 0); gpio_direction_output(WLAN_CLK, 0); } static void wcnss_switch_to_5wire(void) { msm_gpiomux_install(wcnss_5wire_interface, ARRAY_SIZE(wcnss_5wire_interface)); } u32 wcnss_rf_read_reg(u32 rf_reg_addr) { int count = 0; u32 rf_cmd_and_addr = 0; u32 rf_data_received = 0; u32 rf_bit = 0; wcnss_switch_to_gpio(); /* Reset the signal if it is already being used. */ gpio_set_value(WLAN_SET, 0); gpio_set_value(WLAN_CLK, 0); /* We start with cmd_set high WLAN_SET = 1. */ gpio_set_value(WLAN_SET, 1); gpio_direction_output(WLAN_DATA0, 1); gpio_direction_output(WLAN_DATA1, 1); gpio_direction_output(WLAN_DATA2, 1); gpio_set_value(WLAN_DATA0, 0); gpio_set_value(WLAN_DATA1, 0); gpio_set_value(WLAN_DATA2, 0); /* Prepare command and RF register address that need to sent out. * Make sure that we send only 14 bits from LSB. */ rf_cmd_and_addr = (((WLAN_RF_READ_REG_CMD) | (rf_reg_addr << WLAN_RF_REG_ADDR_START_OFFSET)) & WLAN_RF_READ_CMD_MASK); for (count = 0; count < 5; count++) { gpio_set_value(WLAN_CLK, 0); rf_bit = (rf_cmd_and_addr & 0x1); gpio_set_value(WLAN_DATA0, rf_bit ? 1 : 0); rf_cmd_and_addr = (rf_cmd_and_addr >> 1); rf_bit = (rf_cmd_and_addr & 0x1); gpio_set_value(WLAN_DATA1, rf_bit ? 1 : 0); rf_cmd_and_addr = (rf_cmd_and_addr >> 1); rf_bit = (rf_cmd_and_addr & 0x1); gpio_set_value(WLAN_DATA2, rf_bit ? 1 : 0); rf_cmd_and_addr = (rf_cmd_and_addr >> 1); /* Send the data out WLAN_CLK = 1 */ gpio_set_value(WLAN_CLK, 1); } /* Pull down the clock signal */ gpio_set_value(WLAN_CLK, 0); /* Configure data pins to input IO pins */ gpio_direction_input(WLAN_DATA0); gpio_direction_input(WLAN_DATA1); gpio_direction_input(WLAN_DATA2); for (count = 0; count < 2; count++) { gpio_set_value(WLAN_CLK, 1); gpio_set_value(WLAN_CLK, 0); } rf_bit = 0; for (count = 0; count < 6; count++) { gpio_set_value(WLAN_CLK, 1); gpio_set_value(WLAN_CLK, 0); rf_bit = gpio_get_value(WLAN_DATA0); rf_data_received |= (rf_bit << (count * 3 + 0)); if (count != 5) { rf_bit = gpio_get_value(WLAN_DATA1); rf_data_received |= (rf_bit << (count * 3 + 1)); rf_bit = gpio_get_value(WLAN_DATA2); rf_data_received |= (rf_bit << (count * 3 + 2)); } } gpio_set_value(WLAN_SET, 0); wcnss_switch_to_5wire(); return rf_data_received; }
arch/arm/mach-msm/board-8974-gpiomux.c +162 −0 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ * */ #include <linux/gpio.h> #include <linux/init.h> #include <linux/ioport.h> #include <mach/board.h> Loading @@ -20,6 +21,12 @@ #define KS8851_IRQ_GPIO 94 #define WLAN_CLK 40 #define WLAN_SET 39 #define WLAN_DATA0 38 #define WLAN_DATA1 37 #define WLAN_DATA2 36 static struct gpiomux_setting ap2mdm_cfg = { .func = GPIOMUX_FUNC_GPIO, .drv = GPIOMUX_DRV_8MA, Loading Loading @@ -205,6 +212,18 @@ static struct gpiomux_setting wcnss_5wire_active_cfg = { .pull = GPIOMUX_PULL_DOWN, }; static struct gpiomux_setting wcnss_5gpio_suspend_cfg = { .func = GPIOMUX_FUNC_GPIO, .drv = GPIOMUX_DRV_2MA, .pull = GPIOMUX_PULL_UP, }; static struct gpiomux_setting wcnss_5gpio_active_cfg = { .func = GPIOMUX_FUNC_GPIO, .drv = GPIOMUX_DRV_6MA, .pull = GPIOMUX_PULL_DOWN, }; static struct gpiomux_setting ath_gpio_active_cfg = { .func = GPIOMUX_FUNC_GPIO, .drv = GPIOMUX_DRV_2MA, Loading Loading @@ -1155,6 +1174,43 @@ static struct msm_gpiomux_config wcnss_5wire_interface[] = { }, }; static struct msm_gpiomux_config wcnss_5gpio_interface[] = { { .gpio = 36, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, { .gpio = 37, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, { .gpio = 38, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, { .gpio = 39, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, { .gpio = 40, .settings = { [GPIOMUX_ACTIVE] = &wcnss_5gpio_active_cfg, [GPIOMUX_SUSPENDED] = &wcnss_5gpio_suspend_cfg, }, }, }; static struct msm_gpiomux_config ath_gpio_configs[] = { { Loading Loading @@ -1526,3 +1582,109 @@ void __init msm_8974_init_gpiomux(void) msm_gpiomux_install(apq8074_interposer_config, ARRAY_SIZE(apq8074_interposer_config)); } static void wcnss_switch_to_gpio(void) { /* Switch MUX to GPIO */ msm_gpiomux_install(wcnss_5gpio_interface, ARRAY_SIZE(wcnss_5gpio_interface)); /* Ensure GPIO config */ gpio_direction_input(WLAN_DATA2); gpio_direction_input(WLAN_DATA1); gpio_direction_input(WLAN_DATA0); gpio_direction_output(WLAN_SET, 0); gpio_direction_output(WLAN_CLK, 0); } static void wcnss_switch_to_5wire(void) { msm_gpiomux_install(wcnss_5wire_interface, ARRAY_SIZE(wcnss_5wire_interface)); } u32 wcnss_rf_read_reg(u32 rf_reg_addr) { int count = 0; u32 rf_cmd_and_addr = 0; u32 rf_data_received = 0; u32 rf_bit = 0; wcnss_switch_to_gpio(); /* Reset the signal if it is already being used. */ gpio_set_value(WLAN_SET, 0); gpio_set_value(WLAN_CLK, 0); /* We start with cmd_set high WLAN_SET = 1. */ gpio_set_value(WLAN_SET, 1); gpio_direction_output(WLAN_DATA0, 1); gpio_direction_output(WLAN_DATA1, 1); gpio_direction_output(WLAN_DATA2, 1); gpio_set_value(WLAN_DATA0, 0); gpio_set_value(WLAN_DATA1, 0); gpio_set_value(WLAN_DATA2, 0); /* Prepare command and RF register address that need to sent out. * Make sure that we send only 14 bits from LSB. */ rf_cmd_and_addr = (((WLAN_RF_READ_REG_CMD) | (rf_reg_addr << WLAN_RF_REG_ADDR_START_OFFSET)) & WLAN_RF_READ_CMD_MASK); for (count = 0; count < 5; count++) { gpio_set_value(WLAN_CLK, 0); rf_bit = (rf_cmd_and_addr & 0x1); gpio_set_value(WLAN_DATA0, rf_bit ? 1 : 0); rf_cmd_and_addr = (rf_cmd_and_addr >> 1); rf_bit = (rf_cmd_and_addr & 0x1); gpio_set_value(WLAN_DATA1, rf_bit ? 1 : 0); rf_cmd_and_addr = (rf_cmd_and_addr >> 1); rf_bit = (rf_cmd_and_addr & 0x1); gpio_set_value(WLAN_DATA2, rf_bit ? 1 : 0); rf_cmd_and_addr = (rf_cmd_and_addr >> 1); /* Send the data out WLAN_CLK = 1 */ gpio_set_value(WLAN_CLK, 1); } /* Pull down the clock signal */ gpio_set_value(WLAN_CLK, 0); /* Configure data pins to input IO pins */ gpio_direction_input(WLAN_DATA0); gpio_direction_input(WLAN_DATA1); gpio_direction_input(WLAN_DATA2); for (count = 0; count < 2; count++) { gpio_set_value(WLAN_CLK, 1); gpio_set_value(WLAN_CLK, 0); } rf_bit = 0; for (count = 0; count < 6; count++) { gpio_set_value(WLAN_CLK, 1); gpio_set_value(WLAN_CLK, 0); rf_bit = gpio_get_value(WLAN_DATA0); rf_data_received |= (rf_bit << (count * 3 + 0)); if (count != 5) { rf_bit = gpio_get_value(WLAN_DATA1); rf_data_received |= (rf_bit << (count * 3 + 1)); rf_bit = gpio_get_value(WLAN_DATA2); rf_data_received |= (rf_bit << (count * 3 + 2)); } } gpio_set_value(WLAN_SET, 0); wcnss_switch_to_5wire(); return rf_data_received; }
arch/arm/mach-msm/include/mach/board.h +7 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,12 @@ #define RF_TYPE_48 0x30 #define RF_TYPE_49 0x31 #define WLAN_RF_REG_ADDR_START_OFFSET 0x3 #define WLAN_RF_REG_DATA_START_OFFSET 0xf #define WLAN_RF_READ_REG_CMD 0x3 #define WLAN_RF_WRITE_REG_CMD 0x2 #define WLAN_RF_READ_CMD_MASK 0x3fff struct msm_camera_io_ext { uint32_t mdcphy; uint32_t mdcsz; Loading Loading @@ -690,4 +696,5 @@ int smd_debugfs_init(void); static inline int smd_debugfs_init(void) { return 0; } #endif u32 wcnss_rf_read_reg(u32 rf_reg_addr); #endif
drivers/net/wireless/wcnss/wcnss_wlan.c +22 −3 Original line number Diff line number Diff line Loading @@ -35,11 +35,12 @@ #include <linux/rwsem.h> #include <linux/mfd/pm8xxx/misc.h> #include <linux/qpnp/qpnp-adc.h> #include <soc/qcom/subsystem_restart.h> #include <soc/qcom/subsystem_notif.h> #include <soc/qcom/smd.h> #include <mach/board.h> #include <mach/msm_iomap.h> #ifdef CONFIG_WCNSS_MEM_PRE_ALLOC Loading Loading @@ -795,6 +796,22 @@ void wcnss_pronto_log_debug_regs(void) EXPORT_SYMBOL(wcnss_pronto_log_debug_regs); #ifdef CONFIG_WCNSS_REGISTER_DUMP_ON_BITE static void wcnss_log_iris_regs(void) { int i; u32 reg_val; u32 regs_array[] = { 0x04, 0x05, 0x11, 0x1e, 0x40, 0x48, 0x49, 0x4b, 0x00, 0x01, 0x4d}; pr_info("IRIS Registers [address] : value\n"); for (i = 0; i < ARRAY_SIZE(regs_array); i++) { reg_val = wcnss_rf_read_reg(regs_array[i]); pr_info("[0x%08x] : 0x%08x\n", regs_array[i], reg_val); } } void wcnss_log_debug_regs_on_bite(void) { struct platform_device *pdev = wcnss_get_platform_device(); Loading @@ -815,10 +832,12 @@ void wcnss_log_debug_regs_on_bite(void) clk_rate = clk_get_rate(measure); pr_debug("wcnss: clock frequency is: %luHz\n", clk_rate); if (clk_rate) if (clk_rate) { wcnss_pronto_log_debug_regs(); else } else { pr_err("clock frequency is zero, cannot access PMU or other registers\n"); wcnss_log_iris_regs(); } } } #endif Loading