diff options
| author | Olof Johansson <olof@lixom.net> | 2013-10-28 14:39:03 -0700 | 
|---|---|---|
| committer | Olof Johansson <olof@lixom.net> | 2013-10-28 14:39:03 -0700 | 
| commit | 43d93947a54cf9323198a3a37eaf3ec14adb23e1 (patch) | |
| tree | 0c290a7fcbc644b94527f399e4f9509a8d379a5d /drivers/acpi/acpi_ipmi.c | |
| parent | 02673f94d04e629e4cdc41e2bf2dc980743cf3df (diff) | |
| parent | 54b89756a14aa1043507ce0811b4b6c02c5dddcc (diff) | |
Merge tag 'omap-for-v3.13/cm-scm-cleanup-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into next/cleanup
From Paul Walmsley <paul@pwsan.com> via Tony Lindgren:
Move some of the OMAP2+ CM and System Control Module direct
register accesses into CM- and System Control
Module-specific "drivers" underneath arch/arm/mach-omap2/.  This
is a prerequisite for moving this code out of arch/arm/mach-omap2/ into
drivers/.
Basic test logs are available here:
http://www.pwsan.com/omap/testlogs/cm_scm_cleanup_a_v3.13/20131019101809/
* tag 'omap-for-v3.13/cm-scm-cleanup-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap:
  ARM: OMAP3: control: add API for setting IVA bootmode
  ARM: OMAP3: CM/control: move CM scratchpad save to CM driver
  ARM: OMAP3: McBSP: do not access CM register directly
  ARM: OMAP3: clock: add API to enable/disable autoidle for a single clock
  ARM: OMAP2: CM/PM: remove direct register accesses outside CM code
  + Linux 3.12-rc4
Signed-off-by: Olof Johansson <olof@lixom.net>
Diffstat (limited to 'drivers/acpi/acpi_ipmi.c')
| -rw-r--r-- | drivers/acpi/acpi_ipmi.c | 24 | 
1 files changed, 14 insertions, 10 deletions
diff --git a/drivers/acpi/acpi_ipmi.c b/drivers/acpi/acpi_ipmi.c index f40acef80269..a6977e12d574 100644 --- a/drivers/acpi/acpi_ipmi.c +++ b/drivers/acpi/acpi_ipmi.c @@ -39,6 +39,7 @@  #include <linux/ipmi.h>  #include <linux/device.h>  #include <linux/pnp.h> +#include <linux/spinlock.h>  MODULE_AUTHOR("Zhao Yakui");  MODULE_DESCRIPTION("ACPI IPMI Opregion driver"); @@ -57,7 +58,7 @@ struct acpi_ipmi_device {  	struct list_head head;  	/* the IPMI request message list */  	struct list_head tx_msg_list; -	struct mutex	tx_msg_lock; +	spinlock_t	tx_msg_lock;  	acpi_handle handle;  	struct pnp_dev *pnp_dev;  	ipmi_user_t	user_interface; @@ -147,6 +148,7 @@ static void acpi_format_ipmi_msg(struct acpi_ipmi_msg *tx_msg,  	struct kernel_ipmi_msg *msg;  	struct acpi_ipmi_buffer *buffer;  	struct acpi_ipmi_device *device; +	unsigned long flags;  	msg = &tx_msg->tx_message;  	/* @@ -177,10 +179,10 @@ static void acpi_format_ipmi_msg(struct acpi_ipmi_msg *tx_msg,  	/* Get the msgid */  	device = tx_msg->device; -	mutex_lock(&device->tx_msg_lock); +	spin_lock_irqsave(&device->tx_msg_lock, flags);  	device->curr_msgid++;  	tx_msg->tx_msgid = device->curr_msgid; -	mutex_unlock(&device->tx_msg_lock); +	spin_unlock_irqrestore(&device->tx_msg_lock, flags);  }  static void acpi_format_ipmi_response(struct acpi_ipmi_msg *msg, @@ -242,6 +244,7 @@ static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data)  	int msg_found = 0;  	struct acpi_ipmi_msg *tx_msg;  	struct pnp_dev *pnp_dev = ipmi_device->pnp_dev; +	unsigned long flags;  	if (msg->user != ipmi_device->user_interface) {  		dev_warn(&pnp_dev->dev, "Unexpected response is returned. " @@ -250,7 +253,7 @@ static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data)  		ipmi_free_recv_msg(msg);  		return;  	} -	mutex_lock(&ipmi_device->tx_msg_lock); +	spin_lock_irqsave(&ipmi_device->tx_msg_lock, flags);  	list_for_each_entry(tx_msg, &ipmi_device->tx_msg_list, head) {  		if (msg->msgid == tx_msg->tx_msgid) {  			msg_found = 1; @@ -258,7 +261,7 @@ static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data)  		}  	} -	mutex_unlock(&ipmi_device->tx_msg_lock); +	spin_unlock_irqrestore(&ipmi_device->tx_msg_lock, flags);  	if (!msg_found) {  		dev_warn(&pnp_dev->dev, "Unexpected response (msg id %ld) is "  			"returned.\n", msg->msgid); @@ -378,6 +381,7 @@ acpi_ipmi_space_handler(u32 function, acpi_physical_address address,  	struct acpi_ipmi_device *ipmi_device = handler_context;  	int err, rem_time;  	acpi_status status; +	unsigned long flags;  	/*  	 * IPMI opregion message.  	 * IPMI message is firstly written to the BMC and system software @@ -395,9 +399,9 @@ acpi_ipmi_space_handler(u32 function, acpi_physical_address address,  		return AE_NO_MEMORY;  	acpi_format_ipmi_msg(tx_msg, address, value); -	mutex_lock(&ipmi_device->tx_msg_lock); +	spin_lock_irqsave(&ipmi_device->tx_msg_lock, flags);  	list_add_tail(&tx_msg->head, &ipmi_device->tx_msg_list); -	mutex_unlock(&ipmi_device->tx_msg_lock); +	spin_unlock_irqrestore(&ipmi_device->tx_msg_lock, flags);  	err = ipmi_request_settime(ipmi_device->user_interface,  					&tx_msg->addr,  					tx_msg->tx_msgid, @@ -413,9 +417,9 @@ acpi_ipmi_space_handler(u32 function, acpi_physical_address address,  	status = AE_OK;  end_label: -	mutex_lock(&ipmi_device->tx_msg_lock); +	spin_lock_irqsave(&ipmi_device->tx_msg_lock, flags);  	list_del(&tx_msg->head); -	mutex_unlock(&ipmi_device->tx_msg_lock); +	spin_unlock_irqrestore(&ipmi_device->tx_msg_lock, flags);  	kfree(tx_msg);  	return status;  } @@ -457,7 +461,7 @@ static void acpi_add_ipmi_device(struct acpi_ipmi_device *ipmi_device)  	INIT_LIST_HEAD(&ipmi_device->head); -	mutex_init(&ipmi_device->tx_msg_lock); +	spin_lock_init(&ipmi_device->tx_msg_lock);  	INIT_LIST_HEAD(&ipmi_device->tx_msg_list);  	ipmi_install_space_handler(ipmi_device);  | 
