1a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/*
2a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * host_platform.c
3a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
4a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved.
5a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * All rights reserved.
6a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
7a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Redistribution and use in source and binary forms, with or without
8a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * modification, are permitted provided that the following conditions
9a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * are met:
10a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
11a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *  * Redistributions of source code must retain the above copyright
12a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *    notice, this list of conditions and the following disclaimer.
13a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *  * Redistributions in binary form must reproduce the above copyright
14a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *    notice, this list of conditions and the following disclaimer in
15a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *    the documentation and/or other materials provided with the
16a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *    distribution.
17a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *  * Neither the name Texas Instruments nor the names of its
18a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *    contributors may be used to endorse or promote products derived
19a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *    from this software without specific prior written permission.
20a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *
21a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */
33a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "tidef.h"
34a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include <linux/kernel.h>
35a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include <asm/io.h>
36a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include <linux/delay.h>
37a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include <linux/platform_device.h>
38a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include <linux/wifi_tiwlan.h>
39a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
40a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "host_platform.h"
41a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "ioctl_init.h"
42a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "WlanDrvIf.h"
43a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "Device1273.h"
44a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
45ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt#define OS_API_MEM_ADDR		0x0000000
46ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt#define OS_API_REG_ADDR		0x0300000
47a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#define SDIO_ATTEMPT_LONGER_DELAY_LINUX  150
48a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
49a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic struct wifi_platform_data *wifi_control_data = NULL;
50a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic struct resource *wifi_irqres = NULL;
51a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
52a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic int wifi_probe( struct platform_device *pdev )
53a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
54a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	struct wifi_platform_data *wifi_ctrl = (struct wifi_platform_data *)(pdev->dev.platform_data);
55a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
56ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	/* printk("%s\n", __FUNCTION__); */
57a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	wifi_irqres = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "device_wifi_irq");
58ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt#if 0
59ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	if (wifi_irqres) {
60ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt		printk("wifi_irqres->start = %lu\n", (unsigned long)(wifi_irqres->start));
61ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt		printk("wifi_irqres->flags = %lx\n", wifi_irqres->flags);
62ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	}
63ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt#endif
64a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	if( wifi_ctrl ) {
65a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt		wifi_control_data = wifi_ctrl;
66ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt#if 0
67ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt		if( wifi_ctrl->set_power )
68ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt			wifi_ctrl->set_power(1);	/* Power On */
69ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt		if( wifi_ctrl->set_reset )
70ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt			wifi_ctrl->set_reset(0);	/* Reset clear */
71ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt		if( wifi_ctrl->set_carddetect )
72ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt			wifi_ctrl->set_carddetect(1);	/* CardDetect (0->1) */
73ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt#endif
74a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	}
75a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	return 0;
76a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
77ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt
78a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic int wifi_remove( struct platform_device *pdev )
79a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
80a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	struct wifi_platform_data *wifi_ctrl = (struct wifi_platform_data *)(pdev->dev.platform_data);
81a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
82ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	/* printk("%s\n", __FUNCTION__); */
83a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	if( wifi_ctrl ) {
84a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt		if( wifi_ctrl->set_carddetect )
85a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt			wifi_ctrl->set_carddetect(0);	/* CardDetect (1->0) */
86a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt		if( wifi_ctrl->set_reset )
87a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt			wifi_ctrl->set_reset(1);	/* Reset active */
88a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt		if( wifi_ctrl->set_power )
89a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt			wifi_ctrl->set_power(0);	/* Power Off */
90a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	}
91a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	return 0;
92a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
93a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
94a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic struct platform_driver wifi_device = {
95a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	.probe          = wifi_probe,
96a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	.remove         = wifi_remove,
97a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	.suspend        = NULL,
98a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	.resume         = NULL,
99a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	.driver         = {
100a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt		.name   = "device_wifi",
101a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	},
102a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt};
103a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
104a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic int wifi_add_dev( void )
105a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
106ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	/* printk("%s\n", __FUNCTION__); */
107a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	return platform_driver_register( &wifi_device );
108a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
109a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
110a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void wifi_del_dev( void )
111a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
112ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	/* printk("%s\n", __FUNCTION__); */
113a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	platform_driver_unregister( &wifi_device );
114a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
115a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
116a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtint wifi_set_carddetect( int on )
117a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
118ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	/* printk("%s = %d\n", __FUNCTION__, on); */
119a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	if( wifi_control_data && wifi_control_data->set_carddetect ) {
120a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt		wifi_control_data->set_carddetect(on);
121a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	}
122a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	return 0;
123a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
124a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
125ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidtint wifi_set_power( int on, unsigned long msec )
126a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
127ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	/* printk("%s = %d\n", __FUNCTION__, on); */
128ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	if( wifi_control_data && wifi_control_data->set_power ) {
129ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt		wifi_control_data->set_power(on);
130a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	}
131ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	else {
132ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt		gpio_set_value(PMENA_GPIO, on);
133ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	}
134ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	if( msec )
135ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt		mdelay(msec);
136ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	return 0;
137a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
138a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
139ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidtint wifi_set_reset( int on, unsigned long msec )
140a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
141ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	/* printk("%s = %d\n", __FUNCTION__, on); */
142ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	if( wifi_control_data && wifi_control_data->set_reset ) {
143ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt		wifi_control_data->set_reset(on);
144a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	}
145ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	if( msec )
146ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt		mdelay(msec);
147ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	return 0;
148a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
149a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
150a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/*-----------------------------------------------------------------------------
151ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry ShmidtRoutine Name: hPlatform_hardResetTnetw
152ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry ShmidtRoutine Description: set the GPIO to low after awaking the TNET from ELP.
153ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry ShmidtArguments: None
154ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry ShmidtReturn Value: 0 - Ok
155a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt-----------------------------------------------------------------------------*/
156a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
157ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidtint hPlatform_hardResetTnetw( void )
158a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
159ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	int err;
160a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
161ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	/* Turn power OFF */
162ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	if ((err = wifi_set_power(0, 15)) == 0) {
163ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt		/* Turn power ON*/
164ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt		err = wifi_set_power(1, 70);
165ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	}
166ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	return err;
167a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} /* hPlatform_hardResetTnetw() */
168a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
169a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/* Turn device power off */
170ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidtint hPlatform_DevicePowerOff( void )
171a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
172ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	int err;
173ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt
174ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	err = wifi_set_power(0, 15);
175ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	return err;
176a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
177a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
178a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
179a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/* Turn device power off according to a given delay */
180a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtint hPlatform_DevicePowerOffSetLongerDelay(void)
181a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
182a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    int err;
183a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
184ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt    err = wifi_set_power(0, SDIO_ATTEMPT_LONGER_DELAY_LINUX);
185a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
186a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt    return err;
187a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
188a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
189a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/* Turn device power on */
190ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidtint hPlatform_DevicePowerOn( void )
191a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
192ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	int err;
193a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
194ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	wifi_set_power(1, 15); /* Fixed power sequence */
195ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	wifi_set_power(0, 1);
196ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	/* Should not be changed, 50 msec cause failures */
197ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	err = wifi_set_power(1, 70);
198ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	return err;
199a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
200a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
201ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt/*---------------------------------------------------------------------------*/
202a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
203ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidtint hPlatform_Wlan_Hardware_Init(void *tnet_drv)
204a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
205ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	TWlanDrvIfObj *drv = tnet_drv;
206ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt
207ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	printk("%s\n", __FUNCTION__);
208a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	wifi_add_dev();
209ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	if (wifi_irqres) {
210ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt		drv->irq = wifi_irqres->start;
211ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt		drv->irq_flags = wifi_irqres->flags & IRQF_TRIGGER_MASK;
212ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	}
213ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	else {
214ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt		drv->irq = TNETW_IRQ;
215ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt		drv->irq_flags = (unsigned long)IRQF_TRIGGER_FALLING;
216ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	}
217a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	return 0;
218a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
219a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
220a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/*-----------------------------------------------------------------------------
221a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
222a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtRoutine Name:
223a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
224a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        InitInterrupt
225a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
226a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtRoutine Description:
227a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
228a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        this function init the interrupt to the Wlan ISR routine.
229a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
230a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtArguments:
231a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
232a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        tnet_drv - Golbal Tnet driver pointer.
233a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
234a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtReturn Value:
235a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
236a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt        status
237a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
238a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt-----------------------------------------------------------------------------*/
239a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
240ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidtint hPlatform_initInterrupt( void *tnet_drv, void* handle_add )
241a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
242a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	TWlanDrvIfObj *drv = tnet_drv;
243a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	int rc;
244ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt
245a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	if (drv->irq == 0 || handle_add == NULL)
246a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	{
247a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt		print_err("hPlatform_initInterrupt() bad param drv->irq=%d handle_add=0x%x !!!\n",drv->irq,(int)handle_add);
248a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt		return -EINVAL;
249a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	}
250ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	printk("drv->irq = %u, %lx\n", drv->irq, drv->irq_flags);
251ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	if ((rc = request_irq(drv->irq, handle_add, drv->irq_flags, drv->netdev->name, drv)))
252a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	{
253a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt		print_err("TIWLAN: Failed to register interrupt handler\n");
254a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt		return rc;
255a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	}
256ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	set_irq_wake(drv->irq, 1);
257a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	return rc;
258a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
259a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} /* hPlatform_initInterrupt() */
260a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
261a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/*--------------------------------------------------------------------------------------*/
262a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
263ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidtvoid hPlatform_freeInterrupt( void *tnet_drv )
264a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
265ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	TWlanDrvIfObj *drv = tnet_drv;
266ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt
267ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	set_irq_wake(drv->irq, 0);
268ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	free_irq(drv->irq, drv);
269a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
270a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
271a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/****************************************************************************************
272a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *                        hPlatform_hwGetRegistersAddr()
273a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt ****************************************************************************************
274a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtDESCRIPTION:
275a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
276a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtARGUMENTS:
277a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
278a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtRETURN:
279a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
280a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtNOTES:
281a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt*****************************************************************************************/
282ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidtvoid *hPlatform_hwGetRegistersAddr(TI_HANDLE OsContext)
283a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
284ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	return (void *)OS_API_REG_ADDR;
285a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
286a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
287a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/****************************************************************************************
288a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt *                        hPlatform_hwGetMemoryAddr()
289a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt ****************************************************************************************
290a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtDESCRIPTION:
291a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
292a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtARGUMENTS:
293a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
294a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtRETURN:
295a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
296a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtNOTES:
297a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt*****************************************************************************************/
298ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidtvoid *hPlatform_hwGetMemoryAddr(TI_HANDLE OsContext)
299a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
300ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt	return (void *)OS_API_MEM_ADDR;
301a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
302a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
303a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt
304a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid hPlatform_Wlan_Hardware_DeInit(void)
305a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{
306a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt	wifi_del_dev();
307a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}
308