Changes in uspace/drv/bus/usb/uhci/main.c [b74ec299:920d0fc] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/uhci/main.c
rb74ec299 r920d0fc 26 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 27 */ 28 /** @addtogroup drvusbuhci 28 /** @addtogroup drvusbuhcihc 29 29 * @{ 30 30 */ … … 32 32 * @brief UHCI driver initialization 33 33 */ 34 #include <ddf/driver.h> 35 #include <errno.h> 36 #include <str_error.h> 34 37 35 #include <assert.h> 36 #include <ddf/driver.h> 37 #include <devman.h> 38 #include <errno.h> 39 #include <io/log.h> 40 #include <io/logctl.h> 41 #include <pci_dev_iface.h> 42 #include <stdio.h> 43 #include <str_error.h> 38 #include <usb/ddfiface.h> 44 39 #include <usb/debug.h> 45 #include <usb/host/ddf_helpers.h>46 40 47 #include " hc.h"41 #include "uhci.h" 48 42 49 43 #define NAME "uhci" 50 44 51 static int uhci_driver_init(hcd_t *, const hw_res_list_parsed_t *, bool); 52 static void uhci_driver_fini(hcd_t *); 53 static int disable_legacy(ddf_dev_t *); 45 static int uhci_dev_add(ddf_dev_t *device); 54 46 55 static const ddf_hc_driver_t uhci_hc_driver = { 56 .claim = disable_legacy, 57 .hc_speed = USB_SPEED_FULL, 58 .irq_code_gen = uhci_hc_gen_irq_code, 59 .init = uhci_driver_init, 60 .fini = uhci_driver_fini, 61 .name = "UHCI", 62 .ops = { 63 .schedule = uhci_hc_schedule, 64 .irq_hook = uhci_hc_interrupt, 65 .status_hook = uhci_hc_status, 66 }, 47 static driver_ops_t uhci_driver_ops = { 48 .dev_add = uhci_dev_add, 67 49 }; 68 50 69 static int uhci_driver_init(hcd_t *hcd, const hw_res_list_parsed_t *res, bool irq) 70 { 71 assert(hcd); 72 assert(hcd_get_driver_data(hcd) == NULL); 73 74 hc_t *instance = malloc(sizeof(hc_t)); 75 if (!instance) 76 return ENOMEM; 77 78 const int ret = hc_init(instance, res, irq); 79 if (ret == EOK) { 80 hcd_set_implementation(hcd, instance, &uhci_hc_driver.ops); 81 } else { 82 free(instance); 83 } 84 return ret; 85 } 86 87 static void uhci_driver_fini(hcd_t *hcd) 88 { 89 assert(hcd); 90 hc_t *hc = hcd_get_driver_data(hcd); 91 if (hc) 92 hc_fini(hc); 93 94 hcd_set_implementation(hcd, NULL, NULL); 95 free(hc); 96 } 97 98 /** Call the PCI driver with a request to clear legacy support register 99 * 100 * @param[in] device Device asking to disable interrupts 101 * @return Error code. 102 */ 103 static int disable_legacy(ddf_dev_t *device) 104 { 105 assert(device); 106 107 async_sess_t *parent_sess = devman_parent_device_connect( 108 EXCHANGE_SERIALIZE, ddf_dev_get_handle(device), IPC_FLAG_BLOCKING); 109 if (!parent_sess) 110 return ENOMEM; 111 112 /* See UHCI design guide page 45 for these values. 113 * Write all WC bits in USB legacy register */ 114 const int rc = pci_config_space_write_16(parent_sess, 0xc0, 0xaf00); 115 116 async_hangup(parent_sess); 117 return rc; 118 } 51 static driver_t uhci_driver = { 52 .name = NAME, 53 .driver_ops = &uhci_driver_ops 54 }; 119 55 120 56 /** Initialize a new ddf driver instance for uhci hc and hub. … … 123 59 * @return Error code. 124 60 */ 125 staticint uhci_dev_add(ddf_dev_t *device)61 int uhci_dev_add(ddf_dev_t *device) 126 62 { 127 63 usb_log_debug2("uhci_dev_add() called\n"); 128 64 assert(device); 129 return hcd_ddf_add_hc(device, &uhci_hc_driver); 65 66 const int ret = device_setup_uhci(device); 67 if (ret != EOK) { 68 usb_log_error("Failed to initialize UHCI driver: %s.\n", 69 str_error(ret)); 70 } else { 71 usb_log_info("Controlling new UHCI device '%s'.\n", 72 ddf_dev_get_name(device)); 73 } 74 75 return ret; 130 76 } 131 132 static const driver_ops_t uhci_driver_ops = {133 .dev_add = uhci_dev_add,134 };135 136 static const driver_t uhci_driver = {137 .name = NAME,138 .driver_ops = &uhci_driver_ops139 };140 141 77 142 78 /** Initialize global driver structures (NONE). … … 152 88 printf(NAME ": HelenOS UHCI driver.\n"); 153 89 log_init(NAME); 154 logctl_set_log_level(NAME, LVL_NOTE); 90 155 91 return ddf_driver_main(&uhci_driver); 156 92 }
Note:
See TracChangeset
for help on using the changeset viewer.