1*495f3774SAndy Shevchenko /* 2*495f3774SAndy Shevchenko * Copyright (c) 2017 Intel Corporation 3*495f3774SAndy Shevchenko * 4*495f3774SAndy Shevchenko * SPDX-License-Identifier: GPL-2.0+ 5*495f3774SAndy Shevchenko */ 6*495f3774SAndy Shevchenko #include <common.h> 7*495f3774SAndy Shevchenko #include <dwc3-uboot.h> 8*495f3774SAndy Shevchenko #include <mmc.h> 9*495f3774SAndy Shevchenko #include <u-boot/md5.h> 10*495f3774SAndy Shevchenko #include <usb.h> 11*495f3774SAndy Shevchenko #include <watchdog.h> 12*495f3774SAndy Shevchenko 13*495f3774SAndy Shevchenko #include <linux/usb/gadget.h> 14*495f3774SAndy Shevchenko 15*495f3774SAndy Shevchenko #include <asm/cache.h> 16*495f3774SAndy Shevchenko #include <asm/scu.h> 17*495f3774SAndy Shevchenko #include <asm/u-boot-x86.h> 18*495f3774SAndy Shevchenko 19*495f3774SAndy Shevchenko DECLARE_GLOBAL_DATA_PTR; 20*495f3774SAndy Shevchenko 21*495f3774SAndy Shevchenko static struct dwc3_device dwc3_device_data = { 22*495f3774SAndy Shevchenko .maximum_speed = USB_SPEED_HIGH, 23*495f3774SAndy Shevchenko .base = CONFIG_SYS_USB_OTG_BASE, 24*495f3774SAndy Shevchenko .dr_mode = USB_DR_MODE_PERIPHERAL, 25*495f3774SAndy Shevchenko .index = 0, 26*495f3774SAndy Shevchenko }; 27*495f3774SAndy Shevchenko 28*495f3774SAndy Shevchenko int usb_gadget_handle_interrupts(int controller_index) 29*495f3774SAndy Shevchenko { 30*495f3774SAndy Shevchenko dwc3_uboot_handle_interrupt(controller_index); 31*495f3774SAndy Shevchenko WATCHDOG_RESET(); 32*495f3774SAndy Shevchenko return 0; 33*495f3774SAndy Shevchenko } 34*495f3774SAndy Shevchenko 35*495f3774SAndy Shevchenko int board_usb_init(int index, enum usb_init_type init) 36*495f3774SAndy Shevchenko { 37*495f3774SAndy Shevchenko if (index == 0 && init == USB_INIT_DEVICE) 38*495f3774SAndy Shevchenko return dwc3_uboot_init(&dwc3_device_data); 39*495f3774SAndy Shevchenko return -EINVAL; 40*495f3774SAndy Shevchenko } 41*495f3774SAndy Shevchenko 42*495f3774SAndy Shevchenko int board_usb_cleanup(int index, enum usb_init_type init) 43*495f3774SAndy Shevchenko { 44*495f3774SAndy Shevchenko if (index == 0 && init == USB_INIT_DEVICE) { 45*495f3774SAndy Shevchenko dwc3_uboot_exit(index); 46*495f3774SAndy Shevchenko return 0; 47*495f3774SAndy Shevchenko } 48*495f3774SAndy Shevchenko return -EINVAL; 49*495f3774SAndy Shevchenko } 50*495f3774SAndy Shevchenko 51*495f3774SAndy Shevchenko static void assign_serial(void) 52*495f3774SAndy Shevchenko { 53*495f3774SAndy Shevchenko struct mmc *mmc = find_mmc_device(0); 54*495f3774SAndy Shevchenko unsigned char ssn[16]; 55*495f3774SAndy Shevchenko char usb0addr[18]; 56*495f3774SAndy Shevchenko char serial[33]; 57*495f3774SAndy Shevchenko int i; 58*495f3774SAndy Shevchenko 59*495f3774SAndy Shevchenko if (!mmc) 60*495f3774SAndy Shevchenko return; 61*495f3774SAndy Shevchenko 62*495f3774SAndy Shevchenko md5((unsigned char *)mmc->cid, sizeof(mmc->cid), ssn); 63*495f3774SAndy Shevchenko 64*495f3774SAndy Shevchenko snprintf(usb0addr, sizeof(usb0addr), "02:00:86:%02x:%02x:%02x", 65*495f3774SAndy Shevchenko ssn[13], ssn[14], ssn[15]); 66*495f3774SAndy Shevchenko setenv("usb0addr", usb0addr); 67*495f3774SAndy Shevchenko 68*495f3774SAndy Shevchenko for (i = 0; i < 16; i++) 69*495f3774SAndy Shevchenko snprintf(&serial[2 * i], 3, "%02x", ssn[i]); 70*495f3774SAndy Shevchenko setenv("serial#", serial); 71*495f3774SAndy Shevchenko 72*495f3774SAndy Shevchenko #if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE) 73*495f3774SAndy Shevchenko saveenv(); 74*495f3774SAndy Shevchenko #endif 75*495f3774SAndy Shevchenko } 76*495f3774SAndy Shevchenko 77*495f3774SAndy Shevchenko static void assign_hardware_id(void) 78*495f3774SAndy Shevchenko { 79*495f3774SAndy Shevchenko struct ipc_ifwi_version v; 80*495f3774SAndy Shevchenko char hardware_id[4]; 81*495f3774SAndy Shevchenko int ret; 82*495f3774SAndy Shevchenko 83*495f3774SAndy Shevchenko ret = scu_ipc_command(IPCMSG_GET_FW_REVISION, 1, NULL, 0, (u32 *)&v, 4); 84*495f3774SAndy Shevchenko if (ret < 0) 85*495f3774SAndy Shevchenko printf("Can't retrieve hardware revision\n"); 86*495f3774SAndy Shevchenko 87*495f3774SAndy Shevchenko snprintf(hardware_id, sizeof(hardware_id), "%02X", v.hardware_id); 88*495f3774SAndy Shevchenko setenv("hardware_id", hardware_id); 89*495f3774SAndy Shevchenko 90*495f3774SAndy Shevchenko #if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE) 91*495f3774SAndy Shevchenko saveenv(); 92*495f3774SAndy Shevchenko #endif 93*495f3774SAndy Shevchenko } 94*495f3774SAndy Shevchenko 95*495f3774SAndy Shevchenko int board_late_init(void) 96*495f3774SAndy Shevchenko { 97*495f3774SAndy Shevchenko if (!getenv("serial#")) 98*495f3774SAndy Shevchenko assign_serial(); 99*495f3774SAndy Shevchenko 100*495f3774SAndy Shevchenko if (!getenv("hardware_id")) 101*495f3774SAndy Shevchenko assign_hardware_id(); 102*495f3774SAndy Shevchenko 103*495f3774SAndy Shevchenko return 0; 104*495f3774SAndy Shevchenko } 105