Lines Matching +full:no +full:- +full:pc +full:- +full:write

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2010-2012 Stephane Grosjean <s.grosjean@peak-system.com>
5 * CAN driver for PEAK-System PCAN-PC Card
7 * Copyright (C) 2006-2010 PEAK System-Technik GmbH
22 MODULE_AUTHOR("Stephane Grosjean <s.grosjean@peak-system.com>");
23 MODULE_DESCRIPTION("CAN driver for PEAK-System PCAN-PC Cards");
25 MODULE_SUPPORTED_DEVICE("PEAK PCAN-PC Card");
27 /* PEAK-System PCMCIA driver name */
101 /* note: EEPROM Read/Write instructions include A8 bit */
104 #define PCC_EEP_WRDI 0x04 /* EEPROM Write Disable */
106 #define PCC_EEP_WREN 0x06 /* EEPROM Write Enable */
109 #define PCC_EEP_SR_WEN 0x02 /* EEPROM SR Write Enable bit */
110 #define PCC_EEP_SR_WIP 0x01 /* EEPROM SR Write In Progress bit */
118 * This means normal output mode, push-pull and the correct polarity.
136 /* PCAN-PC Card private structure */
162 if (!timer_pending(&card->led_timer)) in pcan_start_led_timer()
163 mod_timer(&card->led_timer, jiffies + HZ); in pcan_start_led_timer()
171 del_timer_sync(&card->led_timer); in pcan_stop_led_timer()
179 return ioread8(priv->reg_base + port); in pcan_read_canreg()
183 * write a sja1000 register
187 struct pcan_pccard *card = priv->priv; in pcan_write_canreg()
188 int c = (priv->reg_base - card->ioport_addr) / PCC_CHAN_SIZE; in pcan_write_canreg()
206 iowrite8(v, priv->reg_base + port); in pcan_write_canreg()
214 return ioread8(card->ioport_addr + PCC_COMN_OFF + port); in pcan_read_reg()
218 * write a register into the common area
224 if (card->ccr == v) in pcan_write_reg()
226 card->ccr = v; in pcan_write_reg()
229 iowrite8(v, card->ioport_addr + PCC_COMN_OFF + port); in pcan_write_reg()
238 return ((pcan_read_reg(card, PCC_FW_MAJOR) == card->fw_major) && in pcan_pccard_present()
239 (pcan_read_reg(card, PCC_FW_MINOR) == card->fw_minor)); in pcan_pccard_present()
253 return -EBUSY; in pcan_wait_spi_busy()
261 * write data in device eeprom
268 /* write instruction enabling write */ in pcan_write_eeprom()
274 /* wait until write enabled */ in pcan_write_eeprom()
276 /* write instruction reading the status register */ in pcan_write_eeprom()
282 /* get status register value and check write enable bit */ in pcan_write_eeprom()
289 dev_err(&card->pdev->dev, in pcan_write_eeprom()
290 "stop waiting to be allowed to write in eeprom\n"); in pcan_write_eeprom()
291 return -EIO; in pcan_write_eeprom()
299 * write instruction with bit[3] set according to address value: in pcan_write_eeprom()
307 /* wait while write in progress */ in pcan_write_eeprom()
309 /* write instruction reading the status register */ in pcan_write_eeprom()
315 /* get status register value and check write in progress bit */ in pcan_write_eeprom()
322 dev_err(&card->pdev->dev, in pcan_write_eeprom()
323 "stop waiting for write in eeprom to complete\n"); in pcan_write_eeprom()
324 return -EIO; in pcan_write_eeprom()
327 /* write instruction disabling write */ in pcan_write_eeprom()
336 dev_err(&card->pdev->dev, in pcan_write_eeprom()
344 u8 ccr = card->ccr; in pcan_set_leds()
347 for (i = 0; i < card->chan_count; i++) in pcan_set_leds()
355 /* real write only if something has changed in ccr */ in pcan_set_leds()
368 dev_err(&card->pdev->dev, in pcan_set_can_power()
383 ccr = card->ccr; in pcan_led_timer()
384 for (i = 0; i < card->chan_count; i++) { in pcan_led_timer()
389 netdev = card->channel[i].netdev; in pcan_led_timer()
390 if (!netdev || !(netdev->flags & IFF_UP)) in pcan_led_timer()
395 /* no activity (but configured) */ in pcan_led_timer()
400 if (netdev->stats.rx_bytes != card->channel[i].prev_rx_bytes) { in pcan_led_timer()
401 card->channel[i].prev_rx_bytes = netdev->stats.rx_bytes; in pcan_led_timer()
405 if (netdev->stats.tx_bytes != card->channel[i].prev_tx_bytes) { in pcan_led_timer()
406 card->channel[i].prev_tx_bytes = netdev->stats.tx_bytes; in pcan_led_timer()
412 /* write the new leds state */ in pcan_led_timer()
415 /* restart timer (except if no more configured channels) */ in pcan_led_timer()
417 mod_timer(&card->led_timer, jiffies + HZ); in pcan_led_timer()
435 for (i = 0; i < card->chan_count; i++) { in pcan_isr()
451 netdev = card->channel[i].netdev; in pcan_isr()
472 for (i = 0; i < card->chan_count; i++) { in pcan_free_channels()
478 netdev = card->channel[i].netdev; in pcan_free_channels()
482 strlcpy(name, netdev->name, IFNAMSIZ); in pcan_free_channels()
488 dev_info(&card->pdev->dev, "%s removed\n", name); in pcan_free_channels()
507 /* read reset-values */ in pcan_channel_present()
516 struct pcmcia_device *pdev = card->pdev; in pcan_add_channels()
521 card->ccr = ~ccr; in pcan_add_channels()
531 for (i = 0; i < ARRAY_SIZE(card->channel); i++) { in pcan_add_channels()
537 err = -ENOMEM; in pcan_add_channels()
543 priv->priv = card; in pcan_add_channels()
544 SET_NETDEV_DEV(netdev, &pdev->dev); in pcan_add_channels()
545 netdev->dev_id = i; in pcan_add_channels()
547 priv->irq_flags = IRQF_SHARED; in pcan_add_channels()
548 netdev->irq = pdev->irq; in pcan_add_channels()
549 priv->reg_base = card->ioport_addr + PCC_CHAN_OFF(i); in pcan_add_channels()
553 dev_err(&pdev->dev, "channel %d not present\n", i); in pcan_add_channels()
558 priv->read_reg = pcan_read_canreg; in pcan_add_channels()
559 priv->write_reg = pcan_write_canreg; in pcan_add_channels()
560 priv->can.clock.freq = PCC_CAN_CLOCK; in pcan_add_channels()
561 priv->ocr = PCC_OCR; in pcan_add_channels()
562 priv->cdr = PCC_CDR; in pcan_add_channels()
566 priv->cdr |= CDR_CLK_OFF; in pcan_add_channels()
568 priv->flags |= SJA1000_CUSTOM_IRQ_HANDLER; in pcan_add_channels()
577 card->channel[i].netdev = netdev; in pcan_add_channels()
578 card->chan_count++; in pcan_add_channels()
583 dev_info(&pdev->dev, in pcan_add_channels()
585 netdev->name, i, priv->reg_base, pdev->irq); in pcan_add_channels()
588 /* write new ccr (change leds state) */ in pcan_add_channels()
596 pdev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; in pcan_conf_check()
597 pdev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; /* only */ in pcan_conf_check()
598 pdev->io_lines = 10; in pcan_conf_check()
609 struct pcan_pccard *card = pdev->priv; in pcan_free()
614 free_irq(pdev->irq, card); in pcan_free()
619 ioport_unmap(card->ioport_addr); in pcan_free()
622 pdev->priv = NULL; in pcan_free()
626 * setup PCMCIA socket and probe for PEAK-System PC-CARD
633 pdev->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO; in pcan_probe()
637 dev_err(&pdev->dev, "pcmcia_loop_config() error %d\n", err); in pcan_probe()
641 if (!pdev->irq) { in pcan_probe()
642 dev_err(&pdev->dev, "no irq assigned\n"); in pcan_probe()
643 err = -ENODEV; in pcan_probe()
649 dev_err(&pdev->dev, "pcmcia_enable_device failed err=%d\n", in pcan_probe()
656 err = -ENOMEM; in pcan_probe()
660 card->pdev = pdev; in pcan_probe()
661 pdev->priv = card; in pcan_probe()
664 card->ioport_addr = ioport_map(pdev->resource[0]->start, in pcan_probe()
665 resource_size(pdev->resource[0])); in pcan_probe()
666 if (!card->ioport_addr) { in pcan_probe()
667 dev_err(&pdev->dev, "couldn't map io port into io memory\n"); in pcan_probe()
668 err = -ENOMEM; in pcan_probe()
671 card->fw_major = pcan_read_reg(card, PCC_FW_MAJOR); in pcan_probe()
672 card->fw_minor = pcan_read_reg(card, PCC_FW_MINOR); in pcan_probe()
675 dev_info(&pdev->dev, "PEAK-System pcmcia card %s fw %d.%d\n", in pcan_probe()
676 pdev->prod_id[1] ? pdev->prod_id[1] : "PCAN-PC Card", in pcan_probe()
677 card->fw_major, card->fw_minor); in pcan_probe()
681 if (!card->chan_count) { in pcan_probe()
682 err = -ENOMEM; in pcan_probe()
687 timer_setup(&card->led_timer, pcan_led_timer, 0); in pcan_probe()
690 err = request_irq(pdev->irq, &pcan_isr, IRQF_SHARED, PCC_NAME, card); in pcan_probe()
692 dev_err(&pdev->dev, "couldn't request irq%d\n", pdev->irq); in pcan_probe()
706 ioport_unmap(card->ioport_addr); in pcan_probe()
710 pdev->priv = NULL; in pcan_probe()