void clock_gate_switch(uint32_t gate, OnOff on_off) { #if !defined(CONFIG_IPHONE_4) && !defined(CONFIG_IPAD) uint32_t gate_register; uint32_t gate_flag; if(gate < CLOCK1_Separator) { gate_register = CLOCK1 + CLOCK1_CL2_GATES; gate_flag = gate; } else { gate_register = CLOCK1 + CLOCK1_CL3_GATES; gate_flag = gate - CLOCK1_Separator; } uint32_t gates = GET_REG(gate_register); if(on_off == ON) { gates &= ~(1 << gate_flag); } else { gates |= 1 << gate_flag; } SET_REG(gate_register, gates); #else power_ctrl(gate, on_off); #endif }
static int power_down(struct v4l2_subdev *sd) { struct ov2680_device *dev = to_ov2680_sensor(sd); struct i2c_client *client = v4l2_get_subdevdata(sd); int ret = 0; h_flag = 0; v_flag = 0; if (!dev->platform_data) { dev_err(&client->dev, "no camera_sensor_platform_data"); return -ENODEV; } ret = dev->platform_data->flisclk_ctrl(sd, 0); if (ret) dev_err(&client->dev, "flisclk failed\n"); /* gpio ctrl */ ret = gpio_ctrl(sd, 0); if (ret) { ret = gpio_ctrl(sd, 0); if (ret) dev_err(&client->dev, "gpio failed 2\n"); } /* power control */ ret = power_ctrl(sd, 0); if (ret) dev_err(&client->dev, "vprog failed.\n"); return ret; }
static int power_up(struct v4l2_subdev *sd) { struct ov2680_device *dev = to_ov2680_sensor(sd); struct i2c_client *client = v4l2_get_subdevdata(sd); int ret; if (!dev->platform_data) { dev_err(&client->dev, "no camera_sensor_platform_data"); return -ENODEV; } /* power control */ ret = power_ctrl(sd, 1); if (ret) goto fail_power; /* according to DS, at least 5ms is needed between DOVDD and PWDN */ usleep_range(5000, 6000); /* gpio ctrl */ ret = gpio_ctrl(sd, 1); if (ret) { ret = gpio_ctrl(sd, 1); if (ret) goto fail_power; } /* flis clock control */ ret = dev->platform_data->flisclk_ctrl(sd, 1); if (ret) goto fail_clk; /* according to DS, 20ms is needed between PWDN and i2c access */ msleep(20); return 0; fail_clk: gpio_ctrl(sd, 0); fail_power: power_ctrl(sd, 0); dev_err(&client->dev, "sensor power-up failed\n"); return ret; }
int usb_setup() { int i; if(usb_inited) { return 0; } InEPRegs = (USBEPRegisters*)(USB + USB_INREGS); OutEPRegs = (USBEPRegisters*)(USB + USB_OUTREGS); change_state(USBStart); // Power on hardware power_ctrl(POWER_USB, ON); udelay(USB_START_DELAYUS); // Initialize our data structures for(i = 0; i < USB_NUM_ENDPOINTS; i++) { switch(USB_EP_DIRECTION(i)) { case USB_ENDPOINT_DIRECTIONS_BIDIR: endpoint_directions[i] = USBBiDir; break; case USB_ENDPOINT_DIRECTIONS_IN: endpoint_directions[i] = USBIn; break; case USB_ENDPOINT_DIRECTIONS_OUT: endpoint_directions[i] = USBOut; break; } bufferPrintf("EP %d: %d\r\n", i, endpoint_directions[i]); } memset(endpoint_handlers, 0, sizeof(endpoint_handlers)); // Set up the hardware clock_gate_switch(USB_OTGCLOCKGATE, ON); clock_gate_switch(USB_PHYCLOCKGATE, ON); clock_gate_switch(EDRAM_CLOCKGATE, ON); // Generate a soft disconnect on host SET_REG(USB + DCTL, GET_REG(USB + DCTL) | DCTL_SFTDISCONNECT); udelay(USB_SFTDISCONNECT_DELAYUS); // power on OTG SET_REG(USB + USB_ONOFF, GET_REG(USB + USB_ONOFF) & (~USB_ONOFF_OFF)); udelay(USB_ONOFFSTART_DELAYUS); // power on PHY SET_REG(USB_PHY + OPHYPWR, OPHYPWR_POWERON); udelay(USB_PHYPWRPOWERON_DELAYUS); // select clock SET_REG(USB_PHY + OPHYCLK, (GET_REG(USB_PHY + OPHYCLK) & OPHYCLK_CLKSEL_MASK) | OPHYCLK_CLKSEL_48MHZ); // reset phy SET_REG(USB_PHY + ORSTCON, GET_REG(USB_PHY + ORSTCON) | ORSTCON_PHYSWRESET); udelay(USB_RESET2_DELAYUS); SET_REG(USB_PHY + ORSTCON, GET_REG(USB_PHY + ORSTCON) & (~ORSTCON_PHYSWRESET)); udelay(USB_RESET_DELAYUS); SET_REG(USB + GRSTCTL, GRSTCTL_CORESOFTRESET); // wait until reset takes while((GET_REG(USB + GRSTCTL) & GRSTCTL_CORESOFTRESET) == GRSTCTL_CORESOFTRESET); // wait until reset completes while((GET_REG(USB + GRSTCTL) & ~GRSTCTL_AHBIDLE) != 0); udelay(USB_RESETWAITFINISH_DELAYUS); // allow host to reconnect SET_REG(USB + DCTL, GET_REG(USB + DCTL) & (~DCTL_SFTDISCONNECT)); udelay(USB_SFTCONNECT_DELAYUS); // flag all interrupts as positive, maybe to disable them // Set 7th EP? This is what iBoot does InEPRegs[USB_NUM_ENDPOINTS].interrupt = USB_EPINT_INEPNakEff | USB_EPINT_INTknEPMis | USB_EPINT_INTknTXFEmp | USB_EPINT_TimeOUT | USB_EPINT_AHBErr | USB_EPINT_EPDisbld | USB_EPINT_XferCompl; OutEPRegs[USB_NUM_ENDPOINTS].interrupt = USB_EPINT_OUTTknEPDis | USB_EPINT_SetUp | USB_EPINT_AHBErr | USB_EPINT_EPDisbld | USB_EPINT_XferCompl; for(i = 0; i < USB_NUM_ENDPOINTS; i++) { InEPRegs[i].interrupt = USB_EPINT_INEPNakEff | USB_EPINT_INTknEPMis | USB_EPINT_INTknTXFEmp | USB_EPINT_TimeOUT | USB_EPINT_AHBErr | USB_EPINT_EPDisbld | USB_EPINT_XferCompl; OutEPRegs[i].interrupt = USB_EPINT_OUTTknEPDis | USB_EPINT_SetUp | USB_EPINT_AHBErr | USB_EPINT_EPDisbld | USB_EPINT_XferCompl; } // disable all interrupts until endpoint descriptors and configuration structures have been setup SET_REG(USB + GINTMSK, GINTMSK_NONE); SET_REG(USB + DIEPMSK, USB_EPINT_NONE); SET_REG(USB + DOEPMSK, USB_EPINT_NONE); interrupt_install(USB_INTERRUPT, usbIRQHandler, 0); usb_inited = TRUE; return 0; }
int usb_setup(USBEnumerateHandler hEnumerate, USBStartHandler hStart) { usb_shutdown(); // This is not relevant to the hardware, // and usb_setup is called when setting up a new // USB protocol. So we should reset the EP // handlers here! -- Ricky26 memset(endpoint_handlers, 0, sizeof(endpoint_handlers)); startHandler = hStart; enumerateHandler = hEnumerate; setupHandler = NULL; if(usb_inited) return 0; if(controlSendBuffer == NULL) controlSendBuffer = memalign(DMA_ALIGN, CONTROL_SEND_BUFFER_LEN); if(controlRecvBuffer == NULL) controlRecvBuffer = memalign(DMA_ALIGN, CONTROL_RECV_BUFFER_LEN); InEPRegs = (USBEPRegisters*)(USB + USB_INREGS); OutEPRegs = (USBEPRegisters*)(USB + USB_OUTREGS); change_state(USBStart); initializeDescriptors(); // Initialize our data structures memset(usb_message_queue, 0, sizeof(usb_message_queue)); #ifdef USB_PHY_1G // Power on hardware power_ctrl(POWER_USB, ON); udelay(USB_START_DELAYUS); #else // Wait for USB hardware to come alive udelay(10000); #endif // Set up the hardware clock_gate_switch(USB_OTGCLOCKGATE, ON); clock_gate_switch(USB_PHYCLOCKGATE, ON); #ifdef USB_PHY_1G clock_gate_switch(EDRAM_CLOCKGATE, ON); #endif // power on OTG SET_REG(USB + PCGCCTL, (GET_REG(USB + PCGCCTL) & (~PCGCCTL_ONOFF_MASK)) | PCGCCTL_ON); udelay(USB_ONOFFSTART_DELAYUS); // Generate a soft disconnect on host //SET_REG(USB + DCTL, GET_REG(USB + DCTL) | DCTL_SFTDISCONNECT); //udelay(USB_SFTDISCONNECT_DELAYUS); // Initialise PHY usb_phy_init(); bufferPrintf("USB: Hardware Configuration\n" " HWCFG1 = 0x%08x\n" " HWCFG2 = 0x%08x\n" " HWCFG3 = 0x%08x\n" " HWCFG4 = 0x%08x\n", GET_REG(USB+GHWCFG1), GET_REG(USB+GHWCFG2), GET_REG(USB+GHWCFG3), GET_REG(USB+GHWCFG4)); usb_inited = TRUE; interrupt_install(USB_INTERRUPT, usbIRQHandler, 0); // Start USB usb_start(); return 0; }