Index: linux-2.6.17/arch/arm/mach-pxa/Makefile =================================================================== --- linux-2.6.17.orig/arch/arm/mach-pxa/Makefile 2006-06-20 11:45:51.252467944 +0200 +++ linux-2.6.17/arch/arm/mach-pxa/Makefile 2006-06-20 11:46:33.619027248 +0200 @@ -16,7 +16,7 @@ obj-$(CONFIG_PXA_SHARP_Cxx00) += spitz.o corgi_ssp.o corgi_lcd.o sharpsl_pm.o spitz_pm.o obj-$(CONFIG_MACH_AKITA) += akita-ioexp.o obj-$(CONFIG_MACH_POODLE) += poodle.o corgi_ssp.o sharpsl_pm.o poodle_pm.o -obj-$(CONFIG_MACH_TOSA) += tosa.o sharpsl_pm.o tosa_pm.o tosa_lcd.o +obj-$(CONFIG_MACH_TOSA) += tosa.o sharpsl_pm.o tosa_pm.o tosa_lcd.o tosa_bt.o obj-$(CONFIG_MACH_EM_X270) += em-x270.o obj-$(CONFIG_MACH_HX2750) += hx2750.o hx2750_test.o Index: linux-2.6.17/arch/arm/mach-pxa/tosa_bt.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.6.17/arch/arm/mach-pxa/tosa_bt.c 2006-06-20 11:46:08.107905528 +0200 @@ -0,0 +1,128 @@ +/* + * Bluetooth control code for Sharp SL-6000x (tosa) + * + * Copyright (c) 2005 Dirk Opfer + * + * 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 + * published by the Free Software Foundation. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + + +static int tosa_bluetooth_power(int on) +{ + + if (!on) { //off + + set_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_BT_RESET); + pxa_gpio_mode(GPIO42_BTRXD|GPIO_IN); + pxa_gpio_mode(GPIO43_BTTXD|GPIO_IN); + pxa_gpio_mode(GPIO44_BTCTS|GPIO_IN); + pxa_gpio_mode(GPIO45_BTRTS|GPIO_IN); + mdelay(10); // wait 10ms + reset_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_BT_RESET); + reset_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_BT_PWR_EN); + reset_scoop_gpio(&tosascoop_jc_device.dev,TOSA_SCOOP_JC_BT_LED); // turn off BT LED + + } else { // on + + reset_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_BT_RESET); + set_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_BT_PWR_EN); + pxa_gpio_mode(GPIO42_HWRXD_MD); + pxa_gpio_mode(GPIO43_HWTXD_MD); + pxa_gpio_mode(GPIO44_HWCTS_MD); + pxa_gpio_mode(GPIO45_HWRTS_MD); + + set_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_BT_RESET); + mdelay(20); // wait 20ms + reset_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_BT_RESET); + set_scoop_gpio(&tosascoop_jc_device.dev,TOSA_SCOOP_JC_BT_LED); // turn BT LED on + } + return 0; +} + +/* + * Support Routines + */ +int __init tosa_bluetooth_probe(struct platform_device *dev) +{ + int ret = 0; + pxa_gpio_mode(GPIO42_BTRXD|GPIO_IN); + pxa_gpio_mode(GPIO43_BTTXD|GPIO_IN); + pxa_gpio_mode(GPIO44_BTCTS|GPIO_IN); + pxa_gpio_mode(GPIO45_BTRTS|GPIO_IN); + set_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_BT_PWR_EN); + mdelay(5); + + if ( (GPLR(GPIO42_BTRXD) & GPIO_bit(GPIO42_BTRXD))==0 && + (GPLR(GPIO44_BTCTS) & GPIO_bit(GPIO44_BTCTS))==0) { + printk(KERN_INFO "No Bluetooth Device found!\n"); + ret = ENODEV; // no bluetooth + } else { + printk(KERN_INFO "Tosa Bluetooth Device found on ttyS3!\n"); + } + reset_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_BT_PWR_EN); + + tosa_bluetooth_power(1); // Power on + return ret; +} + +static int tosa_bluetooth_remove(struct platform_device *dev) +{ + tosa_bluetooth_power(0); // Power off + return 0; +} + +#ifdef CONFIG_PM +static int tosa_bluetooth_suspend(struct platform_device *dev, pm_message_t state) +{ + tosa_bluetooth_power(0); // Power off + return 0; +} + +static int tosa_bluetooth_resume(struct platform_device *dev) +{ + tosa_bluetooth_power(1); // Power on + return 0; +} +#else +#define tosa_bluetooth_suspend NULL +#define tosa_bluetooth_resume NULL +#endif + +static struct platform_driver tosa_bluetooth_driver = { + .probe = tosa_bluetooth_probe, + .remove = tosa_bluetooth_remove, + .suspend = tosa_bluetooth_suspend, + .resume = tosa_bluetooth_resume, + .driver = { + .name = "tosa-bluetooth", + }, +}; + +int __init tosa_bluetooth_init(void) +{ + return platform_driver_register(&tosa_bluetooth_driver); +} + +void __exit tosa_bluetooth_cleanup(void) +{ + platform_driver_unregister(&tosa_bluetooth_driver); +} + +module_init(tosa_bluetooth_init); +module_exit(tosa_bluetooth_cleanup); Index: linux-2.6.17/arch/arm/mach-pxa/tosa.c =================================================================== --- linux-2.6.17.orig/arch/arm/mach-pxa/tosa.c 2006-06-20 11:45:51.254467640 +0200 +++ linux-2.6.17/arch/arm/mach-pxa/tosa.c 2006-06-20 11:46:08.112904768 +0200 @@ -288,7 +288,7 @@ static void tosa_tc6393_enable(struct device *dev) { - + printk("!!tosa_tc6393_enable!!\n"); reset_scoop_gpio(&tosascoop_jc_device.dev,TOSA_SCOOP_JC_TC3693_L3V_ON); reset_scoop_gpio(&tosascoop_jc_device.dev,TOSA_SCOOP_JC_TC6393_SUSPEND); reset_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_TC6393_REST_IN); //#PCLR @@ -303,7 +303,7 @@ static void tosa_tc6393_disable(struct device *dev) { - + printk("!!tosa_tc6393_disable!!\n"); reset_scoop_gpio(&tosascoop_jc_device.dev,TOSA_SCOOP_JC_TC3693_L3V_ON); reset_scoop_gpio(&tosascoop_jc_device.dev,TOSA_SCOOP_JC_TC6393_SUSPEND); reset_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_TC6393_REST_IN); //#PCLR @@ -428,6 +428,17 @@ }, }; +/* + * Tosa Blueooth + */ +static struct platform_device tosa_bluetooth_device = { + .name = "tosa-bluetooth", + .id = -1, + .dev = { + .parent = &tosascoop_jc_device.dev, + }, +}; + static struct platform_device *devices[] __initdata = { &tosascoop_device, &tosascoop_jc_device, @@ -435,6 +446,7 @@ &tosaled_device, &tc6393_device, &tosalcd_device, + &tosa_bluetooth_device, }; static void tosa_poweroff(void)