diff options
Diffstat (limited to 'drivers/firewire/core-card.c')
| -rw-r--r-- | drivers/firewire/core-card.c | 42 | 
1 files changed, 42 insertions, 0 deletions
| diff --git a/drivers/firewire/core-card.c b/drivers/firewire/core-card.c index 54be88167c60..6ac5ff20a2fe 100644 --- a/drivers/firewire/core-card.c +++ b/drivers/firewire/core-card.c @@ -616,6 +616,15 @@ static struct fw_iso_context *dummy_allocate_iso_context(struct fw_card *card,  	return ERR_PTR(-ENODEV);  } +static u32 dummy_read_csr(struct fw_card *card, int csr_offset) +{ +	return 0; +} + +static void dummy_write_csr(struct fw_card *card, int csr_offset, u32 value) +{ +} +  static int dummy_start_iso(struct fw_iso_context *ctx,  			   s32 cycle, u32 sync, u32 tags)  { @@ -649,6 +658,8 @@ static const struct fw_card_driver dummy_driver_template = {  	.send_response		= dummy_send_response,  	.cancel_packet		= dummy_cancel_packet,  	.enable_phys_dma	= dummy_enable_phys_dma, +	.read_csr		= dummy_read_csr, +	.write_csr		= dummy_write_csr,  	.allocate_iso_context	= dummy_allocate_iso_context,  	.start_iso		= dummy_start_iso,  	.set_iso_channels	= dummy_set_iso_channels, @@ -668,6 +679,7 @@ EXPORT_SYMBOL_GPL(fw_card_release);  void fw_core_remove_card(struct fw_card *card)  {  	struct fw_card_driver dummy_driver = dummy_driver_template; +	unsigned long flags;  	card->driver->update_phy_reg(card, 4,  				     PHY_LINK_ACTIVE | PHY_CONTENDER, 0); @@ -682,7 +694,9 @@ void fw_core_remove_card(struct fw_card *card)  	dummy_driver.stop_iso		= card->driver->stop_iso;  	card->driver = &dummy_driver; +	spin_lock_irqsave(&card->lock, flags);  	fw_destroy_nodes(card); +	spin_unlock_irqrestore(&card->lock, flags);  	/* Wait for all users, especially device workqueue jobs, to finish. */  	fw_card_put(card); @@ -691,3 +705,31 @@ void fw_core_remove_card(struct fw_card *card)  	WARN_ON(!list_empty(&card->transaction_list));  }  EXPORT_SYMBOL(fw_core_remove_card); + +/** + * fw_card_read_cycle_time: read from Isochronous Cycle Timer Register of 1394 OHCI in MMIO region + *			    for controller card. + * @card: The instance of card for 1394 OHCI controller. + * @cycle_time: The mutual reference to value of cycle time for the read operation. + * + * Read value from Isochronous Cycle Timer Register of 1394 OHCI in MMIO region for the given + * controller card. This function accesses the region without any lock primitives or IRQ mask. + * When returning successfully, the content of @value argument has value aligned to host endianness, + * formetted by CYCLE_TIME CSR Register of IEEE 1394 std. + * + * Context: Any context. + * Return: + * * 0 - Read successfully. + * * -ENODEV - The controller is unavailable due to being removed or unbound. + */ +int fw_card_read_cycle_time(struct fw_card *card, u32 *cycle_time) +{ +	if (card->driver->read_csr == dummy_read_csr) +		return -ENODEV; + +	// It's possible to switch to dummy driver between the above and the below. This is the best +	// effort to return -ENODEV. +	*cycle_time = card->driver->read_csr(card, CSR_CYCLE_TIME); +	return 0; +} +EXPORT_SYMBOL_GPL(fw_card_read_cycle_time); | 
