diff options
Diffstat (limited to 'drivers/staging/cg2900')
-rw-r--r-- | drivers/staging/cg2900/Makefile | 12 | ||||
-rw-r--r-- | drivers/staging/cg2900/board-u5500-cg2900.c | 154 | ||||
-rw-r--r-- | drivers/staging/cg2900/board-ux500-cg2900.c (renamed from drivers/staging/cg2900/board-mop500-cg2900.c) | 140 | ||||
-rw-r--r-- | drivers/staging/cg2900/devices-cg2900-u5500.c | 64 | ||||
-rw-r--r-- | drivers/staging/cg2900/devices-cg2900-ux500.c (renamed from drivers/staging/cg2900/devices-cg2900-u8500.c) | 52 | ||||
-rw-r--r-- | drivers/staging/cg2900/devices-cg2900.c | 30 | ||||
-rw-r--r-- | drivers/staging/cg2900/devices-cg2900.h | 6 |
7 files changed, 164 insertions, 294 deletions
diff --git a/drivers/staging/cg2900/Makefile b/drivers/staging/cg2900/Makefile index d68b9ae9991..14e2847bacf 100644 --- a/drivers/staging/cg2900/Makefile +++ b/drivers/staging/cg2900/Makefile @@ -7,15 +7,9 @@ ccflags-y := \ -Iarch/arm/mach-ux500 obj-$(CONFIG_CG2900) += devices-cg2900.o \ - devices-cg2900-u5500.o devices-cg2900-u8500.o \ - clock-cg2900.o - -ifeq ($(CONFIG_UX500_SOC_DB8500), y) -obj-$(CONFIG_CG2900) += board-mop500-cg2900.o -endif -ifeq ($(CONFIG_UX500_SOC_DB5500), y) -obj-$(CONFIG_CG2900) += board-u5500-cg2900.o -endif + devices-cg2900-ux500.o \ + board-ux500-cg2900.o \ + clock-cg2900.o obj-y += mfd/ obj-y += bluetooth/ diff --git a/drivers/staging/cg2900/board-u5500-cg2900.c b/drivers/staging/cg2900/board-u5500-cg2900.c deleted file mode 100644 index d6ca7b4c858..00000000000 --- a/drivers/staging/cg2900/board-u5500-cg2900.c +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright (C) ST-Ericsson SA 2011 - * - * License terms: GNU General Public License (GPL) version 2 - */ - -#include <linux/platform_device.h> -#include <linux/gpio.h> -#include <linux/gpio/nomadik.h> - -#include <net/bluetooth/bluetooth.h> -#include <net/bluetooth/hci.h> - -#include <plat/pincfg.h> - -#include "devices-cg2900.h" -#include "pins-db5500.h" - -#define CG2900_BT_CTS_GPIO 168 - -enum cg2900_gpio_pull_sleep cg2900_u5500_sleep_gpio[21] = { - CG2900_NO_PULL, /* GPIO 0: PTA_CONFX */ - CG2900_PULL_DN, /* GPIO 1: PTA_STATUS */ - CG2900_NO_PULL, /* GPIO 2: UART_CTSN */ - CG2900_PULL_UP, /* GPIO 3: UART_RTSN */ - CG2900_PULL_UP, /* GPIO 4: UART_TXD */ - CG2900_NO_PULL, /* GPIO 5: UART_RXD */ - CG2900_PULL_DN, /* GPIO 6: IOM_DOUT */ - CG2900_NO_PULL, /* GPIO 7: IOM_FSC */ - CG2900_NO_PULL, /* GPIO 8: IOM_CLK */ - CG2900_NO_PULL, /* GPIO 9: IOM_DIN */ - CG2900_PULL_DN, /* GPIO 10: PWR_REQ */ - CG2900_PULL_DN, /* GPIO 11: HOST_WAKEUP */ - CG2900_PULL_DN, /* GPIO 12: IIS_DOUT */ - CG2900_NO_PULL, /* GPIO 13: IIS_WS */ - CG2900_NO_PULL, /* GPIO 14: IIS_CLK */ - CG2900_NO_PULL, /* GPIO 15: IIS_DIN */ - CG2900_PULL_DN, /* GPIO 16: PTA_FREQ */ - CG2900_PULL_DN, /* GPIO 17: PTA_RF_ACTIVE */ - CG2900_NO_PULL, /* GPIO 18: NotConnected (J6428) */ - CG2900_NO_PULL, /* GPIO 19: EXT_DUTY_CYCLE */ - CG2900_NO_PULL, /* GPIO 20: EXT_FRM_SYNCH */ -}; - -static struct platform_device ux500_cg2900_device = { - .name = "cg2900", -}; - -static struct platform_device ux500_cg2900_chip_device = { - .name = "cg2900-chip", - .dev = { - .parent = &ux500_cg2900_device.dev, - }, -}; - -static struct cg2900_platform_data cg2900_test_platform_data = { - .bus = HCI_VIRTUAL, - .gpio_sleep = cg2900_u5500_sleep_gpio, -}; - -static struct platform_device ux500_cg2900_test_device = { - .name = "cg2900-test", - .dev = { - .parent = &ux500_cg2900_device.dev, - .platform_data = &cg2900_test_platform_data, - }, -}; - -static struct resource cg2900_uart_resources[] = { - { - .start = CG2900_BT_CTS_GPIO, - .end = CG2900_BT_CTS_GPIO, - .flags = IORESOURCE_IO, - .name = "cts_gpio", - }, - { - .start = NOMADIK_GPIO_TO_IRQ(CG2900_BT_CTS_GPIO), - .end = NOMADIK_GPIO_TO_IRQ(CG2900_BT_CTS_GPIO), - .flags = IORESOURCE_IRQ, - .name = "cts_irq", - }, -}; - -static pin_cfg_t cg2900_uart_enabled[] = { - GPIO165_U3_RXD | PIN_INPUT_PULLUP, - GPIO166_U3_TXD | PIN_OUTPUT_HIGH, - GPIO167_U3_RTSn | PIN_OUTPUT_HIGH, - GPIO168_U3_CTSn | PIN_INPUT_PULLUP, -}; - -static pin_cfg_t cg2900_uart_disabled[] = { - GPIO165_GPIO | PIN_INPUT_PULLUP, /* RX pull down. */ - GPIO166_GPIO | PIN_OUTPUT_LOW, /* TX low - break on. */ - GPIO167_GPIO | PIN_OUTPUT_HIGH, /* RTS high-flow off. */ - GPIO168_GPIO | PIN_INPUT_PULLUP, /* CTS pull up. */ -}; - -static struct cg2900_platform_data cg2900_uart_platform_data = { - .bus = HCI_UART, - .gpio_sleep = cg2900_u5500_sleep_gpio, - .uart = { - .n_uart_gpios = 4, - .uart_enabled = cg2900_uart_enabled, - .uart_disabled = cg2900_uart_disabled, - }, -}; - -static struct platform_device ux500_cg2900_uart_device = { - .name = "cg2900-uart", - .dev = { - .platform_data = &cg2900_uart_platform_data, - .parent = &ux500_cg2900_device.dev, - }, - .num_resources = ARRAY_SIZE(cg2900_uart_resources), - .resource = cg2900_uart_resources, -}; - -static int __init u5500_cg2900_init(void) -{ - int err; - - dcg2900_init_platdata(&cg2900_test_platform_data); - dcg2900_init_platdata(&cg2900_uart_platform_data); - - err = platform_device_register(&ux500_cg2900_device); - if (err) - return err; - err = platform_device_register(&ux500_cg2900_uart_device); - if (err) - return err; - err = platform_device_register(&ux500_cg2900_test_device); - if (err) - return err; - err = platform_device_register(&ux500_cg2900_chip_device); - if (err) - return err; - - dev_info(&ux500_cg2900_device.dev, "CG2900 initialized\n"); - - return 0; -} - -static void __exit u5500_cg2900_exit(void) -{ - platform_device_unregister(&ux500_cg2900_chip_device); - platform_device_unregister(&ux500_cg2900_test_device); - platform_device_unregister(&ux500_cg2900_uart_device); - platform_device_unregister(&ux500_cg2900_device); - - dev_info(&ux500_cg2900_device.dev, "CG2900 removed\n"); -} - -module_init(u5500_cg2900_init); -module_exit(u5500_cg2900_exit); diff --git a/drivers/staging/cg2900/board-mop500-cg2900.c b/drivers/staging/cg2900/board-ux500-cg2900.c index 5f40941a5f1..bd81f68fdc6 100644 --- a/drivers/staging/cg2900/board-mop500-cg2900.c +++ b/drivers/staging/cg2900/board-ux500-cg2900.c @@ -1,7 +1,8 @@ /* - * Copyright (C) 2008-2011 ST-Ericsson + * Copyright (C) ST-Ericsson SA 2011 * * Author: Par-Gunnar Hjalmdahl <par-gunnar.p.hjalmdahl@stericsson.com> + * Author: Hemant Gupta <hemant.gupta@stericsson.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as @@ -10,32 +11,32 @@ */ #include <asm/mach-types.h> - #include <linux/gpio.h> #include <linux/gpio/nomadik.h> #include <linux/ioport.h> -#include <linux/platform_device.h> #include <linux/mfd/ab8500/gpio.h> - +#include <linux/platform_device.h> +#include <mach/gpio.h> +#include <mach/id.h> #include <net/bluetooth/bluetooth.h> #include <net/bluetooth/hci.h> - #include <plat/pincfg.h> -#include <mach/gpio.h> +#include "board-mop500.h" #include "cg2900.h" #include "devices-cg2900.h" +#include "pins-db5500.h" #include "pins-db8500.h" #include "pins.h" -#include "board-mop500.h" #define CG2900_BT_ENABLE_GPIO 170 #define CG2900_GBF_ENA_RESET_GPIO 171 #define WLAN_PMU_EN_GPIO 226 #define WLAN_PMU_EN_GPIO_U9500 AB8500_PIN_GPIO11 -#define CG2900_BT_CTS_GPIO 0 +#define CG2900_UX500_BT_CTS_GPIO 0 +#define CG2900_U5500_BT_CTS_GPIO 168 -enum cg2900_gpio_pull_sleep cg2900_sleep_gpio[21] = { +enum cg2900_gpio_pull_sleep ux500_cg2900_sleep_gpio[21] = { CG2900_NO_PULL, /* GPIO 0: PTA_CONFX */ CG2900_PULL_DN, /* GPIO 1: PTA_STATUS */ CG2900_NO_PULL, /* GPIO 2: UART_CTSN */ @@ -77,16 +78,16 @@ static struct platform_device ux500_stlc2690_chip_device = { }, }; -static struct cg2900_platform_data cg2900_test_platform_data = { +static struct cg2900_platform_data ux500_cg2900_test_platform_data = { .bus = HCI_VIRTUAL, - .gpio_sleep = cg2900_sleep_gpio, + .gpio_sleep = ux500_cg2900_sleep_gpio, }; static struct platform_device ux500_cg2900_test_device = { .name = "cg2900-test", .dev = { .parent = &ux500_cg2900_device.dev, - .platform_data = &cg2900_test_platform_data, + .platform_data = &ux500_cg2900_test_platform_data, }, }; @@ -104,20 +105,35 @@ static struct resource cg2900_uart_resources_pre_v60[] = { .name = "bt_enable", }, { - .start = CG2900_BT_CTS_GPIO, - .end = CG2900_BT_CTS_GPIO, + .start = CG2900_UX500_BT_CTS_GPIO, + .end = CG2900_UX500_BT_CTS_GPIO, .flags = IORESOURCE_IO, .name = "cts_gpio", }, { - .start = NOMADIK_GPIO_TO_IRQ(CG2900_BT_CTS_GPIO), - .end = NOMADIK_GPIO_TO_IRQ(CG2900_BT_CTS_GPIO), + .start = NOMADIK_GPIO_TO_IRQ(CG2900_UX500_BT_CTS_GPIO), + .end = NOMADIK_GPIO_TO_IRQ(CG2900_UX500_BT_CTS_GPIO), .flags = IORESOURCE_IRQ, .name = "cts_irq", }, }; -static struct resource cg2900_uart_resources[] = { +static struct resource cg2900_uart_resources_u5500[] = { + { + .start = CG2900_U5500_BT_CTS_GPIO, + .end = CG2900_U5500_BT_CTS_GPIO, + .flags = IORESOURCE_IO, + .name = "cts_gpio", + }, + { + .start = NOMADIK_GPIO_TO_IRQ(CG2900_U5500_BT_CTS_GPIO), + .end = NOMADIK_GPIO_TO_IRQ(CG2900_U5500_BT_CTS_GPIO), + .flags = IORESOURCE_IRQ, + .name = "cts_irq", + }, +}; + +static struct resource cg2900_uart_resources_u8500[] = { { .start = CG2900_GBF_ENA_RESET_GPIO, .end = CG2900_GBF_ENA_RESET_GPIO, @@ -131,14 +147,14 @@ static struct resource cg2900_uart_resources[] = { .name = "pmu_en", }, { - .start = CG2900_BT_CTS_GPIO, - .end = CG2900_BT_CTS_GPIO, + .start = CG2900_UX500_BT_CTS_GPIO, + .end = CG2900_UX500_BT_CTS_GPIO, .flags = IORESOURCE_IO, .name = "cts_gpio", }, { - .start = NOMADIK_GPIO_TO_IRQ(CG2900_BT_CTS_GPIO), - .end = NOMADIK_GPIO_TO_IRQ(CG2900_BT_CTS_GPIO), + .start = NOMADIK_GPIO_TO_IRQ(CG2900_UX500_BT_CTS_GPIO), + .end = NOMADIK_GPIO_TO_IRQ(CG2900_UX500_BT_CTS_GPIO), .flags = IORESOURCE_IRQ, .name = "cts_irq", }, @@ -158,48 +174,59 @@ static struct resource cg2900_uart_resources_u9500[] = { .name = "pmu_en", }, { - .start = CG2900_BT_CTS_GPIO, - .end = CG2900_BT_CTS_GPIO, + .start = CG2900_UX500_BT_CTS_GPIO, + .end = CG2900_UX500_BT_CTS_GPIO, .flags = IORESOURCE_IO, .name = "cts_gpio", }, { - .start = NOMADIK_GPIO_TO_IRQ(CG2900_BT_CTS_GPIO), - .end = NOMADIK_GPIO_TO_IRQ(CG2900_BT_CTS_GPIO), + .start = NOMADIK_GPIO_TO_IRQ(CG2900_UX500_BT_CTS_GPIO), + .end = NOMADIK_GPIO_TO_IRQ(CG2900_UX500_BT_CTS_GPIO), .flags = IORESOURCE_IRQ, .name = "cts_irq", }, }; -static pin_cfg_t cg2900_uart_enabled[] = { +static pin_cfg_t u5500_cg2900_uart_enabled[] = { + GPIO165_U3_RXD | PIN_INPUT_PULLUP, + GPIO166_U3_TXD | PIN_OUTPUT_HIGH, + GPIO167_U3_RTSn | PIN_OUTPUT_HIGH, + GPIO168_U3_CTSn | PIN_INPUT_PULLUP, +}; + +static pin_cfg_t u5500_cg2900_uart_disabled[] = { + GPIO165_GPIO | PIN_INPUT_PULLUP, /* RX pull down. */ + GPIO166_GPIO | PIN_OUTPUT_LOW, /* TX low - break on. */ + GPIO167_GPIO | PIN_OUTPUT_HIGH, /* RTS high-flow off. */ + GPIO168_GPIO | PIN_INPUT_PULLUP, /* CTS pull up. */ +}; + +static pin_cfg_t ux500_cg2900_uart_enabled[] = { GPIO0_U0_CTSn | PIN_INPUT_PULLUP, GPIO1_U0_RTSn | PIN_OUTPUT_HIGH, GPIO2_U0_RXD | PIN_INPUT_PULLUP, GPIO3_U0_TXD | PIN_OUTPUT_HIGH }; -static pin_cfg_t cg2900_uart_disabled[] = { +static pin_cfg_t ux500_cg2900_uart_disabled[] = { GPIO0_GPIO | PIN_INPUT_PULLUP, /* CTS pull up. */ GPIO1_GPIO | PIN_OUTPUT_HIGH, /* RTS high-flow off. */ GPIO2_GPIO | PIN_INPUT_PULLUP, /* RX pull down. */ GPIO3_GPIO | PIN_OUTPUT_LOW /* TX low - break on. */ }; -static struct cg2900_platform_data cg2900_uart_platform_data = { +static struct cg2900_platform_data ux500_cg2900_uart_platform_data = { .bus = HCI_UART, - .gpio_sleep = cg2900_sleep_gpio, + .gpio_sleep = ux500_cg2900_sleep_gpio, .uart = { .n_uart_gpios = 4, - .uart_enabled = cg2900_uart_enabled, - .uart_disabled = cg2900_uart_disabled, }, - .regulator_id = "vdd", }; static struct platform_device ux500_cg2900_uart_device = { .name = "cg2900-uart", .dev = { - .platform_data = &cg2900_uart_platform_data, + .platform_data = &ux500_cg2900_uart_platform_data, .parent = &ux500_cg2900_device.dev, }, }; @@ -223,24 +250,47 @@ static int __init board_cg2900_init(void) if (!mach_supported()) return 0; - dcg2900_init_platdata(&cg2900_test_platform_data); - dcg2900_init_platdata(&cg2900_uart_platform_data); + dcg2900_init_platdata(&ux500_cg2900_test_platform_data); + if (machine_is_u5500()) { + ux500_cg2900_uart_platform_data.uart.uart_enabled = + u5500_cg2900_uart_enabled; + ux500_cg2900_uart_platform_data.uart.uart_disabled = + u5500_cg2900_uart_disabled; + } else { + ux500_cg2900_uart_platform_data.uart.uart_enabled = + ux500_cg2900_uart_enabled; + ux500_cg2900_uart_platform_data.uart.uart_disabled = + ux500_cg2900_uart_disabled; + ux500_cg2900_uart_platform_data.regulator_id = "vdd"; + } + dcg2900_init_platdata(&ux500_cg2900_uart_platform_data); - if (pins_for_u9500()) { + if (cpu_is_u8500()) { + if (machine_is_hrefv60()) { + /* u8500 */ + ux500_cg2900_uart_device.num_resources = + ARRAY_SIZE(cg2900_uart_resources_u8500); + ux500_cg2900_uart_device.resource = + cg2900_uart_resources_u8500; + } else { + /* u8500 pre v60*/ + ux500_cg2900_uart_device.num_resources = + ARRAY_SIZE(cg2900_uart_resources_pre_v60); + ux500_cg2900_uart_device.resource = + cg2900_uart_resources_pre_v60; + } + } else if (cpu_is_u5500()) { + /* u5500 */ ux500_cg2900_uart_device.num_resources = - ARRAY_SIZE(cg2900_uart_resources_u9500); + ARRAY_SIZE(cg2900_uart_resources_u5500); ux500_cg2900_uart_device.resource = - cg2900_uart_resources_u9500; - } else if (machine_is_hrefv60()) { - ux500_cg2900_uart_device.num_resources = - ARRAY_SIZE(cg2900_uart_resources); - ux500_cg2900_uart_device.resource = - cg2900_uart_resources; + cg2900_uart_resources_u5500; } else { + /* u9500 */ ux500_cg2900_uart_device.num_resources = - ARRAY_SIZE(cg2900_uart_resources_pre_v60); + ARRAY_SIZE(cg2900_uart_resources_u9500); ux500_cg2900_uart_device.resource = - cg2900_uart_resources_pre_v60; + cg2900_uart_resources_u9500; } err = platform_device_register(&ux500_cg2900_device); diff --git a/drivers/staging/cg2900/devices-cg2900-u5500.c b/drivers/staging/cg2900/devices-cg2900-u5500.c deleted file mode 100644 index 39152e51295..00000000000 --- a/drivers/staging/cg2900/devices-cg2900-u5500.c +++ /dev/null @@ -1,64 +0,0 @@ -/* - * arch/arm/mach-ux500/devices-cg2900-u5500.c - * - * Copyright (C) ST-Ericsson SA 2010 - * Authors: - * Par-Gunnar Hjalmdahl (par-gunnar.p.hjalmdahl@stericsson.com) for ST-Ericsson. - * Henrik Possung (henrik.possung@stericsson.com) for ST-Ericsson. - * Josef Kindberg (josef.kindberg@stericsson.com) for ST-Ericsson. - * Dariusz Szymszak (dariusz.xd.szymczak@stericsson.com) for ST-Ericsson. - * Kjell Andersson (kjell.k.andersson@stericsson.com) for ST-Ericsson. - * License terms: GNU General Public License (GPL), version 2 - * - * Board specific device support for the Linux Bluetooth HCI H:4 Driver - * for ST-Ericsson connectivity controller. - */ - -#include <linux/delay.h> -#include <linux/kernel.h> -#include <linux/sched.h> -#include <linux/clk.h> -#include <linux/types.h> -#include <linux/mfd/abx500/ab5500.h> - -#include <linux/mfd/dbx500-prcmu.h> - -#include "devices-cg2900.h" - -/* prcmu resout1 pin is used for CG2900 reset*/ -void dcg2900_u5500_enable_chip(struct cg2900_chip_dev *dev) -{ - struct dcg2900_info *info = dev->b_data; - - clk_enable(info->lpoclk); - /* - * Due to a bug in CG2900 we cannot just set GPIO high to enable - * the chip. We must wait more than 100 msecs before enbling the - * chip. - * - Set PDB to low. - * - Wait for 100 msecs - * - Set PDB to high. - */ - prcmu_resetout(1, 0); - schedule_timeout_uninterruptible(msecs_to_jiffies( - CHIP_ENABLE_PDB_LOW_TIMEOUT)); - prcmu_resetout(1, 1); -} - -void dcg2900_u5500_disable_chip(struct cg2900_chip_dev *dev) -{ - struct dcg2900_info *info = dev->b_data; - - prcmu_resetout(1, 0); - clk_disable(info->lpoclk); -} - -int dcg2900_u5500_setup(struct cg2900_chip_dev *dev, - struct dcg2900_info *info) -{ - info->lpoclk = clk_get(dev->dev, "lpoclk"); - if (IS_ERR(info->lpoclk)) - return PTR_ERR(info->lpoclk); - - return 0; -} diff --git a/drivers/staging/cg2900/devices-cg2900-u8500.c b/drivers/staging/cg2900/devices-cg2900-ux500.c index f7ca62d5c68..7e7c12ce4a0 100644 --- a/drivers/staging/cg2900/devices-cg2900-u8500.c +++ b/drivers/staging/cg2900/devices-cg2900-ux500.c @@ -1,13 +1,12 @@ /* - * arch/arm/mach-ux500/devices-cg2900-u8500.c - * - * Copyright (C) ST-Ericsson SA 2010 + * Copyright (C) ST-Ericsson SA 2011 * Authors: * Par-Gunnar Hjalmdahl (par-gunnar.p.hjalmdahl@stericsson.com) for ST-Ericsson. * Henrik Possung (henrik.possung@stericsson.com) for ST-Ericsson. * Josef Kindberg (josef.kindberg@stericsson.com) for ST-Ericsson. * Dariusz Szymszak (dariusz.xd.szymczak@stericsson.com) for ST-Ericsson. * Kjell Andersson (kjell.k.andersson@stericsson.com) for ST-Ericsson. + * Hemant Gupta (hemant.gupta@stericsson.com) for ST-Ericsson. * License terms: GNU General Public License (GPL), version 2 * * Board specific device support for the Linux Bluetooth HCI H:4 Driver @@ -20,6 +19,8 @@ #include <linux/gpio.h> #include <linux/ioport.h> #include <linux/kernel.h> +#include <linux/mfd/abx500/ab5500.h> +#include <linux/mfd/dbx500-prcmu.h> #include <linux/platform_device.h> #include <linux/sched.h> #include <linux/string.h> @@ -28,7 +29,7 @@ #include "devices-cg2900.h" -void dcg2900_enable_chip(struct cg2900_chip_dev *dev) +void dcg2900_u8500_enable_chip(struct cg2900_chip_dev *dev) { struct dcg2900_info *info = dev->b_data; @@ -59,7 +60,7 @@ void dcg2900_enable_chip(struct cg2900_chip_dev *dev) gpio_set_value(info->gbf_gpio, 1); } -void dcg2900_disable_chip(struct cg2900_chip_dev *dev) +void dcg2900_u8500_disable_chip(struct cg2900_chip_dev *dev) { struct dcg2900_info *info = dev->b_data; @@ -69,7 +70,7 @@ void dcg2900_disable_chip(struct cg2900_chip_dev *dev) gpio_set_value(info->pmuen_gpio, 0); } -int dcg2900_setup(struct cg2900_chip_dev *dev, +int dcg2900_u8500_setup(struct cg2900_chip_dev *dev, struct dcg2900_info *info) { int err = 0; @@ -177,3 +178,42 @@ err_handling: return err; } + +/* prcmu resout1 pin is used for CG2900 reset*/ +void dcg2900_u5500_enable_chip(struct cg2900_chip_dev *dev) +{ + struct dcg2900_info *info = dev->b_data; + + clk_enable(info->lpoclk); + /* + * Due to a bug in CG2900 we cannot just set GPIO high to enable + * the chip. We must wait more than 100 msecs before enbling the + * chip. + * - Set PDB to low. + * - Wait for 100 msecs + * - Set PDB to high. + */ + prcmu_resetout(1, 0); + schedule_timeout_uninterruptible(msecs_to_jiffies( + CHIP_ENABLE_PDB_LOW_TIMEOUT)); + prcmu_resetout(1, 1); +} + +void dcg2900_u5500_disable_chip(struct cg2900_chip_dev *dev) +{ + struct dcg2900_info *info = dev->b_data; + + prcmu_resetout(1, 0); + clk_disable(info->lpoclk); +} + +int dcg2900_u5500_setup(struct cg2900_chip_dev *dev, + struct dcg2900_info *info) +{ + info->lpoclk = clk_get(dev->dev, "lpoclk"); + if (IS_ERR(info->lpoclk)) + return PTR_ERR(info->lpoclk); + + return 0; +} + diff --git a/drivers/staging/cg2900/devices-cg2900.c b/drivers/staging/cg2900/devices-cg2900.c index a0cc9aeff81..4a13094a955 100644 --- a/drivers/staging/cg2900/devices-cg2900.c +++ b/drivers/staging/cg2900/devices-cg2900.c @@ -6,6 +6,7 @@ * Josef Kindberg (josef.kindberg@stericsson.com) for ST-Ericsson. * Dariusz Szymszak (dariusz.xd.szymczak@stericsson.com) for ST-Ericsson. * Kjell Andersson (kjell.k.andersson@stericsson.com) for ST-Ericsson. + * Hemant Gupta (hemant.gupta@stericsson.com) for ST-Ericsson. * License terms: GNU General Public License (GPL), version 2 * * Board specific device support for the Linux Bluetooth HCI H:4 Driver @@ -17,6 +18,7 @@ #include <asm/byteorder.h> #include <asm-generic/errno-base.h> +#include <asm/mach-types.h> #include <linux/delay.h> #include <linux/gpio.h> #include <linux/interrupt.h> @@ -27,12 +29,10 @@ #include <linux/skbuff.h> #include <linux/string.h> #include <linux/types.h> -#include <plat/pincfg.h> -#include <asm/mach-types.h> -#include <mach/id.h> #include <linux/mfd/ab8500.h> #include <linux/regulator/consumer.h> - +#include <mach/id.h> +#include <plat/pincfg.h> #include "cg2900.h" #include "devices-cg2900.h" @@ -158,10 +158,11 @@ static int dcg2900_init(struct cg2900_chip_dev *dev) dev_dbg(dev->dev, "No resources available\n"); goto finished; } - if (cpu_is_u8500()) - err = dcg2900_setup(dev, info); - else + + if (cpu_is_u5500()) err = dcg2900_u5500_setup(dev, info); + else + err = dcg2900_u8500_setup(dev, info); if (err) goto err_handling; @@ -217,7 +218,11 @@ static void dcg2900_exit(struct cg2900_chip_dev *dev) } } - dcg2900_disable_chip(dev); + if (cpu_is_u5500()) + dcg2900_u5500_disable_chip(dev); + else + dcg2900_u8500_disable_chip(dev); + if (info->bt_gpio != -1) gpio_free(info->bt_gpio); if (info->pmuen_gpio != -1) @@ -273,14 +278,13 @@ void dcg2900_init_platdata(struct cg2900_platform_data *data) data->init = dcg2900_init; data->exit = dcg2900_exit; - if (cpu_is_u8500()) { - data->enable_chip = dcg2900_enable_chip; - data->disable_chip = dcg2900_disable_chip; - } else { + if (cpu_is_u5500()) { data->enable_chip = dcg2900_u5500_enable_chip; data->disable_chip = dcg2900_u5500_disable_chip; + } else { + data->enable_chip = dcg2900_u8500_enable_chip; + data->disable_chip = dcg2900_u8500_disable_chip; } - data->get_power_switch_off_cmd = dcg2900_get_power_switch_off_cmd; data->uart.enable_uart = dcg2900_enable_uart; diff --git a/drivers/staging/cg2900/devices-cg2900.h b/drivers/staging/cg2900/devices-cg2900.h index eeb9e2e46b4..5ca95e1e0a1 100644 --- a/drivers/staging/cg2900/devices-cg2900.h +++ b/drivers/staging/cg2900/devices-cg2900.h @@ -29,9 +29,9 @@ struct dcg2900_info { struct regulator *regulator_wlan; }; -extern void dcg2900_enable_chip(struct cg2900_chip_dev *dev); -extern void dcg2900_disable_chip(struct cg2900_chip_dev *dev); -extern int dcg2900_setup(struct cg2900_chip_dev *dev, +extern void dcg2900_u8500_enable_chip(struct cg2900_chip_dev *dev); +extern void dcg2900_u8500_disable_chip(struct cg2900_chip_dev *dev); +extern int dcg2900_u8500_setup(struct cg2900_chip_dev *dev, struct dcg2900_info *info); extern void dcg2900_u5500_enable_chip(struct cg2900_chip_dev *dev); extern void dcg2900_u5500_disable_chip(struct cg2900_chip_dev *dev); |