static enum fpga_mgr_states ice40_fpga_ops_state(struct fpga_manager *mgr) { struct ice40_fpga_priv *priv = mgr->priv; return gpiod_get_value(priv->cdone) ? FPGA_MGR_STATE_OPERATING : FPGA_MGR_STATE_UNKNOWN; }
static irqreturn_t nop_gpio_vbus_thread(int irq, void *data) { struct usb_phy_generic *nop = data; struct usb_otg *otg = nop->phy.otg; int vbus, status; vbus = gpiod_get_value(nop->gpiod_vbus); if ((vbus ^ nop->vbus) == 0) return IRQ_HANDLED; nop->vbus = vbus; if (vbus) { status = USB_EVENT_VBUS; otg->state = OTG_STATE_B_PERIPHERAL; nop->phy.last_event = status; /* drawing a "unit load" is *always* OK, except for OTG */ nop_set_vbus_draw(nop, 100); atomic_notifier_call_chain(&nop->phy.notifier, status, otg->gadget); } else { nop_set_vbus_draw(nop, 0); status = USB_EVENT_NONE; otg->state = OTG_STATE_B_IDLE; nop->phy.last_event = status; atomic_notifier_call_chain(&nop->phy.notifier, status, otg->gadget); } return IRQ_HANDLED; }
/** * pimhyp3_process_events - Process incoming events * * @ts: our pimhyp3_ts_data pointer * * Called from poll or when the IRQ is triggered. Read the current device state, and push * the input events to the user space. */ static void pimhyp3_process_events(struct pimhyp3_ts_data *ts) { //int pin = desc_to_gpio(ts->gpiod_int); //int value; if (gpiod_get_value(ts->gpiod_int) || ts->last_numTouches) { //Only process the TS if something has happened or a contact in progress u16 x1,y1,x2,y2; u8 rawdata[8]; u8 numTouches; pimhyp3_i2c_read(ts->client, PIMHYP3_NUM_TOUCHES, &numTouches, 1); pimhyp3_i2c_read(ts->client, PIMHYP3_COORDS, rawdata, 8); x1 = rawdata[0] | (rawdata[4] << 8); y1 = rawdata[1] | (rawdata[5] << 8); x2 = rawdata[2] | (rawdata[6] << 8); y2 = rawdata[3] | (rawdata[7] << 8); pimhyp3_ts_process_coords(ts, x1,y1,x2,y2,numTouches); } }
static irqreturn_t arche_platform_wd_irq(int irq, void *devid) { struct arche_platform_drvdata *arche_pdata = devid; unsigned long flags; spin_lock_irqsave(&arche_pdata->wake_lock, flags); if (gpiod_get_value(arche_pdata->wake_detect)) { /* wake/detect rising */ /* * If wake/detect line goes high after low, within less than * 30msec, then standby boot sequence is initiated, which is not * supported/implemented as of now. So ignore it. */ if (arche_pdata->wake_detect_state == WD_STATE_BOOT_INIT) { if (time_before(jiffies, arche_pdata->wake_detect_start + msecs_to_jiffies(WD_COLDBOOT_PULSE_WIDTH_MS))) { arche_platform_set_wake_detect_state(arche_pdata, WD_STATE_IDLE); } else { /* * Check we are not in middle of irq thread * already */ if (arche_pdata->wake_detect_state != WD_STATE_COLDBOOT_START) { arche_platform_set_wake_detect_state(arche_pdata, WD_STATE_COLDBOOT_TRIG); spin_unlock_irqrestore( &arche_pdata->wake_lock, flags); return IRQ_WAKE_THREAD; } } } } else { /* wake/detect falling */ if (arche_pdata->wake_detect_state == WD_STATE_IDLE) { arche_pdata->wake_detect_start = jiffies; /* * In the beginning, when wake/detect goes low * (first time), we assume it is meant for coldboot * and set the flag. If wake/detect line stays low * beyond 30msec, then it is coldboot else fallback * to standby boot. */ arche_platform_set_wake_detect_state(arche_pdata, WD_STATE_BOOT_INIT); } } spin_unlock_irqrestore(&arche_pdata->wake_lock, flags); return IRQ_HANDLED; }
/** * phy_mdm6600_wakeirq_thread - handle mode1 line OOB wake after booting * @irq: interrupt * @data: interrupt handler data * * GPIO mode1 is used initially as output to configure the USB boot * mode for mdm6600. After booting it is used as input for OOB wake * signal from mdm6600 to the SoC. Just use it for debug info only * for now. */ static irqreturn_t phy_mdm6600_wakeirq_thread(int irq, void *data) { struct phy_mdm6600 *ddata = data; struct gpio_desc *mode_gpio1; mode_gpio1 = ddata->mode_gpios->desc[PHY_MDM6600_MODE1]; dev_dbg(ddata->dev, "OOB wake on mode_gpio1: %i\n", gpiod_get_value(mode_gpio1)); return IRQ_HANDLED; }
static irqreturn_t gpio_ir_recv_irq(int irq, void *dev_id) { int val; struct gpio_rc_dev *gpio_dev = dev_id; val = gpiod_get_value(gpio_dev->gpiod); if (val >= 0) ir_raw_event_store_edge(gpio_dev->rcdev, val == 1); return IRQ_HANDLED; }
unsigned int mctrl_gpio_get(struct mctrl_gpios *gpios, unsigned int *mctrl) { enum mctrl_gpio_idx i; for (i = 0; i < UART_GPIO_MAX; i++) { if (gpios->gpio[i] && !mctrl_gpios_desc[i].dir_out) { if (gpiod_get_value(gpios->gpio[i])) *mctrl |= mctrl_gpios_desc[i].mctrl; else *mctrl &= ~mctrl_gpios_desc[i].mctrl; } } return *mctrl; }
static irqreturn_t wakeup_handler(int irq, void *data) { struct nokia_bt_dev *btdev = data; struct device *dev = &btdev->serdev->dev; int wake_state = gpiod_get_value(btdev->wakeup_host); if (btdev->rx_enabled == wake_state) return IRQ_HANDLED; if (wake_state) pm_runtime_get(dev); else pm_runtime_put(dev); btdev->rx_enabled = wake_state; return IRQ_HANDLED; }
static int usb_phy_generic_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct usb_phy_generic *nop; int err; nop = devm_kzalloc(dev, sizeof(*nop), GFP_KERNEL); if (!nop) return -ENOMEM; err = usb_phy_gen_create_phy(dev, nop, dev_get_platdata(&pdev->dev)); if (err) return err; if (nop->gpiod_vbus) { err = devm_request_threaded_irq(&pdev->dev, gpiod_to_irq(nop->gpiod_vbus), NULL, nop_gpio_vbus_thread, VBUS_IRQ_FLAGS, "vbus_detect", nop); if (err) { dev_err(&pdev->dev, "can't request irq %i, err: %d\n", gpiod_to_irq(nop->gpiod_vbus), err); return err; } nop->phy.otg->state = gpiod_get_value(nop->gpiod_vbus) ? OTG_STATE_B_PERIPHERAL : OTG_STATE_B_IDLE; } nop->phy.init = usb_gen_phy_init; nop->phy.shutdown = usb_gen_phy_shutdown; err = usb_add_phy_dev(&nop->phy); if (err) { dev_err(&pdev->dev, "can't register transceiver, err: %d\n", err); return err; } platform_set_drvdata(pdev, nop); return 0; }
int mmc_gpio_get_cd(struct mmc_host *host) { struct mmc_gpio *ctx = host->slot.handler_priv; int cansleep; if (!ctx || !ctx->cd_gpio) return -ENOSYS; cansleep = gpiod_cansleep(ctx->cd_gpio); if (ctx->override_cd_active_level) { int value = cansleep ? gpiod_get_raw_value_cansleep(ctx->cd_gpio) : gpiod_get_raw_value(ctx->cd_gpio); return !value ^ !!(host->caps2 & MMC_CAP2_CD_ACTIVE_HIGH); } return cansleep ? gpiod_get_value_cansleep(ctx->cd_gpio) : gpiod_get_value(ctx->cd_gpio); }
static int hx711_wait_for_ready(struct hx711_data *hx711_data) { int i, val; /* * a maximum reset cycle time of 56 ms was measured. * we round it up to 100 ms */ for (i = 0; i < 100; i++) { val = gpiod_get_value(hx711_data->gpiod_dout); if (!val) break; /* sleep at least 1 ms */ msleep(1); } if (val) return -EIO; return 0; }
static int hx711_reset(struct hx711_data *hx711_data) { int ret; int val = gpiod_get_value(hx711_data->gpiod_dout); if (val) { /* * an examination with the oszilloscope indicated * that the first value read after the reset is not stable * if we reset too short; * the shorter the reset cycle * the less reliable the first value after reset is; * there were no problems encountered with a value * of 10 ms or higher */ gpiod_set_value(hx711_data->gpiod_pd_sck, 1); msleep(10); gpiod_set_value(hx711_data->gpiod_pd_sck, 0); ret = hx711_wait_for_ready(hx711_data); if (ret) return ret; /* * after a reset the gain is 128 so we do a dummy read * to set the gain for the next read */ ret = hx711_read(hx711_data); if (ret < 0) return ret; /* * after a dummy read we need to wait vor readiness * for not mixing gain pulses with the clock */ ret = hx711_wait_for_ready(hx711_data); if (ret) return ret; } return val; }
static unsigned int soc_common_pcmcia_skt_state(struct soc_pcmcia_socket *skt) { struct pcmcia_state state; unsigned int stat; memset(&state, 0, sizeof(struct pcmcia_state)); /* Make battery voltage state report 'good' */ state.bvd1 = 1; state.bvd2 = 1; if (skt->stat[SOC_STAT_CD].desc) state.detect = !!gpiod_get_value(skt->stat[SOC_STAT_CD].desc); if (skt->stat[SOC_STAT_RDY].desc) state.ready = !!gpiod_get_value(skt->stat[SOC_STAT_RDY].desc); if (skt->stat[SOC_STAT_BVD1].desc) state.bvd1 = !!gpiod_get_value(skt->stat[SOC_STAT_BVD1].desc); if (skt->stat[SOC_STAT_BVD2].desc) state.bvd2 = !!gpiod_get_value(skt->stat[SOC_STAT_BVD2].desc); if (skt->stat[SOC_STAT_VS1].desc) state.vs_3v = !!gpiod_get_value(skt->stat[SOC_STAT_VS1].desc); if (skt->stat[SOC_STAT_VS2].desc) state.vs_Xv = !!gpiod_get_value(skt->stat[SOC_STAT_VS2].desc); skt->ops->socket_state(skt, &state); stat = state.detect ? SS_DETECT : 0; stat |= state.ready ? SS_READY : 0; stat |= state.wrprot ? SS_WRPROT : 0; stat |= state.vs_3v ? SS_3VCARD : 0; stat |= state.vs_Xv ? SS_XVCARD : 0; /* The power status of individual sockets is not available * explicitly from the hardware, so we just remember the state * and regurgitate it upon request: */ stat |= skt->cs_state.Vcc ? SS_POWERON : 0; if (skt->cs_state.flags & SS_IOCARD) stat |= state.bvd1 ? 0 : SS_STSCHG; else { if (state.bvd1 == 0) stat |= SS_BATDEAD; else if (state.bvd2 == 0) stat |= SS_BATWARN; } return stat; }
static int hx711_cycle(struct hx711_data *hx711_data) { int val; /* * if preempted for more then 60us while PD_SCK is high: * hx711 is going in reset * ==> measuring is false */ preempt_disable(); gpiod_set_value(hx711_data->gpiod_pd_sck, 1); val = gpiod_get_value(hx711_data->gpiod_dout); /* * here we are not waiting for 0.2 us as suggested by the datasheet, * because the oscilloscope showed in a test scenario * at least 1.15 us for PD_SCK high (T3 in datasheet) * and 0.56 us for PD_SCK low on TI Sitara with 800 MHz */ gpiod_set_value(hx711_data->gpiod_pd_sck, 0); preempt_enable(); return val; }
static int hx711_read(struct hx711_data *hx711_data) { int i, ret; int value = 0; int val = gpiod_get_value(hx711_data->gpiod_dout); /* we double check if it's really down */ if (val) return -EIO; for (i = 0; i < 24; i++) { value <<= 1; ret = hx711_cycle(hx711_data); if (ret) value++; } value ^= 0x800000; for (i = 0; i < hx711_get_gain_to_pulse(hx711_data->gain_set); i++) hx711_cycle(hx711_data); return value; }
static int ice40_fpga_ops_write_init(struct fpga_manager *mgr, struct fpga_image_info *info, const char *buf, size_t count) { struct ice40_fpga_priv *priv = mgr->priv; struct spi_device *dev = priv->dev; struct spi_message message; struct spi_transfer assert_cs_then_reset_delay = { .cs_change = 1, .delay_usecs = ICE40_SPI_RESET_DELAY }; struct spi_transfer housekeeping_delay_then_release_cs = { .delay_usecs = ICE40_SPI_HOUSEKEEPING_DELAY }; int ret; if ((info->flags & FPGA_MGR_PARTIAL_RECONFIG)) { dev_err(&dev->dev, "Partial reconfiguration is not supported\n"); return -ENOTSUPP; } /* Lock the bus, assert CRESET_B and SS_B and delay >200ns */ spi_bus_lock(dev->master); gpiod_set_value(priv->reset, 1); spi_message_init(&message); spi_message_add_tail(&assert_cs_then_reset_delay, &message); ret = spi_sync_locked(dev, &message); /* Come out of reset */ gpiod_set_value(priv->reset, 0); /* Abort if the chip-select failed */ if (ret) goto fail; /* Check CDONE is de-asserted i.e. the FPGA is reset */ if (gpiod_get_value(priv->cdone)) { dev_err(&dev->dev, "Device reset failed, CDONE is asserted\n"); ret = -EIO; goto fail; } /* Wait for the housekeeping to complete, and release SS_B */ spi_message_init(&message); spi_message_add_tail(&housekeeping_delay_then_release_cs, &message); ret = spi_sync_locked(dev, &message); fail: spi_bus_unlock(dev->master); return ret; } static int ice40_fpga_ops_write(struct fpga_manager *mgr, const char *buf, size_t count) { struct ice40_fpga_priv *priv = mgr->priv; return spi_write(priv->dev, buf, count); } static int ice40_fpga_ops_write_complete(struct fpga_manager *mgr, struct fpga_image_info *info) { struct ice40_fpga_priv *priv = mgr->priv; struct spi_device *dev = priv->dev; const u8 padding[ICE40_SPI_NUM_ACTIVATION_BYTES] = {0}; /* Check CDONE is asserted */ if (!gpiod_get_value(priv->cdone)) { dev_err(&dev->dev, "CDONE was not asserted after firmware transfer\n"); return -EIO; } /* Send of zero-padding to activate the firmware */ return spi_write(dev, padding, sizeof(padding)); } static const struct fpga_manager_ops ice40_fpga_ops = { .state = ice40_fpga_ops_state, .write_init = ice40_fpga_ops_write_init, .write = ice40_fpga_ops_write, .write_complete = ice40_fpga_ops_write_complete, }; static int ice40_fpga_probe(struct spi_device *spi) { struct device *dev = &spi->dev; struct ice40_fpga_priv *priv; struct fpga_manager *mgr; int ret; priv = devm_kzalloc(&spi->dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; priv->dev = spi; /* Check board setup data. */ if (spi->max_speed_hz > ICE40_SPI_MAX_SPEED) { dev_err(dev, "SPI speed is too high, maximum speed is " __stringify(ICE40_SPI_MAX_SPEED) "\n"); return -EINVAL; } if (spi->max_speed_hz < ICE40_SPI_MIN_SPEED) { dev_err(dev, "SPI speed is too low, minimum speed is " __stringify(ICE40_SPI_MIN_SPEED) "\n"); return -EINVAL; } if (spi->mode & SPI_CPHA) { dev_err(dev, "Bad SPI mode, CPHA not supported\n"); return -EINVAL; } /* Set up the GPIOs */ priv->cdone = devm_gpiod_get(dev, "cdone", GPIOD_IN); if (IS_ERR(priv->cdone)) { ret = PTR_ERR(priv->cdone); dev_err(dev, "Failed to get CDONE GPIO: %d\n", ret); return ret; } priv->reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH); if (IS_ERR(priv->reset)) { ret = PTR_ERR(priv->reset); dev_err(dev, "Failed to get CRESET_B GPIO: %d\n", ret); return ret; } mgr = fpga_mgr_create(dev, "Lattice iCE40 FPGA Manager", &ice40_fpga_ops, priv); if (!mgr) return -ENOMEM; spi_set_drvdata(spi, mgr); ret = fpga_mgr_register(mgr); if (ret) fpga_mgr_free(mgr); return ret; } static int ice40_fpga_remove(struct spi_device *spi) { struct fpga_manager *mgr = spi_get_drvdata(spi); fpga_mgr_unregister(mgr); return 0; } static const struct of_device_id ice40_fpga_of_match[] = { { .compatible = "lattice,ice40-fpga-mgr", }, {}, };
static int clk_gpio_gate_is_enabled(struct clk_hw *hw) { struct clk_gpio *clk = to_clk_gpio(hw); return gpiod_get_value(clk->gpiod); }
/* The fixed state is... fixed except for the link state, * which may be determined by a GPIO. */ static void phylink_get_fixed_state(struct phylink *pl, struct phylink_link_state *state) { *state = pl->link_config; if (pl->link_gpio) state->link = !!gpiod_get_value(pl->link_gpio); }
static u8 clk_gpio_mux_get_parent(struct clk_hw *hw) { struct clk_gpio *clk = to_clk_gpio(hw); return gpiod_get_value(clk->gpiod); }