2005-04-16 15:20:36 -07:00
/*
* EZ - USB specific functions used by some of the USB to Serial drivers .
*
* Copyright ( C ) 1999 - 2002 Greg Kroah - Hartman ( greg @ kroah . 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 published by the Free Software Foundation .
*/
# include <linux/kernel.h>
# include <linux/errno.h>
# include <linux/init.h>
# include <linux/slab.h>
# include <linux/tty.h>
# include <linux/module.h>
# include <linux/usb.h>
2006-07-11 21:22:58 -07:00
# include <linux/usb/serial.h>
2005-04-16 15:20:36 -07:00
/* EZ-USB Control and Status Register. Bit 0 controls 8051 reset */
# define CPUCS_REG 0x7F92
2008-07-22 11:09:16 +01:00
int ezusb_writememory ( struct usb_serial * serial , int address ,
unsigned char * data , int length , __u8 request )
2005-04-16 15:20:36 -07:00
{
int result ;
unsigned char * transfer_buffer ;
/* dbg("ezusb_writememory %x, %d", address, length); */
if ( ! serial - > dev ) {
2008-08-20 16:56:34 -07:00
printk ( KERN_ERR " ezusb: %s - no physical device present, "
" failing. \n " , __func__ ) ;
2005-04-16 15:20:36 -07:00
return - ENODEV ;
}
2006-10-26 21:06:24 +02:00
transfer_buffer = kmemdup ( data , length , GFP_KERNEL ) ;
2005-04-16 15:20:36 -07:00
if ( ! transfer_buffer ) {
2008-07-22 11:09:16 +01:00
dev_err ( & serial - > dev - > dev , " %s - kmalloc(%d) failed. \n " ,
__func__ , length ) ;
2005-04-16 15:20:36 -07:00
return - ENOMEM ;
}
2008-07-22 11:09:16 +01:00
result = usb_control_msg ( serial - > dev , usb_sndctrlpipe ( serial - > dev , 0 ) ,
request , 0x40 , address , 0 , transfer_buffer , length , 3000 ) ;
kfree ( transfer_buffer ) ;
2005-04-16 15:20:36 -07:00
return result ;
}
2008-07-22 11:09:16 +01:00
EXPORT_SYMBOL_GPL ( ezusb_writememory ) ;
2005-04-16 15:20:36 -07:00
2008-07-22 11:09:16 +01:00
int ezusb_set_reset ( struct usb_serial * serial , unsigned char reset_bit )
2005-04-16 15:20:36 -07:00
{
int response ;
2008-03-03 16:08:34 -08:00
/* dbg("%s - %d", __func__, reset_bit); */
2008-07-22 11:09:16 +01:00
response = ezusb_writememory ( serial , CPUCS_REG , & reset_bit , 1 , 0xa0 ) ;
2005-04-16 15:20:36 -07:00
if ( response < 0 )
2008-07-22 11:09:16 +01:00
dev_err ( & serial - > dev - > dev , " %s- %d failed \n " ,
__func__ , reset_bit ) ;
2005-04-16 15:20:36 -07:00
return response ;
}
2008-01-12 15:23:17 +01:00
EXPORT_SYMBOL_GPL ( ezusb_set_reset ) ;
2005-04-16 15:20:36 -07:00