diff options
Diffstat (limited to 'drivers/misc')
| -rw-r--r-- | drivers/misc/atmel-ssc.c | 11 | ||||
| -rw-r--r-- | drivers/misc/mei/hbm.c | 2 | ||||
| -rw-r--r-- | drivers/misc/mei/hw-me.c | 14 | ||||
| -rw-r--r-- | drivers/misc/mei/init.c | 3 |
4 files changed, 21 insertions, 9 deletions
diff --git a/drivers/misc/atmel-ssc.c b/drivers/misc/atmel-ssc.c index f7b90661e321..e068a76a5f6f 100644 --- a/drivers/misc/atmel-ssc.c +++ b/drivers/misc/atmel-ssc.c | |||
| @@ -66,14 +66,19 @@ EXPORT_SYMBOL(ssc_request); | |||
| 66 | 66 | ||
| 67 | void ssc_free(struct ssc_device *ssc) | 67 | void ssc_free(struct ssc_device *ssc) |
| 68 | { | 68 | { |
| 69 | bool disable_clk = true; | ||
| 70 | |||
| 69 | spin_lock(&user_lock); | 71 | spin_lock(&user_lock); |
| 70 | if (ssc->user) { | 72 | if (ssc->user) |
| 71 | ssc->user--; | 73 | ssc->user--; |
| 72 | clk_disable_unprepare(ssc->clk); | 74 | else { |
| 73 | } else { | 75 | disable_clk = false; |
| 74 | dev_dbg(&ssc->pdev->dev, "device already free\n"); | 76 | dev_dbg(&ssc->pdev->dev, "device already free\n"); |
| 75 | } | 77 | } |
| 76 | spin_unlock(&user_lock); | 78 | spin_unlock(&user_lock); |
| 79 | |||
| 80 | if (disable_clk) | ||
| 81 | clk_disable_unprepare(ssc->clk); | ||
| 77 | } | 82 | } |
| 78 | EXPORT_SYMBOL(ssc_free); | 83 | EXPORT_SYMBOL(ssc_free); |
| 79 | 84 | ||
diff --git a/drivers/misc/mei/hbm.c b/drivers/misc/mei/hbm.c index f9296abcf02a..6127ab64bb39 100644 --- a/drivers/misc/mei/hbm.c +++ b/drivers/misc/mei/hbm.c | |||
| @@ -167,7 +167,7 @@ int mei_hbm_start_req(struct mei_device *dev) | |||
| 167 | 167 | ||
| 168 | dev->hbm_state = MEI_HBM_IDLE; | 168 | dev->hbm_state = MEI_HBM_IDLE; |
| 169 | if (mei_write_message(dev, mei_hdr, dev->wr_msg.data)) { | 169 | if (mei_write_message(dev, mei_hdr, dev->wr_msg.data)) { |
| 170 | dev_err(&dev->pdev->dev, "version message writet failed\n"); | 170 | dev_err(&dev->pdev->dev, "version message write failed\n"); |
| 171 | dev->dev_state = MEI_DEV_RESETTING; | 171 | dev->dev_state = MEI_DEV_RESETTING; |
| 172 | mei_reset(dev, 1); | 172 | mei_reset(dev, 1); |
| 173 | return -ENODEV; | 173 | return -ENODEV; |
diff --git a/drivers/misc/mei/hw-me.c b/drivers/misc/mei/hw-me.c index e4f8dec4dc3c..b22c7e247225 100644 --- a/drivers/misc/mei/hw-me.c +++ b/drivers/misc/mei/hw-me.c | |||
| @@ -239,14 +239,18 @@ static int mei_me_hw_ready_wait(struct mei_device *dev) | |||
| 239 | if (mei_me_hw_is_ready(dev)) | 239 | if (mei_me_hw_is_ready(dev)) |
| 240 | return 0; | 240 | return 0; |
| 241 | 241 | ||
| 242 | dev->recvd_hw_ready = false; | ||
| 242 | mutex_unlock(&dev->device_lock); | 243 | mutex_unlock(&dev->device_lock); |
| 243 | err = wait_event_interruptible_timeout(dev->wait_hw_ready, | 244 | err = wait_event_interruptible_timeout(dev->wait_hw_ready, |
| 244 | dev->recvd_hw_ready, MEI_INTEROP_TIMEOUT); | 245 | dev->recvd_hw_ready, |
| 246 | mei_secs_to_jiffies(MEI_INTEROP_TIMEOUT)); | ||
| 245 | mutex_lock(&dev->device_lock); | 247 | mutex_lock(&dev->device_lock); |
| 246 | if (!err && !dev->recvd_hw_ready) { | 248 | if (!err && !dev->recvd_hw_ready) { |
| 249 | if (!err) | ||
| 250 | err = -ETIMEDOUT; | ||
| 247 | dev_err(&dev->pdev->dev, | 251 | dev_err(&dev->pdev->dev, |
| 248 | "wait hw ready failed. status = 0x%x\n", err); | 252 | "wait hw ready failed. status = %d\n", err); |
| 249 | return -ETIMEDOUT; | 253 | return err; |
| 250 | } | 254 | } |
| 251 | 255 | ||
| 252 | dev->recvd_hw_ready = false; | 256 | dev->recvd_hw_ready = false; |
| @@ -483,7 +487,9 @@ irqreturn_t mei_me_irq_thread_handler(int irq, void *dev_id) | |||
| 483 | /* check if ME wants a reset */ | 487 | /* check if ME wants a reset */ |
| 484 | if (!mei_hw_is_ready(dev) && | 488 | if (!mei_hw_is_ready(dev) && |
| 485 | dev->dev_state != MEI_DEV_RESETTING && | 489 | dev->dev_state != MEI_DEV_RESETTING && |
| 486 | dev->dev_state != MEI_DEV_INITIALIZING) { | 490 | dev->dev_state != MEI_DEV_INITIALIZING && |
| 491 | dev->dev_state != MEI_DEV_POWER_DOWN && | ||
| 492 | dev->dev_state != MEI_DEV_POWER_UP) { | ||
| 487 | dev_dbg(&dev->pdev->dev, "FW not ready.\n"); | 493 | dev_dbg(&dev->pdev->dev, "FW not ready.\n"); |
| 488 | mei_reset(dev, 1); | 494 | mei_reset(dev, 1); |
| 489 | mutex_unlock(&dev->device_lock); | 495 | mutex_unlock(&dev->device_lock); |
diff --git a/drivers/misc/mei/init.c b/drivers/misc/mei/init.c index ed1d75203af6..e6f16f83ecde 100644 --- a/drivers/misc/mei/init.c +++ b/drivers/misc/mei/init.c | |||
| @@ -148,7 +148,8 @@ void mei_reset(struct mei_device *dev, int interrupts_enabled) | |||
| 148 | 148 | ||
| 149 | dev->hbm_state = MEI_HBM_IDLE; | 149 | dev->hbm_state = MEI_HBM_IDLE; |
| 150 | 150 | ||
| 151 | if (dev->dev_state != MEI_DEV_INITIALIZING) { | 151 | if (dev->dev_state != MEI_DEV_INITIALIZING && |
| 152 | dev->dev_state != MEI_DEV_POWER_UP) { | ||
| 152 | if (dev->dev_state != MEI_DEV_DISABLED && | 153 | if (dev->dev_state != MEI_DEV_DISABLED && |
| 153 | dev->dev_state != MEI_DEV_POWER_DOWN) | 154 | dev->dev_state != MEI_DEV_POWER_DOWN) |
| 154 | dev->dev_state = MEI_DEV_RESETTING; | 155 | dev->dev_state = MEI_DEV_RESETTING; |
