| /* |
| * Copyright (C) 2016 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include <bl.h> |
| #include <hostIntf.h> |
| #include <hostIntf_priv.h> |
| |
| #include <variant/variant.h> |
| |
| #include <plat/cmsis.h> |
| #include <plat/spi.h> |
| #include <plat/exti.h> |
| #include <plat/syscfg.h> |
| |
| static struct Gpio *mShWakeupGpio; |
| static struct ChainedIsr mShWakeupIsr; |
| |
| static bool platWakeupIsr(struct ChainedIsr *isr) |
| { |
| if (!extiIsPendingGpio(mShWakeupGpio)) |
| return false; |
| |
| extiClearPendingGpio(mShWakeupGpio); |
| |
| hostIntfRxPacket(!gpioGet(mShWakeupGpio)); |
| |
| return true; |
| } |
| |
| const struct HostIntfComm *platHostIntfInit() |
| { |
| uint32_t priorityGroup = NVIC_GetPriorityGrouping(); |
| uint32_t priority, preemptPriority, subPriority; |
| enum IRQn rx, tx; |
| const struct HostIntfComm *ret = NULL; |
| |
| #if defined(PLATFORM_HOST_INTF_I2C_BUS) |
| ret = hostIntfI2cInit(PLATFORM_HOST_INTF_I2C_BUS); |
| #elif defined(PLATFORM_HOST_INTF_SPI_BUS) |
| ret = hostIntfSpiInit(PLATFORM_HOST_INTF_SPI_BUS); |
| |
| /* get the rx and tx irq numbers used by the host spi bus */ |
| ret->request(); |
| rx = spiRxIrq(PLATFORM_HOST_INTF_SPI_BUS); |
| tx = spiTxIrq(PLATFORM_HOST_INTF_SPI_BUS); |
| ret->release(); |
| |
| /* make the tx and rx dma isrs execute before other isrs when multiple |
| interrupts are pending (if avaliable subpriority bits). |
| We do not change the preempt priority */ |
| priority = NVIC_GetPriority(rx); |
| NVIC_DecodePriority (priority, priorityGroup, &preemptPriority, &subPriority); |
| if (&subPriority > 0) |
| subPriority --; |
| NVIC_SetPriority(rx, NVIC_EncodePriority(priorityGroup, preemptPriority, subPriority)); |
| |
| priority = NVIC_GetPriority(tx); |
| NVIC_DecodePriority (priority, priorityGroup, &preemptPriority, &subPriority); |
| if (&subPriority > 0) |
| subPriority --; |
| NVIC_SetPriority(tx, NVIC_EncodePriority(priorityGroup, preemptPriority, subPriority)); |
| |
| mShWakeupGpio = gpioRequest(SH_INT_WAKEUP); |
| gpioConfigInput(mShWakeupGpio, GPIO_SPEED_LOW, GPIO_PULL_NONE); |
| syscfgSetExtiPort(mShWakeupGpio); |
| extiEnableIntGpio(mShWakeupGpio, EXTI_TRIGGER_BOTH); |
| mShWakeupIsr.func = platWakeupIsr; |
| extiChainIsr(SH_EXTI_WAKEUP_IRQ, &mShWakeupIsr); |
| #else |
| #error "No host interface bus specified" |
| #endif |
| return ret; |
| } |
| |
| uint16_t platHwType(void) |
| { |
| return PLATFORM_HW_TYPE; |
| } |
| |
| uint16_t platHwVer(void) |
| { |
| return PLATFORM_HW_VER; |
| } |
| |
| uint16_t platBlVer() |
| { |
| return BL.blGetVersion(); |
| } |