Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.8 231 lines 6.0 kB view raw
1/* 2 * nokia.c -- Nokia Composite Gadget Driver 3 * 4 * Copyright (C) 2008-2010 Nokia Corporation 5 * Contact: Felipe Balbi <felipe.balbi@nokia.com> 6 * 7 * This gadget driver borrows from serial.c which is: 8 * 9 * Copyright (C) 2003 Al Borchers (alborchers@steinerpoint.com) 10 * Copyright (C) 2008 by David Brownell 11 * Copyright (C) 2008 by Nokia Corporation 12 * 13 * This software is distributed under the terms of the GNU General 14 * Public License ("GPL") as published by the Free Software Foundation, 15 * version 2 of that License. 16 */ 17 18#include <linux/kernel.h> 19#include <linux/device.h> 20 21#include "u_serial.h" 22#include "u_ether.h" 23#include "u_phonet.h" 24#include "gadget_chips.h" 25 26/* Defines */ 27 28#define NOKIA_VERSION_NUM 0x0211 29#define NOKIA_LONG_NAME "N900 (PC-Suite Mode)" 30 31/*-------------------------------------------------------------------------*/ 32 33/* 34 * Kbuild is not very cooperative with respect to linking separately 35 * compiled library objects into one module. So for now we won't use 36 * separate compilation ... ensuring init/exit sections work to shrink 37 * the runtime footprint, and giving us at least some parts of what 38 * a "gcc --combine ... part1.c part2.c part3.c ... " build would. 39 */ 40#include "u_serial.c" 41#include "f_acm.c" 42#include "f_ecm.c" 43#include "f_obex.c" 44#include "f_serial.c" 45#include "f_phonet.c" 46#include "u_ether.c" 47 48/*-------------------------------------------------------------------------*/ 49USB_GADGET_COMPOSITE_OPTIONS(); 50 51#define NOKIA_VENDOR_ID 0x0421 /* Nokia */ 52#define NOKIA_PRODUCT_ID 0x01c8 /* Nokia Gadget */ 53 54/* string IDs are assigned dynamically */ 55 56#define STRING_DESCRIPTION_IDX USB_GADGET_FIRST_AVAIL_IDX 57 58static char manufacturer_nokia[] = "Nokia"; 59static const char product_nokia[] = NOKIA_LONG_NAME; 60static const char description_nokia[] = "PC-Suite Configuration"; 61 62static struct usb_string strings_dev[] = { 63 [USB_GADGET_MANUFACTURER_IDX].s = manufacturer_nokia, 64 [USB_GADGET_PRODUCT_IDX].s = NOKIA_LONG_NAME, 65 [USB_GADGET_SERIAL_IDX].s = "", 66 [STRING_DESCRIPTION_IDX].s = description_nokia, 67 { } /* end of list */ 68}; 69 70static struct usb_gadget_strings stringtab_dev = { 71 .language = 0x0409, /* en-us */ 72 .strings = strings_dev, 73}; 74 75static struct usb_gadget_strings *dev_strings[] = { 76 &stringtab_dev, 77 NULL, 78}; 79 80static struct usb_device_descriptor device_desc = { 81 .bLength = USB_DT_DEVICE_SIZE, 82 .bDescriptorType = USB_DT_DEVICE, 83 .bcdUSB = __constant_cpu_to_le16(0x0200), 84 .bDeviceClass = USB_CLASS_COMM, 85 .idVendor = __constant_cpu_to_le16(NOKIA_VENDOR_ID), 86 .idProduct = __constant_cpu_to_le16(NOKIA_PRODUCT_ID), 87 .bcdDevice = cpu_to_le16(NOKIA_VERSION_NUM), 88 /* .iManufacturer = DYNAMIC */ 89 /* .iProduct = DYNAMIC */ 90 .bNumConfigurations = 1, 91}; 92 93/*-------------------------------------------------------------------------*/ 94 95/* Module */ 96MODULE_DESCRIPTION("Nokia composite gadget driver for N900"); 97MODULE_AUTHOR("Felipe Balbi"); 98MODULE_LICENSE("GPL"); 99 100/*-------------------------------------------------------------------------*/ 101 102static u8 hostaddr[ETH_ALEN]; 103 104static int __init nokia_bind_config(struct usb_configuration *c) 105{ 106 int status = 0; 107 108 status = phonet_bind_config(c); 109 if (status) 110 printk(KERN_DEBUG "could not bind phonet config\n"); 111 112 status = obex_bind_config(c, 0); 113 if (status) 114 printk(KERN_DEBUG "could not bind obex config %d\n", 0); 115 116 status = obex_bind_config(c, 1); 117 if (status) 118 printk(KERN_DEBUG "could not bind obex config %d\n", 0); 119 120 status = acm_bind_config(c, 2); 121 if (status) 122 printk(KERN_DEBUG "could not bind acm config\n"); 123 124 status = ecm_bind_config(c, hostaddr); 125 if (status) 126 printk(KERN_DEBUG "could not bind ecm config\n"); 127 128 return status; 129} 130 131static struct usb_configuration nokia_config_500ma_driver = { 132 .label = "Bus Powered", 133 .bConfigurationValue = 1, 134 /* .iConfiguration = DYNAMIC */ 135 .bmAttributes = USB_CONFIG_ATT_ONE, 136 .bMaxPower = 250, /* 500mA */ 137}; 138 139static struct usb_configuration nokia_config_100ma_driver = { 140 .label = "Self Powered", 141 .bConfigurationValue = 2, 142 /* .iConfiguration = DYNAMIC */ 143 .bmAttributes = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER, 144 .bMaxPower = 50, /* 100 mA */ 145}; 146 147static int __init nokia_bind(struct usb_composite_dev *cdev) 148{ 149 struct usb_gadget *gadget = cdev->gadget; 150 int status; 151 152 status = gphonet_setup(cdev->gadget); 153 if (status < 0) 154 goto err_phonet; 155 156 status = gserial_setup(cdev->gadget, 3); 157 if (status < 0) 158 goto err_serial; 159 160 status = gether_setup(cdev->gadget, hostaddr); 161 if (status < 0) 162 goto err_ether; 163 164 status = usb_string_ids_tab(cdev, strings_dev); 165 if (status < 0) 166 goto err_usb; 167 device_desc.iManufacturer = strings_dev[USB_GADGET_MANUFACTURER_IDX].id; 168 device_desc.iProduct = strings_dev[USB_GADGET_PRODUCT_IDX].id; 169 status = strings_dev[STRING_DESCRIPTION_IDX].id; 170 nokia_config_500ma_driver.iConfiguration = status; 171 nokia_config_100ma_driver.iConfiguration = status; 172 173 if (!gadget_supports_altsettings(gadget)) 174 goto err_usb; 175 176 /* finally register the configuration */ 177 status = usb_add_config(cdev, &nokia_config_500ma_driver, 178 nokia_bind_config); 179 if (status < 0) 180 goto err_usb; 181 182 status = usb_add_config(cdev, &nokia_config_100ma_driver, 183 nokia_bind_config); 184 if (status < 0) 185 goto err_usb; 186 187 usb_composite_overwrite_options(cdev, &coverwrite); 188 dev_info(&gadget->dev, "%s\n", NOKIA_LONG_NAME); 189 190 return 0; 191 192err_usb: 193 gether_cleanup(); 194err_ether: 195 gserial_cleanup(); 196err_serial: 197 gphonet_cleanup(); 198err_phonet: 199 return status; 200} 201 202static int __exit nokia_unbind(struct usb_composite_dev *cdev) 203{ 204 gphonet_cleanup(); 205 gserial_cleanup(); 206 gether_cleanup(); 207 208 return 0; 209} 210 211static __refdata struct usb_composite_driver nokia_driver = { 212 .name = "g_nokia", 213 .dev = &device_desc, 214 .strings = dev_strings, 215 .max_speed = USB_SPEED_HIGH, 216 .bind = nokia_bind, 217 .unbind = __exit_p(nokia_unbind), 218}; 219 220static int __init nokia_init(void) 221{ 222 return usb_composite_probe(&nokia_driver); 223} 224module_init(nokia_init); 225 226static void __exit nokia_cleanup(void) 227{ 228 usb_composite_unregister(&nokia_driver); 229} 230module_exit(nokia_cleanup); 231