diff options
Diffstat (limited to 'drivers')
120 files changed, 880 insertions, 778 deletions
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index 2614a839c60d..42c66b64c12c 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c | |||
@@ -1044,8 +1044,10 @@ static int acpi_ec_query(struct acpi_ec *ec, u8 *data) | |||
1044 | goto err_exit; | 1044 | goto err_exit; |
1045 | 1045 | ||
1046 | mutex_lock(&ec->mutex); | 1046 | mutex_lock(&ec->mutex); |
1047 | result = -ENODATA; | ||
1047 | list_for_each_entry(handler, &ec->list, node) { | 1048 | list_for_each_entry(handler, &ec->list, node) { |
1048 | if (value == handler->query_bit) { | 1049 | if (value == handler->query_bit) { |
1050 | result = 0; | ||
1049 | q->handler = acpi_ec_get_query_handler(handler); | 1051 | q->handler = acpi_ec_get_query_handler(handler); |
1050 | ec_dbg_evt("Query(0x%02x) scheduled", | 1052 | ec_dbg_evt("Query(0x%02x) scheduled", |
1051 | q->handler->query_bit); | 1053 | q->handler->query_bit); |
diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c index 6da0f9beab19..c9336751e5e3 100644 --- a/drivers/acpi/pci_irq.c +++ b/drivers/acpi/pci_irq.c | |||
@@ -372,6 +372,7 @@ static int acpi_isa_register_gsi(struct pci_dev *dev) | |||
372 | 372 | ||
373 | /* Interrupt Line values above 0xF are forbidden */ | 373 | /* Interrupt Line values above 0xF are forbidden */ |
374 | if (dev->irq > 0 && (dev->irq <= 0xF) && | 374 | if (dev->irq > 0 && (dev->irq <= 0xF) && |
375 | acpi_isa_irq_available(dev->irq) && | ||
375 | (acpi_isa_irq_to_gsi(dev->irq, &dev_gsi) == 0)) { | 376 | (acpi_isa_irq_to_gsi(dev->irq, &dev_gsi) == 0)) { |
376 | dev_warn(&dev->dev, "PCI INT %c: no GSI - using ISA IRQ %d\n", | 377 | dev_warn(&dev->dev, "PCI INT %c: no GSI - using ISA IRQ %d\n", |
377 | pin_name(dev->pin), dev->irq); | 378 | pin_name(dev->pin), dev->irq); |
diff --git a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c index 3b4ea98e3ea0..7c8408b946ca 100644 --- a/drivers/acpi/pci_link.c +++ b/drivers/acpi/pci_link.c | |||
@@ -498,8 +498,7 @@ int __init acpi_irq_penalty_init(void) | |||
498 | PIRQ_PENALTY_PCI_POSSIBLE; | 498 | PIRQ_PENALTY_PCI_POSSIBLE; |
499 | } | 499 | } |
500 | } | 500 | } |
501 | /* Add a penalty for the SCI */ | 501 | |
502 | acpi_irq_penalty[acpi_gbl_FADT.sci_interrupt] += PIRQ_PENALTY_PCI_USING; | ||
503 | return 0; | 502 | return 0; |
504 | } | 503 | } |
505 | 504 | ||
@@ -553,6 +552,13 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link) | |||
553 | irq = link->irq.possible[i]; | 552 | irq = link->irq.possible[i]; |
554 | } | 553 | } |
555 | } | 554 | } |
555 | if (acpi_irq_penalty[irq] >= PIRQ_PENALTY_ISA_ALWAYS) { | ||
556 | printk(KERN_ERR PREFIX "No IRQ available for %s [%s]. " | ||
557 | "Try pci=noacpi or acpi=off\n", | ||
558 | acpi_device_name(link->device), | ||
559 | acpi_device_bid(link->device)); | ||
560 | return -ENODEV; | ||
561 | } | ||
556 | 562 | ||
557 | /* Attempt to enable the link device at this IRQ. */ | 563 | /* Attempt to enable the link device at this IRQ. */ |
558 | if (acpi_pci_link_set(link, irq)) { | 564 | if (acpi_pci_link_set(link, irq)) { |
@@ -821,6 +827,12 @@ void acpi_penalize_isa_irq(int irq, int active) | |||
821 | } | 827 | } |
822 | } | 828 | } |
823 | 829 | ||
830 | bool acpi_isa_irq_available(int irq) | ||
831 | { | ||
832 | return irq >= 0 && (irq >= ARRAY_SIZE(acpi_irq_penalty) || | ||
833 | acpi_irq_penalty[irq] < PIRQ_PENALTY_ISA_ALWAYS); | ||
834 | } | ||
835 | |||
824 | /* | 836 | /* |
825 | * Penalize IRQ used by ACPI SCI. If ACPI SCI pin attributes conflict with | 837 | * Penalize IRQ used by ACPI SCI. If ACPI SCI pin attributes conflict with |
826 | * PCI IRQ attributes, mark ACPI SCI as ISA_ALWAYS so it won't be use for | 838 | * PCI IRQ attributes, mark ACPI SCI as ISA_ALWAYS so it won't be use for |
diff --git a/drivers/base/power/opp.c b/drivers/base/power/opp.c index 28cd75c535b0..7ae7cd990fbf 100644 --- a/drivers/base/power/opp.c +++ b/drivers/base/power/opp.c | |||
@@ -892,10 +892,17 @@ static int opp_get_microvolt(struct dev_pm_opp *opp, struct device *dev) | |||
892 | u32 microvolt[3] = {0}; | 892 | u32 microvolt[3] = {0}; |
893 | int count, ret; | 893 | int count, ret; |
894 | 894 | ||
895 | count = of_property_count_u32_elems(opp->np, "opp-microvolt"); | 895 | /* Missing property isn't a problem, but an invalid entry is */ |
896 | if (!count) | 896 | if (!of_find_property(opp->np, "opp-microvolt", NULL)) |
897 | return 0; | 897 | return 0; |
898 | 898 | ||
899 | count = of_property_count_u32_elems(opp->np, "opp-microvolt"); | ||
900 | if (count < 0) { | ||
901 | dev_err(dev, "%s: Invalid opp-microvolt property (%d)\n", | ||
902 | __func__, count); | ||
903 | return count; | ||
904 | } | ||
905 | |||
899 | /* There can be one or three elements here */ | 906 | /* There can be one or three elements here */ |
900 | if (count != 1 && count != 3) { | 907 | if (count != 1 && count != 3) { |
901 | dev_err(dev, "%s: Invalid number of elements in opp-microvolt property (%d)\n", | 908 | dev_err(dev, "%s: Invalid number of elements in opp-microvolt property (%d)\n", |
@@ -1063,7 +1070,7 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_add); | |||
1063 | * share a common logic which is isolated here. | 1070 | * share a common logic which is isolated here. |
1064 | * | 1071 | * |
1065 | * Return: -EINVAL for bad pointers, -ENOMEM if no memory available for the | 1072 | * Return: -EINVAL for bad pointers, -ENOMEM if no memory available for the |
1066 | * copy operation, returns 0 if no modifcation was done OR modification was | 1073 | * copy operation, returns 0 if no modification was done OR modification was |
1067 | * successful. | 1074 | * successful. |
1068 | * | 1075 | * |
1069 | * Locking: The internal device_opp and opp structures are RCU protected. | 1076 | * Locking: The internal device_opp and opp structures are RCU protected. |
@@ -1151,7 +1158,7 @@ unlock: | |||
1151 | * mutex locking or synchronize_rcu() blocking calls cannot be used. | 1158 | * mutex locking or synchronize_rcu() blocking calls cannot be used. |
1152 | * | 1159 | * |
1153 | * Return: -EINVAL for bad pointers, -ENOMEM if no memory available for the | 1160 | * Return: -EINVAL for bad pointers, -ENOMEM if no memory available for the |
1154 | * copy operation, returns 0 if no modifcation was done OR modification was | 1161 | * copy operation, returns 0 if no modification was done OR modification was |
1155 | * successful. | 1162 | * successful. |
1156 | */ | 1163 | */ |
1157 | int dev_pm_opp_enable(struct device *dev, unsigned long freq) | 1164 | int dev_pm_opp_enable(struct device *dev, unsigned long freq) |
@@ -1177,7 +1184,7 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_enable); | |||
1177 | * mutex locking or synchronize_rcu() blocking calls cannot be used. | 1184 | * mutex locking or synchronize_rcu() blocking calls cannot be used. |
1178 | * | 1185 | * |
1179 | * Return: -EINVAL for bad pointers, -ENOMEM if no memory available for the | 1186 | * Return: -EINVAL for bad pointers, -ENOMEM if no memory available for the |
1180 | * copy operation, returns 0 if no modifcation was done OR modification was | 1187 | * copy operation, returns 0 if no modification was done OR modification was |
1181 | * successful. | 1188 | * successful. |
1182 | */ | 1189 | */ |
1183 | int dev_pm_opp_disable(struct device *dev, unsigned long freq) | 1190 | int dev_pm_opp_disable(struct device *dev, unsigned long freq) |
diff --git a/drivers/block/loop.c b/drivers/block/loop.c index f9889b6bc02c..674f800a3b57 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c | |||
@@ -1486,17 +1486,16 @@ static void loop_handle_cmd(struct loop_cmd *cmd) | |||
1486 | { | 1486 | { |
1487 | const bool write = cmd->rq->cmd_flags & REQ_WRITE; | 1487 | const bool write = cmd->rq->cmd_flags & REQ_WRITE; |
1488 | struct loop_device *lo = cmd->rq->q->queuedata; | 1488 | struct loop_device *lo = cmd->rq->q->queuedata; |
1489 | int ret = -EIO; | 1489 | int ret = 0; |
1490 | 1490 | ||
1491 | if (write && (lo->lo_flags & LO_FLAGS_READ_ONLY)) | 1491 | if (write && (lo->lo_flags & LO_FLAGS_READ_ONLY)) { |
1492 | ret = -EIO; | ||
1492 | goto failed; | 1493 | goto failed; |
1494 | } | ||
1493 | 1495 | ||
1494 | ret = do_req_filebacked(lo, cmd->rq); | 1496 | ret = do_req_filebacked(lo, cmd->rq); |
1495 | |||
1496 | failed: | 1497 | failed: |
1497 | if (ret) | 1498 | blk_mq_complete_request(cmd->rq, ret ? -EIO : 0); |
1498 | cmd->rq->errors = -EIO; | ||
1499 | blk_mq_complete_request(cmd->rq); | ||
1500 | } | 1499 | } |
1501 | 1500 | ||
1502 | static void loop_queue_write_work(struct work_struct *work) | 1501 | static void loop_queue_write_work(struct work_struct *work) |
diff --git a/drivers/block/null_blk.c b/drivers/block/null_blk.c index a295b98c6bae..1c9e4fe5aa44 100644 --- a/drivers/block/null_blk.c +++ b/drivers/block/null_blk.c | |||
@@ -289,7 +289,7 @@ static inline void null_handle_cmd(struct nullb_cmd *cmd) | |||
289 | case NULL_IRQ_SOFTIRQ: | 289 | case NULL_IRQ_SOFTIRQ: |
290 | switch (queue_mode) { | 290 | switch (queue_mode) { |
291 | case NULL_Q_MQ: | 291 | case NULL_Q_MQ: |
292 | blk_mq_complete_request(cmd->rq); | 292 | blk_mq_complete_request(cmd->rq, cmd->rq->errors); |
293 | break; | 293 | break; |
294 | case NULL_Q_RQ: | 294 | case NULL_Q_RQ: |
295 | blk_complete_request(cmd->rq); | 295 | blk_complete_request(cmd->rq); |
diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c index b97fc3fe0916..6f04771f1019 100644 --- a/drivers/block/nvme-core.c +++ b/drivers/block/nvme-core.c | |||
@@ -618,16 +618,15 @@ static void req_completion(struct nvme_queue *nvmeq, void *ctx, | |||
618 | spin_unlock_irqrestore(req->q->queue_lock, flags); | 618 | spin_unlock_irqrestore(req->q->queue_lock, flags); |
619 | return; | 619 | return; |
620 | } | 620 | } |
621 | |||
621 | if (req->cmd_type == REQ_TYPE_DRV_PRIV) { | 622 | if (req->cmd_type == REQ_TYPE_DRV_PRIV) { |
622 | if (cmd_rq->ctx == CMD_CTX_CANCELLED) | 623 | if (cmd_rq->ctx == CMD_CTX_CANCELLED) |
623 | req->errors = -EINTR; | 624 | status = -EINTR; |
624 | else | ||
625 | req->errors = status; | ||
626 | } else { | 625 | } else { |
627 | req->errors = nvme_error_status(status); | 626 | status = nvme_error_status(status); |
628 | } | 627 | } |
629 | } else | 628 | } |
630 | req->errors = 0; | 629 | |
631 | if (req->cmd_type == REQ_TYPE_DRV_PRIV) { | 630 | if (req->cmd_type == REQ_TYPE_DRV_PRIV) { |
632 | u32 result = le32_to_cpup(&cqe->result); | 631 | u32 result = le32_to_cpup(&cqe->result); |
633 | req->special = (void *)(uintptr_t)result; | 632 | req->special = (void *)(uintptr_t)result; |
@@ -650,7 +649,7 @@ static void req_completion(struct nvme_queue *nvmeq, void *ctx, | |||
650 | } | 649 | } |
651 | nvme_free_iod(nvmeq->dev, iod); | 650 | nvme_free_iod(nvmeq->dev, iod); |
652 | 651 | ||
653 | blk_mq_complete_request(req); | 652 | blk_mq_complete_request(req, status); |
654 | } | 653 | } |
655 | 654 | ||
656 | /* length is in bytes. gfp flags indicates whether we may sleep. */ | 655 | /* length is in bytes. gfp flags indicates whether we may sleep. */ |
@@ -863,8 +862,7 @@ static int nvme_queue_rq(struct blk_mq_hw_ctx *hctx, | |||
863 | if (ns && ns->ms && !blk_integrity_rq(req)) { | 862 | if (ns && ns->ms && !blk_integrity_rq(req)) { |
864 | if (!(ns->pi_type && ns->ms == 8) && | 863 | if (!(ns->pi_type && ns->ms == 8) && |
865 | req->cmd_type != REQ_TYPE_DRV_PRIV) { | 864 | req->cmd_type != REQ_TYPE_DRV_PRIV) { |
866 | req->errors = -EFAULT; | 865 | blk_mq_complete_request(req, -EFAULT); |
867 | blk_mq_complete_request(req); | ||
868 | return BLK_MQ_RQ_QUEUE_OK; | 866 | return BLK_MQ_RQ_QUEUE_OK; |
869 | } | 867 | } |
870 | } | 868 | } |
@@ -2439,6 +2437,22 @@ static void nvme_scan_namespaces(struct nvme_dev *dev, unsigned nn) | |||
2439 | list_sort(NULL, &dev->namespaces, ns_cmp); | 2437 | list_sort(NULL, &dev->namespaces, ns_cmp); |
2440 | } | 2438 | } |
2441 | 2439 | ||
2440 | static void nvme_set_irq_hints(struct nvme_dev *dev) | ||
2441 | { | ||
2442 | struct nvme_queue *nvmeq; | ||
2443 | int i; | ||
2444 | |||
2445 | for (i = 0; i < dev->online_queues; i++) { | ||
2446 | nvmeq = dev->queues[i]; | ||
2447 | |||
2448 | if (!nvmeq->tags || !(*nvmeq->tags)) | ||
2449 | continue; | ||
2450 | |||
2451 | irq_set_affinity_hint(dev->entry[nvmeq->cq_vector].vector, | ||
2452 | blk_mq_tags_cpumask(*nvmeq->tags)); | ||
2453 | } | ||
2454 | } | ||
2455 | |||
2442 | static void nvme_dev_scan(struct work_struct *work) | 2456 | static void nvme_dev_scan(struct work_struct *work) |
2443 | { | 2457 | { |
2444 | struct nvme_dev *dev = container_of(work, struct nvme_dev, scan_work); | 2458 | struct nvme_dev *dev = container_of(work, struct nvme_dev, scan_work); |
@@ -2450,6 +2464,7 @@ static void nvme_dev_scan(struct work_struct *work) | |||
2450 | return; | 2464 | return; |
2451 | nvme_scan_namespaces(dev, le32_to_cpup(&ctrl->nn)); | 2465 | nvme_scan_namespaces(dev, le32_to_cpup(&ctrl->nn)); |
2452 | kfree(ctrl); | 2466 | kfree(ctrl); |
2467 | nvme_set_irq_hints(dev); | ||
2453 | } | 2468 | } |
2454 | 2469 | ||
2455 | /* | 2470 | /* |
@@ -2953,22 +2968,6 @@ static const struct file_operations nvme_dev_fops = { | |||
2953 | .compat_ioctl = nvme_dev_ioctl, | 2968 | .compat_ioctl = nvme_dev_ioctl, |
2954 | }; | 2969 | }; |
2955 | 2970 | ||
2956 | static void nvme_set_irq_hints(struct nvme_dev *dev) | ||
2957 | { | ||
2958 | struct nvme_queue *nvmeq; | ||
2959 | int i; | ||
2960 | |||
2961 | for (i = 0; i < dev->online_queues; i++) { | ||
2962 | nvmeq = dev->queues[i]; | ||
2963 | |||
2964 | if (!nvmeq->tags || !(*nvmeq->tags)) | ||
2965 | continue; | ||
2966 | |||
2967 | irq_set_affinity_hint(dev->entry[nvmeq->cq_vector].vector, | ||
2968 | blk_mq_tags_cpumask(*nvmeq->tags)); | ||
2969 | } | ||
2970 | } | ||
2971 | |||
2972 | static int nvme_dev_start(struct nvme_dev *dev) | 2971 | static int nvme_dev_start(struct nvme_dev *dev) |
2973 | { | 2972 | { |
2974 | int result; | 2973 | int result; |
@@ -3010,8 +3009,6 @@ static int nvme_dev_start(struct nvme_dev *dev) | |||
3010 | if (result) | 3009 | if (result) |
3011 | goto free_tags; | 3010 | goto free_tags; |
3012 | 3011 | ||
3013 | nvme_set_irq_hints(dev); | ||
3014 | |||
3015 | dev->event_limit = 1; | 3012 | dev->event_limit = 1; |
3016 | return result; | 3013 | return result; |
3017 | 3014 | ||
@@ -3062,7 +3059,6 @@ static int nvme_dev_resume(struct nvme_dev *dev) | |||
3062 | } else { | 3059 | } else { |
3063 | nvme_unfreeze_queues(dev); | 3060 | nvme_unfreeze_queues(dev); |
3064 | nvme_dev_add(dev); | 3061 | nvme_dev_add(dev); |
3065 | nvme_set_irq_hints(dev); | ||
3066 | } | 3062 | } |
3067 | return 0; | 3063 | return 0; |
3068 | } | 3064 | } |
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index e93899cc6f60..6ca35495a5be 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c | |||
@@ -144,7 +144,7 @@ static void virtblk_done(struct virtqueue *vq) | |||
144 | do { | 144 | do { |
145 | virtqueue_disable_cb(vq); | 145 | virtqueue_disable_cb(vq); |
146 | while ((vbr = virtqueue_get_buf(vblk->vqs[qid].vq, &len)) != NULL) { | 146 | while ((vbr = virtqueue_get_buf(vblk->vqs[qid].vq, &len)) != NULL) { |
147 | blk_mq_complete_request(vbr->req); | 147 | blk_mq_complete_request(vbr->req, vbr->req->errors); |
148 | req_done = true; | 148 | req_done = true; |
149 | } | 149 | } |
150 | if (unlikely(virtqueue_is_broken(vq))) | 150 | if (unlikely(virtqueue_is_broken(vq))) |
diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c index deb3f001791f..767657565de6 100644 --- a/drivers/block/xen-blkback/xenbus.c +++ b/drivers/block/xen-blkback/xenbus.c | |||
@@ -212,6 +212,9 @@ static int xen_blkif_map(struct xen_blkif *blkif, grant_ref_t *gref, | |||
212 | 212 | ||
213 | static int xen_blkif_disconnect(struct xen_blkif *blkif) | 213 | static int xen_blkif_disconnect(struct xen_blkif *blkif) |
214 | { | 214 | { |
215 | struct pending_req *req, *n; | ||
216 | int i = 0, j; | ||
217 | |||
215 | if (blkif->xenblkd) { | 218 | if (blkif->xenblkd) { |
216 | kthread_stop(blkif->xenblkd); | 219 | kthread_stop(blkif->xenblkd); |
217 | wake_up(&blkif->shutdown_wq); | 220 | wake_up(&blkif->shutdown_wq); |
@@ -238,13 +241,28 @@ static int xen_blkif_disconnect(struct xen_blkif *blkif) | |||
238 | /* Remove all persistent grants and the cache of ballooned pages. */ | 241 | /* Remove all persistent grants and the cache of ballooned pages. */ |
239 | xen_blkbk_free_caches(blkif); | 242 | xen_blkbk_free_caches(blkif); |
240 | 243 | ||
244 | /* Check that there is no request in use */ | ||
245 | list_for_each_entry_safe(req, n, &blkif->pending_free, free_list) { | ||
246 | list_del(&req->free_list); | ||
247 | |||
248 | for (j = 0; j < MAX_INDIRECT_SEGMENTS; j++) | ||
249 | kfree(req->segments[j]); | ||
250 | |||
251 | for (j = 0; j < MAX_INDIRECT_PAGES; j++) | ||
252 | kfree(req->indirect_pages[j]); | ||
253 | |||
254 | kfree(req); | ||
255 | i++; | ||
256 | } | ||
257 | |||
258 | WARN_ON(i != (XEN_BLKIF_REQS_PER_PAGE * blkif->nr_ring_pages)); | ||
259 | blkif->nr_ring_pages = 0; | ||
260 | |||
241 | return 0; | 261 | return 0; |
242 | } | 262 | } |
243 | 263 | ||
244 | static void xen_blkif_free(struct xen_blkif *blkif) | 264 | static void xen_blkif_free(struct xen_blkif *blkif) |
245 | { | 265 | { |
246 | struct pending_req *req, *n; | ||
247 | int i = 0, j; | ||
248 | 266 | ||
249 | xen_blkif_disconnect(blkif); | 267 | xen_blkif_disconnect(blkif); |
250 | xen_vbd_free(&blkif->vbd); | 268 | xen_vbd_free(&blkif->vbd); |
@@ -257,22 +275,6 @@ static void xen_blkif_free(struct xen_blkif *blkif) | |||
257 | BUG_ON(!list_empty(&blkif->free_pages)); | 275 | BUG_ON(!list_empty(&blkif->free_pages)); |
258 | BUG_ON(!RB_EMPTY_ROOT(&blkif->persistent_gnts)); | 276 | BUG_ON(!RB_EMPTY_ROOT(&blkif->persistent_gnts)); |
259 | 277 | ||
260 | /* Check that there is no request in use */ | ||
261 | list_for_each_entry_safe(req, n, &blkif->pending_free, free_list) { | ||
262 | list_del(&req->free_list); | ||
263 | |||
264 | for (j = 0; j < MAX_INDIRECT_SEGMENTS; j++) | ||
265 | kfree(req->segments[j]); | ||
266 | |||
267 | for (j = 0; j < MAX_INDIRECT_PAGES; j++) | ||
268 | kfree(req->indirect_pages[j]); | ||
269 | |||
270 | kfree(req); | ||
271 | i++; | ||
272 | } | ||
273 | |||
274 | WARN_ON(i != (XEN_BLKIF_REQS_PER_PAGE * blkif->nr_ring_pages)); | ||
275 | |||
276 | kmem_cache_free(xen_blkif_cachep, blkif); | 278 | kmem_cache_free(xen_blkif_cachep, blkif); |
277 | } | 279 | } |
278 | 280 | ||
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index 0823a96902f8..611170896b8c 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c | |||
@@ -1142,6 +1142,7 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id) | |||
1142 | RING_IDX i, rp; | 1142 | RING_IDX i, rp; |
1143 | unsigned long flags; | 1143 | unsigned long flags; |
1144 | struct blkfront_info *info = (struct blkfront_info *)dev_id; | 1144 | struct blkfront_info *info = (struct blkfront_info *)dev_id; |
1145 | int error; | ||
1145 | 1146 | ||
1146 | spin_lock_irqsave(&info->io_lock, flags); | 1147 | spin_lock_irqsave(&info->io_lock, flags); |
1147 | 1148 | ||
@@ -1182,37 +1183,37 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id) | |||
1182 | continue; | 1183 | continue; |
1183 | } | 1184 | } |
1184 | 1185 | ||
1185 | req->errors = (bret->status == BLKIF_RSP_OKAY) ? 0 : -EIO; | 1186 | error = (bret->status == BLKIF_RSP_OKAY) ? 0 : -EIO; |
1186 | switch (bret->operation) { | 1187 | switch (bret->operation) { |
1187 | case BLKIF_OP_DISCARD: | 1188 | case BLKIF_OP_DISCARD: |
1188 | if (unlikely(bret->status == BLKIF_RSP_EOPNOTSUPP)) { | 1189 | if (unlikely(bret->status == BLKIF_RSP_EOPNOTSUPP)) { |
1189 | struct request_queue *rq = info->rq; | 1190 | struct request_queue *rq = info->rq; |
1190 | printk(KERN_WARNING "blkfront: %s: %s op failed\n", | 1191 | printk(KERN_WARNING "blkfront: %s: %s op failed\n", |
1191 | info->gd->disk_name, op_name(bret->operation)); | 1192 | info->gd->disk_name, op_name(bret->operation)); |
1192 | req->errors = -EOPNOTSUPP; | 1193 | error = -EOPNOTSUPP; |
1193 | info->feature_discard = 0; | 1194 | info->feature_discard = 0; |
1194 | info->feature_secdiscard = 0; | 1195 | info->feature_secdiscard = 0; |
1195 | queue_flag_clear(QUEUE_FLAG_DISCARD, rq); | 1196 | queue_flag_clear(QUEUE_FLAG_DISCARD, rq); |
1196 | queue_flag_clear(QUEUE_FLAG_SECDISCARD, rq); | 1197 | queue_flag_clear(QUEUE_FLAG_SECDISCARD, rq); |
1197 | } | 1198 | } |
1198 | blk_mq_complete_request(req); | 1199 | blk_mq_complete_request(req, error); |
1199 | break; | 1200 | break; |
1200 | case BLKIF_OP_FLUSH_DISKCACHE: | 1201 | case BLKIF_OP_FLUSH_DISKCACHE: |
1201 | case BLKIF_OP_WRITE_BARRIER: | 1202 | case BLKIF_OP_WRITE_BARRIER: |
1202 | if (unlikely(bret->status == BLKIF_RSP_EOPNOTSUPP)) { | 1203 | if (unlikely(bret->status == BLKIF_RSP_EOPNOTSUPP)) { |
1203 | printk(KERN_WARNING "blkfront: %s: %s op failed\n", | 1204 | printk(KERN_WARNING "blkfront: %s: %s op failed\n", |
1204 | info->gd->disk_name, op_name(bret->operation)); | 1205 | info->gd->disk_name, op_name(bret->operation)); |
1205 | req->errors = -EOPNOTSUPP; | 1206 | error = -EOPNOTSUPP; |
1206 | } | 1207 | } |
1207 | if (unlikely(bret->status == BLKIF_RSP_ERROR && | 1208 | if (unlikely(bret->status == BLKIF_RSP_ERROR && |
1208 | info->shadow[id].req.u.rw.nr_segments == 0)) { | 1209 | info->shadow[id].req.u.rw.nr_segments == 0)) { |
1209 | printk(KERN_WARNING "blkfront: %s: empty %s op failed\n", | 1210 | printk(KERN_WARNING "blkfront: %s: empty %s op failed\n", |
1210 | info->gd->disk_name, op_name(bret->operation)); | 1211 | info->gd->disk_name, op_name(bret->operation)); |
1211 | req->errors = -EOPNOTSUPP; | 1212 | error = -EOPNOTSUPP; |
1212 | } | 1213 | } |
1213 | if (unlikely(req->errors)) { | 1214 | if (unlikely(error)) { |
1214 | if (req->errors == -EOPNOTSUPP) | 1215 | if (error == -EOPNOTSUPP) |
1215 | req->errors = 0; | 1216 | error = 0; |
1216 | info->feature_flush = 0; | 1217 | info->feature_flush = 0; |
1217 | xlvbd_flush(info); | 1218 | xlvbd_flush(info); |
1218 | } | 1219 | } |
@@ -1223,7 +1224,7 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id) | |||
1223 | dev_dbg(&info->xbdev->dev, "Bad return from blkdev data " | 1224 | dev_dbg(&info->xbdev->dev, "Bad return from blkdev data " |
1224 | "request: %x\n", bret->status); | 1225 | "request: %x\n", bret->status); |
1225 | 1226 | ||
1226 | blk_mq_complete_request(req); | 1227 | blk_mq_complete_request(req, error); |
1227 | break; | 1228 | break; |
1228 | default: | 1229 | default: |
1229 | BUG(); | 1230 | BUG(); |
diff --git a/drivers/clocksource/rockchip_timer.c b/drivers/clocksource/rockchip_timer.c index bb2c2b050964..d3c1742ded1a 100644 --- a/drivers/clocksource/rockchip_timer.c +++ b/drivers/clocksource/rockchip_timer.c | |||
@@ -148,7 +148,7 @@ static void __init rk_timer_init(struct device_node *np) | |||
148 | bc_timer.freq = clk_get_rate(timer_clk); | 148 | bc_timer.freq = clk_get_rate(timer_clk); |
149 | 149 | ||
150 | irq = irq_of_parse_and_map(np, 0); | 150 | irq = irq_of_parse_and_map(np, 0); |
151 | if (irq == NO_IRQ) { | 151 | if (!irq) { |
152 | pr_err("Failed to map interrupts for '%s'\n", TIMER_NAME); | 152 | pr_err("Failed to map interrupts for '%s'\n", TIMER_NAME); |
153 | return; | 153 | return; |
154 | } | 154 | } |
diff --git a/drivers/clocksource/timer-keystone.c b/drivers/clocksource/timer-keystone.c index edacf3902e10..1cea08cf603e 100644 --- a/drivers/clocksource/timer-keystone.c +++ b/drivers/clocksource/timer-keystone.c | |||
@@ -152,7 +152,7 @@ static void __init keystone_timer_init(struct device_node *np) | |||
152 | int irq, error; | 152 | int irq, error; |
153 | 153 | ||
154 | irq = irq_of_parse_and_map(np, 0); | 154 | irq = irq_of_parse_and_map(np, 0); |
155 | if (irq == NO_IRQ) { | 155 | if (!irq) { |
156 | pr_err("%s: failed to map interrupts\n", __func__); | 156 | pr_err("%s: failed to map interrupts\n", __func__); |
157 | return; | 157 | return; |
158 | } | 158 | } |
diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c index 798277227de7..cec1ee2d2f74 100644 --- a/drivers/cpufreq/acpi-cpufreq.c +++ b/drivers/cpufreq/acpi-cpufreq.c | |||
@@ -149,6 +149,9 @@ static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf) | |||
149 | { | 149 | { |
150 | struct acpi_cpufreq_data *data = policy->driver_data; | 150 | struct acpi_cpufreq_data *data = policy->driver_data; |
151 | 151 | ||
152 | if (unlikely(!data)) | ||
153 | return -ENODEV; | ||
154 | |||
152 | return cpufreq_show_cpus(data->freqdomain_cpus, buf); | 155 | return cpufreq_show_cpus(data->freqdomain_cpus, buf); |
153 | } | 156 | } |
154 | 157 | ||
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index ef5ed9470de9..25c4c15103a0 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
@@ -1436,8 +1436,10 @@ static void cpufreq_offline_finish(unsigned int cpu) | |||
1436 | * since this is a core component, and is essential for the | 1436 | * since this is a core component, and is essential for the |
1437 | * subsequent light-weight ->init() to succeed. | 1437 | * subsequent light-weight ->init() to succeed. |
1438 | */ | 1438 | */ |
1439 | if (cpufreq_driver->exit) | 1439 | if (cpufreq_driver->exit) { |
1440 | cpufreq_driver->exit(policy); | 1440 | cpufreq_driver->exit(policy); |
1441 | policy->freq_table = NULL; | ||
1442 | } | ||
1441 | } | 1443 | } |
1442 | 1444 | ||
1443 | /** | 1445 | /** |
diff --git a/drivers/dma/at_xdmac.c b/drivers/dma/at_xdmac.c index a165b4bfd330..dd24375b76dd 100644 --- a/drivers/dma/at_xdmac.c +++ b/drivers/dma/at_xdmac.c | |||
@@ -455,6 +455,15 @@ static struct at_xdmac_desc *at_xdmac_alloc_desc(struct dma_chan *chan, | |||
455 | return desc; | 455 | return desc; |
456 | } | 456 | } |
457 | 457 | ||
458 | void at_xdmac_init_used_desc(struct at_xdmac_desc *desc) | ||
459 | { | ||
460 | memset(&desc->lld, 0, sizeof(desc->lld)); | ||
461 | INIT_LIST_HEAD(&desc->descs_list); | ||
462 | desc->direction = DMA_TRANS_NONE; | ||
463 | desc->xfer_size = 0; | ||
464 | desc->active_xfer = false; | ||
465 | } | ||
466 | |||
458 | /* Call must be protected by lock. */ | 467 | /* Call must be protected by lock. */ |
459 | static struct at_xdmac_desc *at_xdmac_get_desc(struct at_xdmac_chan *atchan) | 468 | static struct at_xdmac_desc *at_xdmac_get_desc(struct at_xdmac_chan *atchan) |
460 | { | 469 | { |
@@ -466,7 +475,7 @@ static struct at_xdmac_desc *at_xdmac_get_desc(struct at_xdmac_chan *atchan) | |||
466 | desc = list_first_entry(&atchan->free_descs_list, | 475 | desc = list_first_entry(&atchan->free_descs_list, |
467 | struct at_xdmac_desc, desc_node); | 476 | struct at_xdmac_desc, desc_node); |
468 | list_del(&desc->desc_node); | 477 | list_del(&desc->desc_node); |
469 | desc->active_xfer = false; | 478 | at_xdmac_init_used_desc(desc); |
470 | } | 479 | } |
471 | 480 | ||
472 | return desc; | 481 | return desc; |
@@ -875,14 +884,14 @@ at_xdmac_interleaved_queue_desc(struct dma_chan *chan, | |||
875 | 884 | ||
876 | if (xt->src_inc) { | 885 | if (xt->src_inc) { |
877 | if (xt->src_sgl) | 886 | if (xt->src_sgl) |
878 | chan_cc |= AT_XDMAC_CC_SAM_UBS_DS_AM; | 887 | chan_cc |= AT_XDMAC_CC_SAM_UBS_AM; |
879 | else | 888 | else |
880 | chan_cc |= AT_XDMAC_CC_SAM_INCREMENTED_AM; | 889 | chan_cc |= AT_XDMAC_CC_SAM_INCREMENTED_AM; |
881 | } | 890 | } |
882 | 891 | ||
883 | if (xt->dst_inc) { | 892 | if (xt->dst_inc) { |
884 | if (xt->dst_sgl) | 893 | if (xt->dst_sgl) |
885 | chan_cc |= AT_XDMAC_CC_DAM_UBS_DS_AM; | 894 | chan_cc |= AT_XDMAC_CC_DAM_UBS_AM; |
886 | else | 895 | else |
887 | chan_cc |= AT_XDMAC_CC_DAM_INCREMENTED_AM; | 896 | chan_cc |= AT_XDMAC_CC_DAM_INCREMENTED_AM; |
888 | } | 897 | } |
diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c index 3ff284c8e3d5..09479d4be4db 100644 --- a/drivers/dma/dmaengine.c +++ b/drivers/dma/dmaengine.c | |||
@@ -554,10 +554,18 @@ struct dma_chan *dma_get_slave_channel(struct dma_chan *chan) | |||
554 | mutex_lock(&dma_list_mutex); | 554 | mutex_lock(&dma_list_mutex); |
555 | 555 | ||
556 | if (chan->client_count == 0) { | 556 | if (chan->client_count == 0) { |
557 | struct dma_device *device = chan->device; | ||
558 | |||
559 | dma_cap_set(DMA_PRIVATE, device->cap_mask); | ||
560 | device->privatecnt++; | ||
557 | err = dma_chan_get(chan); | 561 | err = dma_chan_get(chan); |
558 | if (err) | 562 | if (err) { |
559 | pr_debug("%s: failed to get %s: (%d)\n", | 563 | pr_debug("%s: failed to get %s: (%d)\n", |
560 | __func__, dma_chan_name(chan), err); | 564 | __func__, dma_chan_name(chan), err); |
565 | chan = NULL; | ||
566 | if (--device->privatecnt == 0) | ||
567 | dma_cap_clear(DMA_PRIVATE, device->cap_mask); | ||
568 | } | ||
561 | } else | 569 | } else |
562 | chan = NULL; | 570 | chan = NULL; |
563 | 571 | ||
diff --git a/drivers/dma/dw/core.c b/drivers/dma/dw/core.c index cf1c87fa1edd..bedce038c6e2 100644 --- a/drivers/dma/dw/core.c +++ b/drivers/dma/dw/core.c | |||
@@ -1591,7 +1591,6 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata) | |||
1591 | INIT_LIST_HEAD(&dw->dma.channels); | 1591 | INIT_LIST_HEAD(&dw->dma.channels); |
1592 | for (i = 0; i < nr_channels; i++) { | 1592 | for (i = 0; i < nr_channels; i++) { |
1593 | struct dw_dma_chan *dwc = &dw->chan[i]; | 1593 | struct dw_dma_chan *dwc = &dw->chan[i]; |
1594 | int r = nr_channels - i - 1; | ||
1595 | 1594 | ||
1596 | dwc->chan.device = &dw->dma; | 1595 | dwc->chan.device = &dw->dma; |
1597 | dma_cookie_init(&dwc->chan); | 1596 | dma_cookie_init(&dwc->chan); |
@@ -1603,7 +1602,7 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata) | |||
1603 | 1602 | ||
1604 | /* 7 is highest priority & 0 is lowest. */ | 1603 | /* 7 is highest priority & 0 is lowest. */ |
1605 | if (pdata->chan_priority == CHAN_PRIORITY_ASCENDING) | 1604 | if (pdata->chan_priority == CHAN_PRIORITY_ASCENDING) |
1606 | dwc->priority = r; | 1605 | dwc->priority = nr_channels - i - 1; |
1607 | else | 1606 | else |
1608 | dwc->priority = i; | 1607 | dwc->priority = i; |
1609 | 1608 | ||
@@ -1622,6 +1621,7 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata) | |||
1622 | /* Hardware configuration */ | 1621 | /* Hardware configuration */ |
1623 | if (autocfg) { | 1622 | if (autocfg) { |
1624 | unsigned int dwc_params; | 1623 | unsigned int dwc_params; |
1624 | unsigned int r = DW_DMA_MAX_NR_CHANNELS - i - 1; | ||
1625 | void __iomem *addr = chip->regs + r * sizeof(u32); | 1625 | void __iomem *addr = chip->regs + r * sizeof(u32); |
1626 | 1626 | ||
1627 | dwc_params = dma_read_byaddr(addr, DWC_PARAMS); | 1627 | dwc_params = dma_read_byaddr(addr, DWC_PARAMS); |
diff --git a/drivers/dma/idma64.c b/drivers/dma/idma64.c index 18c14e1f1414..48d6d9e94f67 100644 --- a/drivers/dma/idma64.c +++ b/drivers/dma/idma64.c | |||
@@ -355,23 +355,23 @@ static size_t idma64_active_desc_size(struct idma64_chan *idma64c) | |||
355 | struct idma64_desc *desc = idma64c->desc; | 355 | struct idma64_desc *desc = idma64c->desc; |
356 | struct idma64_hw_desc *hw; | 356 | struct idma64_hw_desc *hw; |
357 | size_t bytes = desc->length; | 357 | size_t bytes = desc->length; |
358 | u64 llp; | 358 | u64 llp = channel_readq(idma64c, LLP); |
359 | u32 ctlhi; | 359 | u32 ctlhi = channel_readl(idma64c, CTL_HI); |
360 | unsigned int i = 0; | 360 | unsigned int i = 0; |
361 | 361 | ||
362 | llp = channel_readq(idma64c, LLP); | ||
363 | do { | 362 | do { |
364 | hw = &desc->hw[i]; | 363 | hw = &desc->hw[i]; |
365 | } while ((hw->llp != llp) && (++i < desc->ndesc)); | 364 | if (hw->llp == llp) |
365 | break; | ||
366 | bytes -= hw->len; | ||
367 | } while (++i < desc->ndesc); | ||
366 | 368 | ||
367 | if (!i) | 369 | if (!i) |
368 | return bytes; | 370 | return bytes; |
369 | 371 | ||
370 | do { | 372 | /* The current chunk is not fully transfered yet */ |
371 | bytes -= desc->hw[--i].len; | 373 | bytes += desc->hw[--i].len; |
372 | } while (i); | ||
373 | 374 | ||
374 | ctlhi = channel_readl(idma64c, CTL_HI); | ||
375 | return bytes - IDMA64C_CTLH_BLOCK_TS(ctlhi); | 375 | return bytes - IDMA64C_CTLH_BLOCK_TS(ctlhi); |
376 | } | 376 | } |
377 | 377 | ||
diff --git a/drivers/dma/pxa_dma.c b/drivers/dma/pxa_dma.c index 5cb61ce01036..fc4156afa070 100644 --- a/drivers/dma/pxa_dma.c +++ b/drivers/dma/pxa_dma.c | |||
@@ -473,8 +473,10 @@ static void pxad_free_phy(struct pxad_chan *chan) | |||
473 | return; | 473 | return; |
474 | 474 | ||
475 | /* clear the channel mapping in DRCMR */ | 475 | /* clear the channel mapping in DRCMR */ |
476 | reg = pxad_drcmr(chan->drcmr); | 476 | if (chan->drcmr <= DRCMR_CHLNUM) { |
477 | writel_relaxed(0, chan->phy->base + reg); | 477 | reg = pxad_drcmr(chan->drcmr); |
478 | writel_relaxed(0, chan->phy->base + reg); | ||
479 | } | ||
478 | 480 | ||
479 | spin_lock_irqsave(&pdev->phy_lock, flags); | 481 | spin_lock_irqsave(&pdev->phy_lock, flags); |
480 | for (i = 0; i < 32; i++) | 482 | for (i = 0; i < 32; i++) |
@@ -516,8 +518,10 @@ static void phy_enable(struct pxad_phy *phy, bool misaligned) | |||
516 | "%s(); phy=%p(%d) misaligned=%d\n", __func__, | 518 | "%s(); phy=%p(%d) misaligned=%d\n", __func__, |
517 | phy, phy->idx, misaligned); | 519 | phy, phy->idx, misaligned); |
518 | 520 | ||
519 | reg = pxad_drcmr(phy->vchan->drcmr); | 521 | if (phy->vchan->drcmr <= DRCMR_CHLNUM) { |
520 | writel_relaxed(DRCMR_MAPVLD | phy->idx, phy->base + reg); | 522 | reg = pxad_drcmr(phy->vchan->drcmr); |
523 | writel_relaxed(DRCMR_MAPVLD | phy->idx, phy->base + reg); | ||
524 | } | ||
521 | 525 | ||
522 | dalgn = phy_readl_relaxed(phy, DALGN); | 526 | dalgn = phy_readl_relaxed(phy, DALGN); |
523 | if (misaligned) | 527 | if (misaligned) |
@@ -887,6 +891,7 @@ pxad_tx_prep(struct virt_dma_chan *vc, struct virt_dma_desc *vd, | |||
887 | struct dma_async_tx_descriptor *tx; | 891 | struct dma_async_tx_descriptor *tx; |
888 | struct pxad_chan *chan = container_of(vc, struct pxad_chan, vc); | 892 | struct pxad_chan *chan = container_of(vc, struct pxad_chan, vc); |
889 | 893 | ||
894 | INIT_LIST_HEAD(&vd->node); | ||
890 | tx = vchan_tx_prep(vc, vd, tx_flags); | 895 | tx = vchan_tx_prep(vc, vd, tx_flags); |
891 | tx->tx_submit = pxad_tx_submit; | 896 | tx->tx_submit = pxad_tx_submit; |
892 | dev_dbg(&chan->vc.chan.dev->device, | 897 | dev_dbg(&chan->vc.chan.dev->device, |
@@ -910,14 +915,18 @@ static void pxad_get_config(struct pxad_chan *chan, | |||
910 | width = chan->cfg.src_addr_width; | 915 | width = chan->cfg.src_addr_width; |
911 | dev_addr = chan->cfg.src_addr; | 916 | dev_addr = chan->cfg.src_addr; |
912 | *dev_src = dev_addr; | 917 | *dev_src = dev_addr; |
913 | *dcmd |= PXA_DCMD_INCTRGADDR | PXA_DCMD_FLOWSRC; | 918 | *dcmd |= PXA_DCMD_INCTRGADDR; |
919 | if (chan->drcmr <= DRCMR_CHLNUM) | ||
920 | *dcmd |= PXA_DCMD_FLOWSRC; | ||
914 | } | 921 | } |
915 | if (dir == DMA_MEM_TO_DEV) { | 922 | if (dir == DMA_MEM_TO_DEV) { |
916 | maxburst = chan->cfg.dst_maxburst; | 923 | maxburst = chan->cfg.dst_maxburst; |
917 | width = chan->cfg.dst_addr_width; | 924 | width = chan->cfg.dst_addr_width; |
918 | dev_addr = chan->cfg.dst_addr; | 925 | dev_addr = chan->cfg.dst_addr; |
919 | *dev_dst = dev_addr; | 926 | *dev_dst = dev_addr; |
920 | *dcmd |= PXA_DCMD_INCSRCADDR | PXA_DCMD_FLOWTRG; | 927 | *dcmd |= PXA_DCMD_INCSRCADDR; |
928 | if (chan->drcmr <= DRCMR_CHLNUM) | ||
929 | *dcmd |= PXA_DCMD_FLOWTRG; | ||
921 | } | 930 | } |
922 | if (dir == DMA_MEM_TO_MEM) | 931 | if (dir == DMA_MEM_TO_MEM) |
923 | *dcmd |= PXA_DCMD_BURST32 | PXA_DCMD_INCTRGADDR | | 932 | *dcmd |= PXA_DCMD_BURST32 | PXA_DCMD_INCTRGADDR | |
@@ -1177,6 +1186,16 @@ static unsigned int pxad_residue(struct pxad_chan *chan, | |||
1177 | else | 1186 | else |
1178 | curr = phy_readl_relaxed(chan->phy, DTADR); | 1187 | curr = phy_readl_relaxed(chan->phy, DTADR); |
1179 | 1188 | ||
1189 | /* | ||
1190 | * curr has to be actually read before checking descriptor | ||
1191 | * completion, so that a curr inside a status updater | ||
1192 | * descriptor implies the following test returns true, and | ||
1193 | * preventing reordering of curr load and the test. | ||
1194 | */ | ||
1195 | rmb(); | ||
1196 | if (is_desc_completed(vd)) | ||
1197 | goto out; | ||
1198 | |||
1180 | for (i = 0; i < sw_desc->nb_desc - 1; i++) { | 1199 | for (i = 0; i < sw_desc->nb_desc - 1; i++) { |
1181 | hw_desc = sw_desc->hw_desc[i]; | 1200 | hw_desc = sw_desc->hw_desc[i]; |
1182 | if (sw_desc->hw_desc[0]->dcmd & PXA_DCMD_INCSRCADDR) | 1201 | if (sw_desc->hw_desc[0]->dcmd & PXA_DCMD_INCSRCADDR) |
diff --git a/drivers/dma/sun4i-dma.c b/drivers/dma/sun4i-dma.c index a1a500d96ff2..1661d518224a 100644 --- a/drivers/dma/sun4i-dma.c +++ b/drivers/dma/sun4i-dma.c | |||
@@ -599,13 +599,13 @@ get_next_cyclic_promise(struct sun4i_dma_contract *contract) | |||
599 | static void sun4i_dma_free_contract(struct virt_dma_desc *vd) | 599 | static void sun4i_dma_free_contract(struct virt_dma_desc *vd) |
600 | { | 600 | { |
601 | struct sun4i_dma_contract *contract = to_sun4i_dma_contract(vd); | 601 | struct sun4i_dma_contract *contract = to_sun4i_dma_contract(vd); |
602 | struct sun4i_dma_promise *promise; | 602 | struct sun4i_dma_promise *promise, *tmp; |
603 | 603 | ||
604 | /* Free all the demands and completed demands */ | 604 | /* Free all the demands and completed demands */ |
605 | list_for_each_entry(promise, &contract->demands, list) | 605 | list_for_each_entry_safe(promise, tmp, &contract->demands, list) |
606 | kfree(promise); | 606 | kfree(promise); |
607 | 607 | ||
608 | list_for_each_entry(promise, &contract->completed_demands, list) | 608 | list_for_each_entry_safe(promise, tmp, &contract->completed_demands, list) |
609 | kfree(promise); | 609 | kfree(promise); |
610 | 610 | ||
611 | kfree(contract); | 611 | kfree(contract); |
diff --git a/drivers/dma/xgene-dma.c b/drivers/dma/xgene-dma.c index b23e8d52d126..8d57b1b12e41 100644 --- a/drivers/dma/xgene-dma.c +++ b/drivers/dma/xgene-dma.c | |||
@@ -59,7 +59,6 @@ | |||
59 | #define XGENE_DMA_RING_MEM_RAM_SHUTDOWN 0xD070 | 59 | #define XGENE_DMA_RING_MEM_RAM_SHUTDOWN 0xD070 |
60 | #define XGENE_DMA_RING_BLK_MEM_RDY 0xD074 | 60 | #define XGENE_DMA_RING_BLK_MEM_RDY 0xD074 |
61 | #define XGENE_DMA_RING_BLK_MEM_RDY_VAL 0xFFFFFFFF | 61 | #define XGENE_DMA_RING_BLK_MEM_RDY_VAL 0xFFFFFFFF |
62 | #define XGENE_DMA_RING_DESC_CNT(v) (((v) & 0x0001FFFE) >> 1) | ||
63 | #define XGENE_DMA_RING_ID_GET(owner, num) (((owner) << 6) | (num)) | 62 | #define XGENE_DMA_RING_ID_GET(owner, num) (((owner) << 6) | (num)) |
64 | #define XGENE_DMA_RING_DST_ID(v) ((1 << 10) | (v)) | 63 | #define XGENE_DMA_RING_DST_ID(v) ((1 << 10) | (v)) |
65 | #define XGENE_DMA_RING_CMD_OFFSET 0x2C | 64 | #define XGENE_DMA_RING_CMD_OFFSET 0x2C |
@@ -379,14 +378,6 @@ static u8 xgene_dma_encode_xor_flyby(u32 src_cnt) | |||
379 | return flyby_type[src_cnt]; | 378 | return flyby_type[src_cnt]; |
380 | } | 379 | } |
381 | 380 | ||
382 | static u32 xgene_dma_ring_desc_cnt(struct xgene_dma_ring *ring) | ||
383 | { | ||
384 | u32 __iomem *cmd_base = ring->cmd_base; | ||
385 | u32 ring_state = ioread32(&cmd_base[1]); | ||
386 | |||
387 | return XGENE_DMA_RING_DESC_CNT(ring_state); | ||
388 | } | ||
389 | |||
390 | static void xgene_dma_set_src_buffer(__le64 *ext8, size_t *len, | 381 | static void xgene_dma_set_src_buffer(__le64 *ext8, size_t *len, |
391 | dma_addr_t *paddr) | 382 | dma_addr_t *paddr) |
392 | { | 383 | { |
@@ -659,15 +650,12 @@ static void xgene_dma_clean_running_descriptor(struct xgene_dma_chan *chan, | |||
659 | dma_pool_free(chan->desc_pool, desc, desc->tx.phys); | 650 | dma_pool_free(chan->desc_pool, desc, desc->tx.phys); |
660 | } | 651 | } |
661 | 652 | ||
662 | static int xgene_chan_xfer_request(struct xgene_dma_ring *ring, | 653 | static void xgene_chan_xfer_request(struct xgene_dma_chan *chan, |
663 | struct xgene_dma_desc_sw *desc_sw) | 654 | struct xgene_dma_desc_sw *desc_sw) |
664 | { | 655 | { |
656 | struct xgene_dma_ring *ring = &chan->tx_ring; | ||
665 | struct xgene_dma_desc_hw *desc_hw; | 657 | struct xgene_dma_desc_hw *desc_hw; |
666 | 658 | ||
667 | /* Check if can push more descriptor to hw for execution */ | ||
668 | if (xgene_dma_ring_desc_cnt(ring) > (ring->slots - 2)) | ||
669 | return -EBUSY; | ||
670 | |||
671 | /* Get hw descriptor from DMA tx ring */ | 659 | /* Get hw descriptor from DMA tx ring */ |
672 | desc_hw = &ring->desc_hw[ring->head]; | 660 | desc_hw = &ring->desc_hw[ring->head]; |
673 | 661 | ||
@@ -694,11 +682,13 @@ static int xgene_chan_xfer_request(struct xgene_dma_ring *ring, | |||
694 | memcpy(desc_hw, &desc_sw->desc2, sizeof(*desc_hw)); | 682 | memcpy(desc_hw, &desc_sw->desc2, sizeof(*desc_hw)); |
695 | } | 683 | } |
696 | 684 | ||
685 | /* Increment the pending transaction count */ | ||
686 | chan->pending += ((desc_sw->flags & | ||
687 | XGENE_DMA_FLAG_64B_DESC) ? 2 : 1); | ||
688 | |||
697 | /* Notify the hw that we have descriptor ready for execution */ | 689 | /* Notify the hw that we have descriptor ready for execution */ |
698 | iowrite32((desc_sw->flags & XGENE_DMA_FLAG_64B_DESC) ? | 690 | iowrite32((desc_sw->flags & XGENE_DMA_FLAG_64B_DESC) ? |
699 | 2 : 1, ring->cmd); | 691 | 2 : 1, ring->cmd); |
700 | |||
701 | return 0; | ||
702 | } | 692 | } |
703 | 693 | ||
704 | /** | 694 | /** |
@@ -710,7 +700,6 @@ static int xgene_chan_xfer_request(struct xgene_dma_ring *ring, | |||
710 | static void xgene_chan_xfer_ld_pending(struct xgene_dma_chan *chan) | 700 | static void xgene_chan_xfer_ld_pending(struct xgene_dma_chan *chan) |
711 | { | 701 | { |
712 | struct xgene_dma_desc_sw *desc_sw, *_desc_sw; | 702 | struct xgene_dma_desc_sw *desc_sw, *_desc_sw; |
713 | int ret; | ||
714 | 703 | ||
715 | /* | 704 | /* |
716 | * If the list of pending descriptors is empty, then we | 705 | * If the list of pending descriptors is empty, then we |
@@ -735,18 +724,13 @@ static void xgene_chan_xfer_ld_pending(struct xgene_dma_chan *chan) | |||
735 | if (chan->pending >= chan->max_outstanding) | 724 | if (chan->pending >= chan->max_outstanding) |
736 | return; | 725 | return; |
737 | 726 | ||
738 | ret = xgene_chan_xfer_request(&chan->tx_ring, desc_sw); | 727 | xgene_chan_xfer_request(chan, desc_sw); |
739 | if (ret) | ||
740 | return; | ||
741 | 728 | ||
742 | /* | 729 | /* |
743 | * Delete this element from ld pending queue and append it to | 730 | * Delete this element from ld pending queue and append it to |
744 | * ld running queue | 731 | * ld running queue |
745 | */ | 732 | */ |
746 | list_move_tail(&desc_sw->node, &chan->ld_running); | 733 | list_move_tail(&desc_sw->node, &chan->ld_running); |
747 | |||
748 | /* Increment the pending transaction count */ | ||
749 | chan->pending++; | ||
750 | } | 734 | } |
751 | } | 735 | } |
752 | 736 | ||
@@ -821,7 +805,8 @@ static void xgene_dma_cleanup_descriptors(struct xgene_dma_chan *chan) | |||
821 | * Decrement the pending transaction count | 805 | * Decrement the pending transaction count |
822 | * as we have processed one | 806 | * as we have processed one |
823 | */ | 807 | */ |
824 | chan->pending--; | 808 | chan->pending -= ((desc_sw->flags & |
809 | XGENE_DMA_FLAG_64B_DESC) ? 2 : 1); | ||
825 | 810 | ||
826 | /* | 811 | /* |
827 | * Delete this node from ld running queue and append it to | 812 | * Delete this node from ld running queue and append it to |
@@ -1421,15 +1406,18 @@ static int xgene_dma_create_ring_one(struct xgene_dma_chan *chan, | |||
1421 | struct xgene_dma_ring *ring, | 1406 | struct xgene_dma_ring *ring, |
1422 | enum xgene_dma_ring_cfgsize cfgsize) | 1407 | enum xgene_dma_ring_cfgsize cfgsize) |
1423 | { | 1408 | { |
1409 | int ret; | ||
1410 | |||
1424 | /* Setup DMA ring descriptor variables */ | 1411 | /* Setup DMA ring descriptor variables */ |
1425 | ring->pdma = chan->pdma; | 1412 | ring->pdma = chan->pdma; |
1426 | ring->cfgsize = cfgsize; | 1413 | ring->cfgsize = cfgsize; |
1427 | ring->num = chan->pdma->ring_num++; | 1414 | ring->num = chan->pdma->ring_num++; |
1428 | ring->id = XGENE_DMA_RING_ID_GET(ring->owner, ring->buf_num); | 1415 | ring->id = XGENE_DMA_RING_ID_GET(ring->owner, ring->buf_num); |
1429 | 1416 | ||
1430 | ring->size = xgene_dma_get_ring_size(chan, cfgsize); | 1417 | ret = xgene_dma_get_ring_size(chan, cfgsize); |
1431 | if (ring->size <= 0) | 1418 | if (ret <= 0) |
1432 | return ring->size; | 1419 | return ret; |
1420 | ring->size = ret; | ||
1433 | 1421 | ||
1434 | /* Allocate memory for DMA ring descriptor */ | 1422 | /* Allocate memory for DMA ring descriptor */ |
1435 | ring->desc_vaddr = dma_zalloc_coherent(chan->dev, ring->size, | 1423 | ring->desc_vaddr = dma_zalloc_coherent(chan->dev, ring->size, |
@@ -1482,7 +1470,7 @@ static int xgene_dma_create_chan_rings(struct xgene_dma_chan *chan) | |||
1482 | tx_ring->id, tx_ring->num, tx_ring->desc_vaddr); | 1470 | tx_ring->id, tx_ring->num, tx_ring->desc_vaddr); |
1483 | 1471 | ||
1484 | /* Set the max outstanding request possible to this channel */ | 1472 | /* Set the max outstanding request possible to this channel */ |
1485 | chan->max_outstanding = rx_ring->slots; | 1473 | chan->max_outstanding = tx_ring->slots; |
1486 | 1474 | ||
1487 | return ret; | 1475 | return ret; |
1488 | } | 1476 | } |
diff --git a/drivers/dma/zx296702_dma.c b/drivers/dma/zx296702_dma.c index 39915a6b7986..c017fcd8e07c 100644 --- a/drivers/dma/zx296702_dma.c +++ b/drivers/dma/zx296702_dma.c | |||
@@ -739,7 +739,7 @@ static struct dma_chan *zx_of_dma_simple_xlate(struct of_phandle_args *dma_spec, | |||
739 | struct dma_chan *chan; | 739 | struct dma_chan *chan; |
740 | struct zx_dma_chan *c; | 740 | struct zx_dma_chan *c; |
741 | 741 | ||
742 | if (request > d->dma_requests) | 742 | if (request >= d->dma_requests) |
743 | return NULL; | 743 | return NULL; |
744 | 744 | ||
745 | chan = dma_get_any_slave_channel(&d->slave); | 745 | chan = dma_get_any_slave_channel(&d->slave); |
diff --git a/drivers/firmware/efi/libstub/arm-stub.c b/drivers/firmware/efi/libstub/arm-stub.c index e29560e6b40b..950c87f5d279 100644 --- a/drivers/firmware/efi/libstub/arm-stub.c +++ b/drivers/firmware/efi/libstub/arm-stub.c | |||
@@ -13,6 +13,7 @@ | |||
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <linux/efi.h> | 15 | #include <linux/efi.h> |
16 | #include <linux/sort.h> | ||
16 | #include <asm/efi.h> | 17 | #include <asm/efi.h> |
17 | 18 | ||
18 | #include "efistub.h" | 19 | #include "efistub.h" |
@@ -305,6 +306,44 @@ fail: | |||
305 | */ | 306 | */ |
306 | #define EFI_RT_VIRTUAL_BASE 0x40000000 | 307 | #define EFI_RT_VIRTUAL_BASE 0x40000000 |
307 | 308 | ||
309 | static int cmp_mem_desc(const void *l, const void *r) | ||
310 | { | ||
311 | const efi_memory_desc_t *left = l, *right = r; | ||
312 | |||
313 | return (left->phys_addr > right->phys_addr) ? 1 : -1; | ||
314 | } | ||
315 | |||
316 | /* | ||
317 | * Returns whether region @left ends exactly where region @right starts, | ||
318 | * or false if either argument is NULL. | ||
319 | */ | ||
320 | static bool regions_are_adjacent(efi_memory_desc_t *left, | ||
321 | efi_memory_desc_t *right) | ||
322 | { | ||
323 | u64 left_end; | ||
324 | |||
325 | if (left == NULL || right == NULL) | ||
326 | return false; | ||
327 | |||
328 | left_end = left->phys_addr + left->num_pages * EFI_PAGE_SIZE; | ||
329 | |||
330 | return left_end == right->phys_addr; | ||
331 | } | ||
332 | |||
333 | /* | ||
334 | * Returns whether region @left and region @right have compatible memory type | ||
335 | * mapping attributes, and are both EFI_MEMORY_RUNTIME regions. | ||
336 | */ | ||
337 | static bool regions_have_compatible_memory_type_attrs(efi_memory_desc_t *left, | ||
338 | efi_memory_desc_t *right) | ||
339 | { | ||
340 | static const u64 mem_type_mask = EFI_MEMORY_WB | EFI_MEMORY_WT | | ||
341 | EFI_MEMORY_WC | EFI_MEMORY_UC | | ||
342 | EFI_MEMORY_RUNTIME; | ||
343 | |||
344 | return ((left->attribute ^ right->attribute) & mem_type_mask) == 0; | ||
345 | } | ||
346 | |||
308 | /* | 347 | /* |
309 | * efi_get_virtmap() - create a virtual mapping for the EFI memory map | 348 | * efi_get_virtmap() - create a virtual mapping for the EFI memory map |
310 | * | 349 | * |
@@ -317,33 +356,52 @@ void efi_get_virtmap(efi_memory_desc_t *memory_map, unsigned long map_size, | |||
317 | int *count) | 356 | int *count) |
318 | { | 357 | { |
319 | u64 efi_virt_base = EFI_RT_VIRTUAL_BASE; | 358 | u64 efi_virt_base = EFI_RT_VIRTUAL_BASE; |
320 | efi_memory_desc_t *out = runtime_map; | 359 | efi_memory_desc_t *in, *prev = NULL, *out = runtime_map; |
321 | int l; | 360 | int l; |
322 | 361 | ||
323 | for (l = 0; l < map_size; l += desc_size) { | 362 | /* |
324 | efi_memory_desc_t *in = (void *)memory_map + l; | 363 | * To work around potential issues with the Properties Table feature |
364 | * introduced in UEFI 2.5, which may split PE/COFF executable images | ||
365 | * in memory into several RuntimeServicesCode and RuntimeServicesData | ||
366 | * regions, we need to preserve the relative offsets between adjacent | ||
367 | * EFI_MEMORY_RUNTIME regions with the same memory type attributes. | ||
368 | * The easiest way to find adjacent regions is to sort the memory map | ||
369 | * before traversing it. | ||
370 | */ | ||
371 | sort(memory_map, map_size / desc_size, desc_size, cmp_mem_desc, NULL); | ||
372 | |||
373 | for (l = 0; l < map_size; l += desc_size, prev = in) { | ||
325 | u64 paddr, size; | 374 | u64 paddr, size; |
326 | 375 | ||
376 | in = (void *)memory_map + l; | ||
327 | if (!(in->attribute & EFI_MEMORY_RUNTIME)) | 377 | if (!(in->attribute & EFI_MEMORY_RUNTIME)) |
328 | continue; | 378 | continue; |
329 | 379 | ||
380 | paddr = in->phys_addr; | ||
381 | size = in->num_pages * EFI_PAGE_SIZE; | ||
382 | |||
330 | /* | 383 | /* |
331 | * Make the mapping compatible with 64k pages: this allows | 384 | * Make the mapping compatible with 64k pages: this allows |
332 | * a 4k page size kernel to kexec a 64k page size kernel and | 385 | * a 4k page size kernel to kexec a 64k page size kernel and |
333 | * vice versa. | 386 | * vice versa. |
334 | */ | 387 | */ |
335 | paddr = round_down(in->phys_addr, SZ_64K); | 388 | if (!regions_are_adjacent(prev, in) || |
336 | size = round_up(in->num_pages * EFI_PAGE_SIZE + | 389 | !regions_have_compatible_memory_type_attrs(prev, in)) { |
337 | in->phys_addr - paddr, SZ_64K); | 390 | |
338 | 391 | paddr = round_down(in->phys_addr, SZ_64K); | |
339 | /* | 392 | size += in->phys_addr - paddr; |
340 | * Avoid wasting memory on PTEs by choosing a virtual base that | 393 | |
341 | * is compatible with section mappings if this region has the | 394 | /* |
342 | * appropriate size and physical alignment. (Sections are 2 MB | 395 | * Avoid wasting memory on PTEs by choosing a virtual |
343 | * on 4k granule kernels) | 396 | * base that is compatible with section mappings if this |
344 | */ | 397 | * region has the appropriate size and physical |
345 | if (IS_ALIGNED(in->phys_addr, SZ_2M) && size >= SZ_2M) | 398 | * alignment. (Sections are 2 MB on 4k granule kernels) |
346 | efi_virt_base = round_up(efi_virt_base, SZ_2M); | 399 | */ |
400 | if (IS_ALIGNED(in->phys_addr, SZ_2M) && size >= SZ_2M) | ||
401 | efi_virt_base = round_up(efi_virt_base, SZ_2M); | ||
402 | else | ||
403 | efi_virt_base = round_up(efi_virt_base, SZ_64K); | ||
404 | } | ||
347 | 405 | ||
348 | in->virt_addr = efi_virt_base + in->phys_addr - paddr; | 406 | in->virt_addr = efi_virt_base + in->phys_addr - paddr; |
349 | efi_virt_base += size; | 407 | efi_virt_base += size; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c index 1c3fc99c5465..8e995148f56e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c | |||
@@ -208,44 +208,6 @@ static int amdgpu_cgs_alloc_gpu_mem(void *cgs_device, | |||
208 | return ret; | 208 | return ret; |
209 | } | 209 | } |
210 | 210 | ||
211 | static int amdgpu_cgs_import_gpu_mem(void *cgs_device, int dmabuf_fd, | ||
212 | cgs_handle_t *handle) | ||
213 | { | ||
214 | CGS_FUNC_ADEV; | ||
215 | int r; | ||
216 | uint32_t dma_handle; | ||
217 | struct drm_gem_object *obj; | ||
218 | struct amdgpu_bo *bo; | ||
219 | struct drm_device *dev = adev->ddev; | ||
220 | struct drm_file *file_priv = NULL, *priv; | ||
221 | |||
222 | mutex_lock(&dev->struct_mutex); | ||
223 | list_for_each_entry(priv, &dev->filelist, lhead) { | ||
224 | rcu_read_lock(); | ||
225 | if (priv->pid == get_pid(task_pid(current))) | ||
226 | file_priv = priv; | ||
227 | rcu_read_unlock(); | ||
228 | if (file_priv) | ||
229 | break; | ||
230 | } | ||
231 | mutex_unlock(&dev->struct_mutex); | ||
232 | r = dev->driver->prime_fd_to_handle(dev, | ||
233 | file_priv, dmabuf_fd, | ||
234 | &dma_handle); | ||
235 | spin_lock(&file_priv->table_lock); | ||
236 | |||
237 | /* Check if we currently have a reference on the object */ | ||
238 | obj = idr_find(&file_priv->object_idr, dma_handle); | ||
239 | if (obj == NULL) { | ||
240 | spin_unlock(&file_priv->table_lock); | ||
241 | return -EINVAL; | ||
242 | } | ||
243 | spin_unlock(&file_priv->table_lock); | ||
244 | bo = gem_to_amdgpu_bo(obj); | ||
245 | *handle = (cgs_handle_t)bo; | ||
246 | return 0; | ||
247 | } | ||
248 | |||
249 | static int amdgpu_cgs_free_gpu_mem(void *cgs_device, cgs_handle_t handle) | 211 | static int amdgpu_cgs_free_gpu_mem(void *cgs_device, cgs_handle_t handle) |
250 | { | 212 | { |
251 | struct amdgpu_bo *obj = (struct amdgpu_bo *)handle; | 213 | struct amdgpu_bo *obj = (struct amdgpu_bo *)handle; |
@@ -810,7 +772,6 @@ static const struct cgs_ops amdgpu_cgs_ops = { | |||
810 | }; | 772 | }; |
811 | 773 | ||
812 | static const struct cgs_os_ops amdgpu_cgs_os_ops = { | 774 | static const struct cgs_os_ops amdgpu_cgs_os_ops = { |
813 | amdgpu_cgs_import_gpu_mem, | ||
814 | amdgpu_cgs_add_irq_source, | 775 | amdgpu_cgs_add_irq_source, |
815 | amdgpu_cgs_irq_get, | 776 | amdgpu_cgs_irq_get, |
816 | amdgpu_cgs_irq_put | 777 | amdgpu_cgs_irq_put |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index 749420f1ea6f..cb3c274edb0a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |||
@@ -156,7 +156,8 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) | |||
156 | uint64_t *chunk_array_user; | 156 | uint64_t *chunk_array_user; |
157 | uint64_t *chunk_array; | 157 | uint64_t *chunk_array; |
158 | struct amdgpu_fpriv *fpriv = p->filp->driver_priv; | 158 | struct amdgpu_fpriv *fpriv = p->filp->driver_priv; |
159 | unsigned size, i; | 159 | unsigned size; |
160 | int i; | ||
160 | int ret; | 161 | int ret; |
161 | 162 | ||
162 | if (cs->in.num_chunks == 0) | 163 | if (cs->in.num_chunks == 0) |
diff --git a/drivers/gpu/drm/amd/amdgpu/atombios_encoders.c b/drivers/gpu/drm/amd/amdgpu/atombios_encoders.c index cd6edc40c9cd..1e0bba29e167 100644 --- a/drivers/gpu/drm/amd/amdgpu/atombios_encoders.c +++ b/drivers/gpu/drm/amd/amdgpu/atombios_encoders.c | |||
@@ -1279,8 +1279,7 @@ amdgpu_atombios_encoder_setup_dig(struct drm_encoder *encoder, int action) | |||
1279 | amdgpu_atombios_encoder_setup_dig_encoder(encoder, ATOM_ENCODER_CMD_DP_VIDEO_ON, 0); | 1279 | amdgpu_atombios_encoder_setup_dig_encoder(encoder, ATOM_ENCODER_CMD_DP_VIDEO_ON, 0); |
1280 | } | 1280 | } |
1281 | if (amdgpu_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) | 1281 | if (amdgpu_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) |
1282 | amdgpu_atombios_encoder_setup_dig_transmitter(encoder, | 1282 | amdgpu_atombios_encoder_set_backlight_level(amdgpu_encoder, dig->backlight_level); |
1283 | ATOM_TRANSMITTER_ACTION_LCD_BLON, 0, 0); | ||
1284 | if (ext_encoder) | 1283 | if (ext_encoder) |
1285 | amdgpu_atombios_encoder_setup_external_encoder(encoder, ext_encoder, ATOM_ENABLE); | 1284 | amdgpu_atombios_encoder_setup_external_encoder(encoder, ext_encoder, ATOM_ENABLE); |
1286 | } else { | 1285 | } else { |
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c index 774528ab8704..fab5471d25d7 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | |||
@@ -1262,6 +1262,12 @@ static int gmc_v7_0_process_interrupt(struct amdgpu_device *adev, | |||
1262 | addr = RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_ADDR); | 1262 | addr = RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_ADDR); |
1263 | status = RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_STATUS); | 1263 | status = RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_STATUS); |
1264 | mc_client = RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_MCCLIENT); | 1264 | mc_client = RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_MCCLIENT); |
1265 | /* reset addr and status */ | ||
1266 | WREG32_P(mmVM_CONTEXT1_CNTL2, 1, ~1); | ||
1267 | |||
1268 | if (!addr && !status) | ||
1269 | return 0; | ||
1270 | |||
1265 | dev_err(adev->dev, "GPU fault detected: %d 0x%08x\n", | 1271 | dev_err(adev->dev, "GPU fault detected: %d 0x%08x\n", |
1266 | entry->src_id, entry->src_data); | 1272 | entry->src_id, entry->src_data); |
1267 | dev_err(adev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n", | 1273 | dev_err(adev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n", |
@@ -1269,8 +1275,6 @@ static int gmc_v7_0_process_interrupt(struct amdgpu_device *adev, | |||
1269 | dev_err(adev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n", | 1275 | dev_err(adev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n", |
1270 | status); | 1276 | status); |
1271 | gmc_v7_0_vm_decode_fault(adev, status, addr, mc_client); | 1277 | gmc_v7_0_vm_decode_fault(adev, status, addr, mc_client); |
1272 | /* reset addr and status */ | ||
1273 | WREG32_P(mmVM_CONTEXT1_CNTL2, 1, ~1); | ||
1274 | 1278 | ||
1275 | return 0; | 1279 | return 0; |
1276 | } | 1280 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c index 9a07742620d0..7bc9e9fcf3d2 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | |||
@@ -1262,6 +1262,12 @@ static int gmc_v8_0_process_interrupt(struct amdgpu_device *adev, | |||
1262 | addr = RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_ADDR); | 1262 | addr = RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_ADDR); |
1263 | status = RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_STATUS); | 1263 | status = RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_STATUS); |
1264 | mc_client = RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_MCCLIENT); | 1264 | mc_client = RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_MCCLIENT); |
1265 | /* reset addr and status */ | ||
1266 | WREG32_P(mmVM_CONTEXT1_CNTL2, 1, ~1); | ||
1267 | |||
1268 | if (!addr && !status) | ||
1269 | return 0; | ||
1270 | |||
1265 | dev_err(adev->dev, "GPU fault detected: %d 0x%08x\n", | 1271 | dev_err(adev->dev, "GPU fault detected: %d 0x%08x\n", |
1266 | entry->src_id, entry->src_data); | 1272 | entry->src_id, entry->src_data); |
1267 | dev_err(adev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n", | 1273 | dev_err(adev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n", |
@@ -1269,8 +1275,6 @@ static int gmc_v8_0_process_interrupt(struct amdgpu_device *adev, | |||
1269 | dev_err(adev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n", | 1275 | dev_err(adev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n", |
1270 | status); | 1276 | status); |
1271 | gmc_v8_0_vm_decode_fault(adev, status, addr, mc_client); | 1277 | gmc_v8_0_vm_decode_fault(adev, status, addr, mc_client); |
1272 | /* reset addr and status */ | ||
1273 | WREG32_P(mmVM_CONTEXT1_CNTL2, 1, ~1); | ||
1274 | 1278 | ||
1275 | return 0; | 1279 | return 0; |
1276 | } | 1280 | } |
diff --git a/drivers/gpu/drm/amd/include/cgs_linux.h b/drivers/gpu/drm/amd/include/cgs_linux.h index 488642f08267..3b47ae313e36 100644 --- a/drivers/gpu/drm/amd/include/cgs_linux.h +++ b/drivers/gpu/drm/amd/include/cgs_linux.h | |||
@@ -27,19 +27,6 @@ | |||
27 | #include "cgs_common.h" | 27 | #include "cgs_common.h" |
28 | 28 | ||
29 | /** | 29 | /** |
30 | * cgs_import_gpu_mem() - Import dmabuf handle | ||
31 | * @cgs_device: opaque device handle | ||
32 | * @dmabuf_fd: DMABuf file descriptor | ||
33 | * @handle: memory handle (output) | ||
34 | * | ||
35 | * Must be called in the process context that dmabuf_fd belongs to. | ||
36 | * | ||
37 | * Return: 0 on success, -errno otherwise | ||
38 | */ | ||
39 | typedef int (*cgs_import_gpu_mem_t)(void *cgs_device, int dmabuf_fd, | ||
40 | cgs_handle_t *handle); | ||
41 | |||
42 | /** | ||
43 | * cgs_irq_source_set_func() - Callback for enabling/disabling interrupt sources | 30 | * cgs_irq_source_set_func() - Callback for enabling/disabling interrupt sources |
44 | * @private_data: private data provided to cgs_add_irq_source | 31 | * @private_data: private data provided to cgs_add_irq_source |
45 | * @src_id: interrupt source ID | 32 | * @src_id: interrupt source ID |
@@ -114,16 +101,12 @@ typedef int (*cgs_irq_get_t)(void *cgs_device, unsigned src_id, unsigned type); | |||
114 | typedef int (*cgs_irq_put_t)(void *cgs_device, unsigned src_id, unsigned type); | 101 | typedef int (*cgs_irq_put_t)(void *cgs_device, unsigned src_id, unsigned type); |
115 | 102 | ||
116 | struct cgs_os_ops { | 103 | struct cgs_os_ops { |
117 | cgs_import_gpu_mem_t import_gpu_mem; | ||
118 | |||
119 | /* IRQ handling */ | 104 | /* IRQ handling */ |
120 | cgs_add_irq_source_t add_irq_source; | 105 | cgs_add_irq_source_t add_irq_source; |
121 | cgs_irq_get_t irq_get; | 106 | cgs_irq_get_t irq_get; |
122 | cgs_irq_put_t irq_put; | 107 | cgs_irq_put_t irq_put; |
123 | }; | 108 | }; |
124 | 109 | ||
125 | #define cgs_import_gpu_mem(dev,dmabuf_fd,handle) \ | ||
126 | CGS_OS_CALL(import_gpu_mem,dev,dmabuf_fd,handle) | ||
127 | #define cgs_add_irq_source(dev,src_id,num_types,set,handler,private_data) \ | 110 | #define cgs_add_irq_source(dev,src_id,num_types,set,handler,private_data) \ |
128 | CGS_OS_CALL(add_irq_source,dev,src_id,num_types,set,handler, \ | 111 | CGS_OS_CALL(add_irq_source,dev,src_id,num_types,set,handler, \ |
129 | private_data) | 112 | private_data) |
diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c index e23df5fd3836..bf27a07dbce3 100644 --- a/drivers/gpu/drm/drm_dp_mst_topology.c +++ b/drivers/gpu/drm/drm_dp_mst_topology.c | |||
@@ -53,8 +53,8 @@ static int drm_dp_send_dpcd_write(struct drm_dp_mst_topology_mgr *mgr, | |||
53 | struct drm_dp_mst_port *port, | 53 | struct drm_dp_mst_port *port, |
54 | int offset, int size, u8 *bytes); | 54 | int offset, int size, u8 *bytes); |
55 | 55 | ||
56 | static int drm_dp_send_link_address(struct drm_dp_mst_topology_mgr *mgr, | 56 | static void drm_dp_send_link_address(struct drm_dp_mst_topology_mgr *mgr, |
57 | struct drm_dp_mst_branch *mstb); | 57 | struct drm_dp_mst_branch *mstb); |
58 | static int drm_dp_send_enum_path_resources(struct drm_dp_mst_topology_mgr *mgr, | 58 | static int drm_dp_send_enum_path_resources(struct drm_dp_mst_topology_mgr *mgr, |
59 | struct drm_dp_mst_branch *mstb, | 59 | struct drm_dp_mst_branch *mstb, |
60 | struct drm_dp_mst_port *port); | 60 | struct drm_dp_mst_port *port); |
@@ -804,8 +804,6 @@ static void drm_dp_destroy_mst_branch_device(struct kref *kref) | |||
804 | struct drm_dp_mst_port *port, *tmp; | 804 | struct drm_dp_mst_port *port, *tmp; |
805 | bool wake_tx = false; | 805 | bool wake_tx = false; |
806 | 806 | ||
807 | cancel_work_sync(&mstb->mgr->work); | ||
808 | |||
809 | /* | 807 | /* |
810 | * destroy all ports - don't need lock | 808 | * destroy all ports - don't need lock |
811 | * as there are no more references to the mst branch | 809 | * as there are no more references to the mst branch |
@@ -863,29 +861,33 @@ static void drm_dp_destroy_port(struct kref *kref) | |||
863 | { | 861 | { |
864 | struct drm_dp_mst_port *port = container_of(kref, struct drm_dp_mst_port, kref); | 862 | struct drm_dp_mst_port *port = container_of(kref, struct drm_dp_mst_port, kref); |
865 | struct drm_dp_mst_topology_mgr *mgr = port->mgr; | 863 | struct drm_dp_mst_topology_mgr *mgr = port->mgr; |
864 | |||
866 | if (!port->input) { | 865 | if (!port->input) { |
867 | port->vcpi.num_slots = 0; | 866 | port->vcpi.num_slots = 0; |
868 | 867 | ||
869 | kfree(port->cached_edid); | 868 | kfree(port->cached_edid); |
870 | 869 | ||
871 | /* we can't destroy the connector here, as | 870 | /* |
872 | we might be holding the mode_config.mutex | 871 | * The only time we don't have a connector |
873 | from an EDID retrieval */ | 872 | * on an output port is if the connector init |
873 | * fails. | ||
874 | */ | ||
874 | if (port->connector) { | 875 | if (port->connector) { |
876 | /* we can't destroy the connector here, as | ||
877 | * we might be holding the mode_config.mutex | ||
878 | * from an EDID retrieval */ | ||
879 | |||
875 | mutex_lock(&mgr->destroy_connector_lock); | 880 | mutex_lock(&mgr->destroy_connector_lock); |
876 | list_add(&port->next, &mgr->destroy_connector_list); | 881 | list_add(&port->next, &mgr->destroy_connector_list); |
877 | mutex_unlock(&mgr->destroy_connector_lock); | 882 | mutex_unlock(&mgr->destroy_connector_lock); |
878 | schedule_work(&mgr->destroy_connector_work); | 883 | schedule_work(&mgr->destroy_connector_work); |
879 | return; | 884 | return; |
880 | } | 885 | } |
886 | /* no need to clean up vcpi | ||
887 | * as if we have no connector we never setup a vcpi */ | ||
881 | drm_dp_port_teardown_pdt(port, port->pdt); | 888 | drm_dp_port_teardown_pdt(port, port->pdt); |
882 | |||
883 | if (!port->input && port->vcpi.vcpi > 0) | ||
884 | drm_dp_mst_put_payload_id(mgr, port->vcpi.vcpi); | ||
885 | } | 889 | } |
886 | kfree(port); | 890 | kfree(port); |
887 | |||
888 | (*mgr->cbs->hotplug)(mgr); | ||
889 | } | 891 | } |
890 | 892 | ||
891 | static void drm_dp_put_port(struct drm_dp_mst_port *port) | 893 | static void drm_dp_put_port(struct drm_dp_mst_port *port) |
@@ -1027,8 +1029,8 @@ static void drm_dp_check_port_guid(struct drm_dp_mst_branch *mstb, | |||
1027 | } | 1029 | } |
1028 | } | 1030 | } |
1029 | 1031 | ||
1030 | static void build_mst_prop_path(struct drm_dp_mst_port *port, | 1032 | static void build_mst_prop_path(const struct drm_dp_mst_branch *mstb, |
1031 | struct drm_dp_mst_branch *mstb, | 1033 | int pnum, |
1032 | char *proppath, | 1034 | char *proppath, |
1033 | size_t proppath_size) | 1035 | size_t proppath_size) |
1034 | { | 1036 | { |
@@ -1041,7 +1043,7 @@ static void build_mst_prop_path(struct drm_dp_mst_port *port, | |||
1041 | snprintf(temp, sizeof(temp), "-%d", port_num); | 1043 | snprintf(temp, sizeof(temp), "-%d", port_num); |
1042 | strlcat(proppath, temp, proppath_size); | 1044 | strlcat(proppath, temp, proppath_size); |
1043 | } | 1045 | } |
1044 | snprintf(temp, sizeof(temp), "-%d", port->port_num); | 1046 | snprintf(temp, sizeof(temp), "-%d", pnum); |
1045 | strlcat(proppath, temp, proppath_size); | 1047 | strlcat(proppath, temp, proppath_size); |
1046 | } | 1048 | } |
1047 | 1049 | ||
@@ -1105,22 +1107,32 @@ static void drm_dp_add_port(struct drm_dp_mst_branch *mstb, | |||
1105 | drm_dp_port_teardown_pdt(port, old_pdt); | 1107 | drm_dp_port_teardown_pdt(port, old_pdt); |
1106 | 1108 | ||
1107 | ret = drm_dp_port_setup_pdt(port); | 1109 | ret = drm_dp_port_setup_pdt(port); |
1108 | if (ret == true) { | 1110 | if (ret == true) |
1109 | drm_dp_send_link_address(mstb->mgr, port->mstb); | 1111 | drm_dp_send_link_address(mstb->mgr, port->mstb); |
1110 | port->mstb->link_address_sent = true; | ||
1111 | } | ||
1112 | } | 1112 | } |
1113 | 1113 | ||
1114 | if (created && !port->input) { | 1114 | if (created && !port->input) { |
1115 | char proppath[255]; | 1115 | char proppath[255]; |
1116 | build_mst_prop_path(port, mstb, proppath, sizeof(proppath)); | ||
1117 | port->connector = (*mstb->mgr->cbs->add_connector)(mstb->mgr, port, proppath); | ||
1118 | 1116 | ||
1119 | if (port->port_num >= 8) { | 1117 | build_mst_prop_path(mstb, port->port_num, proppath, sizeof(proppath)); |
1118 | port->connector = (*mstb->mgr->cbs->add_connector)(mstb->mgr, port, proppath); | ||
1119 | if (!port->connector) { | ||
1120 | /* remove it from the port list */ | ||
1121 | mutex_lock(&mstb->mgr->lock); | ||
1122 | list_del(&port->next); | ||
1123 | mutex_unlock(&mstb->mgr->lock); | ||
1124 | /* drop port list reference */ | ||
1125 | drm_dp_put_port(port); | ||
1126 | goto out; | ||
1127 | } | ||
1128 | if (port->port_num >= DP_MST_LOGICAL_PORT_0) { | ||
1120 | port->cached_edid = drm_get_edid(port->connector, &port->aux.ddc); | 1129 | port->cached_edid = drm_get_edid(port->connector, &port->aux.ddc); |
1130 | drm_mode_connector_set_tile_property(port->connector); | ||
1121 | } | 1131 | } |
1132 | (*mstb->mgr->cbs->register_connector)(port->connector); | ||
1122 | } | 1133 | } |
1123 | 1134 | ||
1135 | out: | ||
1124 | /* put reference to this port */ | 1136 | /* put reference to this port */ |
1125 | drm_dp_put_port(port); | 1137 | drm_dp_put_port(port); |
1126 | } | 1138 | } |
@@ -1202,10 +1214,9 @@ static void drm_dp_check_and_send_link_address(struct drm_dp_mst_topology_mgr *m | |||
1202 | { | 1214 | { |
1203 | struct drm_dp_mst_port *port; | 1215 | struct drm_dp_mst_port *port; |
1204 | struct drm_dp_mst_branch *mstb_child; | 1216 | struct drm_dp_mst_branch *mstb_child; |
1205 | if (!mstb->link_address_sent) { | 1217 | if (!mstb->link_address_sent) |
1206 | drm_dp_send_link_address(mgr, mstb); | 1218 | drm_dp_send_link_address(mgr, mstb); |
1207 | mstb->link_address_sent = true; | 1219 | |
1208 | } | ||
1209 | list_for_each_entry(port, &mstb->ports, next) { | 1220 | list_for_each_entry(port, &mstb->ports, next) { |
1210 | if (port->input) | 1221 | if (port->input) |
1211 | continue; | 1222 | continue; |
@@ -1458,8 +1469,8 @@ static void drm_dp_queue_down_tx(struct drm_dp_mst_topology_mgr *mgr, | |||
1458 | mutex_unlock(&mgr->qlock); | 1469 | mutex_unlock(&mgr->qlock); |
1459 | } | 1470 | } |
1460 | 1471 | ||
1461 | static int drm_dp_send_link_address(struct drm_dp_mst_topology_mgr *mgr, | 1472 | static void drm_dp_send_link_address(struct drm_dp_mst_topology_mgr *mgr, |
1462 | struct drm_dp_mst_branch *mstb) | 1473 | struct drm_dp_mst_branch *mstb) |
1463 | { | 1474 | { |
1464 | int len; | 1475 | int len; |
1465 | struct drm_dp_sideband_msg_tx *txmsg; | 1476 | struct drm_dp_sideband_msg_tx *txmsg; |
@@ -1467,11 +1478,12 @@ static int drm_dp_send_link_address(struct drm_dp_mst_topology_mgr *mgr, | |||
1467 | 1478 | ||
1468 | txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL); | 1479 | txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL); |
1469 | if (!txmsg) | 1480 | if (!txmsg) |
1470 | return -ENOMEM; | 1481 | return; |
1471 | 1482 | ||
1472 | txmsg->dst = mstb; | 1483 | txmsg->dst = mstb; |
1473 | len = build_link_address(txmsg); | 1484 | len = build_link_address(txmsg); |
1474 | 1485 | ||
1486 | mstb->link_address_sent = true; | ||
1475 | drm_dp_queue_down_tx(mgr, txmsg); | 1487 | drm_dp_queue_down_tx(mgr, txmsg); |
1476 | 1488 | ||
1477 | ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); | 1489 | ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); |
@@ -1499,11 +1511,12 @@ static int drm_dp_send_link_address(struct drm_dp_mst_topology_mgr *mgr, | |||
1499 | } | 1511 | } |
1500 | (*mgr->cbs->hotplug)(mgr); | 1512 | (*mgr->cbs->hotplug)(mgr); |
1501 | } | 1513 | } |
1502 | } else | 1514 | } else { |
1515 | mstb->link_address_sent = false; | ||
1503 | DRM_DEBUG_KMS("link address failed %d\n", ret); | 1516 | DRM_DEBUG_KMS("link address failed %d\n", ret); |
1517 | } | ||
1504 | 1518 | ||
1505 | kfree(txmsg); | 1519 | kfree(txmsg); |
1506 | return 0; | ||
1507 | } | 1520 | } |
1508 | 1521 | ||
1509 | static int drm_dp_send_enum_path_resources(struct drm_dp_mst_topology_mgr *mgr, | 1522 | static int drm_dp_send_enum_path_resources(struct drm_dp_mst_topology_mgr *mgr, |
@@ -1978,6 +1991,8 @@ void drm_dp_mst_topology_mgr_suspend(struct drm_dp_mst_topology_mgr *mgr) | |||
1978 | drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL, | 1991 | drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL, |
1979 | DP_MST_EN | DP_UPSTREAM_IS_SRC); | 1992 | DP_MST_EN | DP_UPSTREAM_IS_SRC); |
1980 | mutex_unlock(&mgr->lock); | 1993 | mutex_unlock(&mgr->lock); |
1994 | flush_work(&mgr->work); | ||
1995 | flush_work(&mgr->destroy_connector_work); | ||
1981 | } | 1996 | } |
1982 | EXPORT_SYMBOL(drm_dp_mst_topology_mgr_suspend); | 1997 | EXPORT_SYMBOL(drm_dp_mst_topology_mgr_suspend); |
1983 | 1998 | ||
@@ -2263,10 +2278,10 @@ struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_ | |||
2263 | 2278 | ||
2264 | if (port->cached_edid) | 2279 | if (port->cached_edid) |
2265 | edid = drm_edid_duplicate(port->cached_edid); | 2280 | edid = drm_edid_duplicate(port->cached_edid); |
2266 | else | 2281 | else { |
2267 | edid = drm_get_edid(connector, &port->aux.ddc); | 2282 | edid = drm_get_edid(connector, &port->aux.ddc); |
2268 | 2283 | drm_mode_connector_set_tile_property(connector); | |
2269 | drm_mode_connector_set_tile_property(connector); | 2284 | } |
2270 | drm_dp_put_port(port); | 2285 | drm_dp_put_port(port); |
2271 | return edid; | 2286 | return edid; |
2272 | } | 2287 | } |
@@ -2671,7 +2686,7 @@ static void drm_dp_destroy_connector_work(struct work_struct *work) | |||
2671 | { | 2686 | { |
2672 | struct drm_dp_mst_topology_mgr *mgr = container_of(work, struct drm_dp_mst_topology_mgr, destroy_connector_work); | 2687 | struct drm_dp_mst_topology_mgr *mgr = container_of(work, struct drm_dp_mst_topology_mgr, destroy_connector_work); |
2673 | struct drm_dp_mst_port *port; | 2688 | struct drm_dp_mst_port *port; |
2674 | 2689 | bool send_hotplug = false; | |
2675 | /* | 2690 | /* |
2676 | * Not a regular list traverse as we have to drop the destroy | 2691 | * Not a regular list traverse as we have to drop the destroy |
2677 | * connector lock before destroying the connector, to avoid AB->BA | 2692 | * connector lock before destroying the connector, to avoid AB->BA |
@@ -2694,7 +2709,10 @@ static void drm_dp_destroy_connector_work(struct work_struct *work) | |||
2694 | if (!port->input && port->vcpi.vcpi > 0) | 2709 | if (!port->input && port->vcpi.vcpi > 0) |
2695 | drm_dp_mst_put_payload_id(mgr, port->vcpi.vcpi); | 2710 | drm_dp_mst_put_payload_id(mgr, port->vcpi.vcpi); |
2696 | kfree(port); | 2711 | kfree(port); |
2712 | send_hotplug = true; | ||
2697 | } | 2713 | } |
2714 | if (send_hotplug) | ||
2715 | (*mgr->cbs->hotplug)(mgr); | ||
2698 | } | 2716 | } |
2699 | 2717 | ||
2700 | /** | 2718 | /** |
@@ -2747,6 +2765,7 @@ EXPORT_SYMBOL(drm_dp_mst_topology_mgr_init); | |||
2747 | */ | 2765 | */ |
2748 | void drm_dp_mst_topology_mgr_destroy(struct drm_dp_mst_topology_mgr *mgr) | 2766 | void drm_dp_mst_topology_mgr_destroy(struct drm_dp_mst_topology_mgr *mgr) |
2749 | { | 2767 | { |
2768 | flush_work(&mgr->work); | ||
2750 | flush_work(&mgr->destroy_connector_work); | 2769 | flush_work(&mgr->destroy_connector_work); |
2751 | mutex_lock(&mgr->payload_lock); | 2770 | mutex_lock(&mgr->payload_lock); |
2752 | kfree(mgr->payloads); | 2771 | kfree(mgr->payloads); |
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 418d299f3b12..ca08c472311b 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c | |||
@@ -345,7 +345,11 @@ static bool restore_fbdev_mode(struct drm_fb_helper *fb_helper) | |||
345 | struct drm_crtc *crtc = mode_set->crtc; | 345 | struct drm_crtc *crtc = mode_set->crtc; |
346 | int ret; | 346 | int ret; |
347 | 347 | ||
348 | if (crtc->funcs->cursor_set) { | 348 | if (crtc->funcs->cursor_set2) { |
349 | ret = crtc->funcs->cursor_set2(crtc, NULL, 0, 0, 0, 0, 0); | ||
350 | if (ret) | ||
351 | error = true; | ||
352 | } else if (crtc->funcs->cursor_set) { | ||
349 | ret = crtc->funcs->cursor_set(crtc, NULL, 0, 0, 0); | 353 | ret = crtc->funcs->cursor_set(crtc, NULL, 0, 0, 0); |
350 | if (ret) | 354 | if (ret) |
351 | error = true; | 355 | error = true; |
diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c index d734780b31c0..a18164f2f6d2 100644 --- a/drivers/gpu/drm/drm_probe_helper.c +++ b/drivers/gpu/drm/drm_probe_helper.c | |||
@@ -94,7 +94,18 @@ static int drm_helper_probe_add_cmdline_mode(struct drm_connector *connector) | |||
94 | } | 94 | } |
95 | 95 | ||
96 | #define DRM_OUTPUT_POLL_PERIOD (10*HZ) | 96 | #define DRM_OUTPUT_POLL_PERIOD (10*HZ) |
97 | static void __drm_kms_helper_poll_enable(struct drm_device *dev) | 97 | /** |
98 | * drm_kms_helper_poll_enable_locked - re-enable output polling. | ||
99 | * @dev: drm_device | ||
100 | * | ||
101 | * This function re-enables the output polling work without | ||
102 | * locking the mode_config mutex. | ||
103 | * | ||
104 | * This is like drm_kms_helper_poll_enable() however it is to be | ||
105 | * called from a context where the mode_config mutex is locked | ||
106 | * already. | ||
107 | */ | ||
108 | void drm_kms_helper_poll_enable_locked(struct drm_device *dev) | ||
98 | { | 109 | { |
99 | bool poll = false; | 110 | bool poll = false; |
100 | struct drm_connector *connector; | 111 | struct drm_connector *connector; |
@@ -113,6 +124,8 @@ static void __drm_kms_helper_poll_enable(struct drm_device *dev) | |||
113 | if (poll) | 124 | if (poll) |
114 | schedule_delayed_work(&dev->mode_config.output_poll_work, DRM_OUTPUT_POLL_PERIOD); | 125 | schedule_delayed_work(&dev->mode_config.output_poll_work, DRM_OUTPUT_POLL_PERIOD); |
115 | } | 126 | } |
127 | EXPORT_SYMBOL(drm_kms_helper_poll_enable_locked); | ||
128 | |||
116 | 129 | ||
117 | static int drm_helper_probe_single_connector_modes_merge_bits(struct drm_connector *connector, | 130 | static int drm_helper_probe_single_connector_modes_merge_bits(struct drm_connector *connector, |
118 | uint32_t maxX, uint32_t maxY, bool merge_type_bits) | 131 | uint32_t maxX, uint32_t maxY, bool merge_type_bits) |
@@ -174,7 +187,7 @@ static int drm_helper_probe_single_connector_modes_merge_bits(struct drm_connect | |||
174 | 187 | ||
175 | /* Re-enable polling in case the global poll config changed. */ | 188 | /* Re-enable polling in case the global poll config changed. */ |
176 | if (drm_kms_helper_poll != dev->mode_config.poll_running) | 189 | if (drm_kms_helper_poll != dev->mode_config.poll_running) |
177 | __drm_kms_helper_poll_enable(dev); | 190 | drm_kms_helper_poll_enable_locked(dev); |
178 | 191 | ||
179 | dev->mode_config.poll_running = drm_kms_helper_poll; | 192 | dev->mode_config.poll_running = drm_kms_helper_poll; |
180 | 193 | ||
@@ -428,7 +441,7 @@ EXPORT_SYMBOL(drm_kms_helper_poll_disable); | |||
428 | void drm_kms_helper_poll_enable(struct drm_device *dev) | 441 | void drm_kms_helper_poll_enable(struct drm_device *dev) |
429 | { | 442 | { |
430 | mutex_lock(&dev->mode_config.mutex); | 443 | mutex_lock(&dev->mode_config.mutex); |
431 | __drm_kms_helper_poll_enable(dev); | 444 | drm_kms_helper_poll_enable_locked(dev); |
432 | mutex_unlock(&dev->mode_config.mutex); | 445 | mutex_unlock(&dev->mode_config.mutex); |
433 | } | 446 | } |
434 | EXPORT_SYMBOL(drm_kms_helper_poll_enable); | 447 | EXPORT_SYMBOL(drm_kms_helper_poll_enable); |
diff --git a/drivers/gpu/drm/exynos/exynos7_drm_decon.c b/drivers/gpu/drm/exynos/exynos7_drm_decon.c index cbdb78ef3bac..e6cbaca821a4 100644 --- a/drivers/gpu/drm/exynos/exynos7_drm_decon.c +++ b/drivers/gpu/drm/exynos/exynos7_drm_decon.c | |||
@@ -37,7 +37,6 @@ | |||
37 | * DECON stands for Display and Enhancement controller. | 37 | * DECON stands for Display and Enhancement controller. |
38 | */ | 38 | */ |
39 | 39 | ||
40 | #define DECON_DEFAULT_FRAMERATE 60 | ||
41 | #define MIN_FB_WIDTH_FOR_16WORD_BURST 128 | 40 | #define MIN_FB_WIDTH_FOR_16WORD_BURST 128 |
42 | 41 | ||
43 | #define WINDOWS_NR 2 | 42 | #define WINDOWS_NR 2 |
@@ -165,16 +164,6 @@ static u32 decon_calc_clkdiv(struct decon_context *ctx, | |||
165 | return (clkdiv < 0x100) ? clkdiv : 0xff; | 164 | return (clkdiv < 0x100) ? clkdiv : 0xff; |
166 | } | 165 | } |
167 | 166 | ||
168 | static bool decon_mode_fixup(struct exynos_drm_crtc *crtc, | ||
169 | const struct drm_display_mode *mode, | ||
170 | struct drm_display_mode *adjusted_mode) | ||
171 | { | ||
172 | if (adjusted_mode->vrefresh == 0) | ||
173 | adjusted_mode->vrefresh = DECON_DEFAULT_FRAMERATE; | ||
174 | |||
175 | return true; | ||
176 | } | ||
177 | |||
178 | static void decon_commit(struct exynos_drm_crtc *crtc) | 167 | static void decon_commit(struct exynos_drm_crtc *crtc) |
179 | { | 168 | { |
180 | struct decon_context *ctx = crtc->ctx; | 169 | struct decon_context *ctx = crtc->ctx; |
@@ -637,7 +626,6 @@ static void decon_disable(struct exynos_drm_crtc *crtc) | |||
637 | static const struct exynos_drm_crtc_ops decon_crtc_ops = { | 626 | static const struct exynos_drm_crtc_ops decon_crtc_ops = { |
638 | .enable = decon_enable, | 627 | .enable = decon_enable, |
639 | .disable = decon_disable, | 628 | .disable = decon_disable, |
640 | .mode_fixup = decon_mode_fixup, | ||
641 | .commit = decon_commit, | 629 | .commit = decon_commit, |
642 | .enable_vblank = decon_enable_vblank, | 630 | .enable_vblank = decon_enable_vblank, |
643 | .disable_vblank = decon_disable_vblank, | 631 | .disable_vblank = decon_disable_vblank, |
diff --git a/drivers/gpu/drm/exynos/exynos_dp_core.c b/drivers/gpu/drm/exynos/exynos_dp_core.c index d66ade0efac8..124fb9a56f02 100644 --- a/drivers/gpu/drm/exynos/exynos_dp_core.c +++ b/drivers/gpu/drm/exynos/exynos_dp_core.c | |||
@@ -1383,28 +1383,6 @@ static int exynos_dp_remove(struct platform_device *pdev) | |||
1383 | return 0; | 1383 | return 0; |
1384 | } | 1384 | } |
1385 | 1385 | ||
1386 | #ifdef CONFIG_PM_SLEEP | ||
1387 | static int exynos_dp_suspend(struct device *dev) | ||
1388 | { | ||
1389 | struct exynos_dp_device *dp = dev_get_drvdata(dev); | ||
1390 | |||
1391 | exynos_dp_disable(&dp->encoder); | ||
1392 | return 0; | ||
1393 | } | ||
1394 | |||
1395 | static int exynos_dp_resume(struct device *dev) | ||
1396 | { | ||
1397 | struct exynos_dp_device *dp = dev_get_drvdata(dev); | ||
1398 | |||
1399 | exynos_dp_enable(&dp->encoder); | ||
1400 | return 0; | ||
1401 | } | ||
1402 | #endif | ||
1403 | |||
1404 | static const struct dev_pm_ops exynos_dp_pm_ops = { | ||
1405 | SET_SYSTEM_SLEEP_PM_OPS(exynos_dp_suspend, exynos_dp_resume) | ||
1406 | }; | ||
1407 | |||
1408 | static const struct of_device_id exynos_dp_match[] = { | 1386 | static const struct of_device_id exynos_dp_match[] = { |
1409 | { .compatible = "samsung,exynos5-dp" }, | 1387 | { .compatible = "samsung,exynos5-dp" }, |
1410 | {}, | 1388 | {}, |
@@ -1417,7 +1395,6 @@ struct platform_driver dp_driver = { | |||
1417 | .driver = { | 1395 | .driver = { |
1418 | .name = "exynos-dp", | 1396 | .name = "exynos-dp", |
1419 | .owner = THIS_MODULE, | 1397 | .owner = THIS_MODULE, |
1420 | .pm = &exynos_dp_pm_ops, | ||
1421 | .of_match_table = exynos_dp_match, | 1398 | .of_match_table = exynos_dp_match, |
1422 | }, | 1399 | }, |
1423 | }; | 1400 | }; |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_core.c b/drivers/gpu/drm/exynos/exynos_drm_core.c index c68a6a2a9b57..7f55ba6771c6 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_core.c +++ b/drivers/gpu/drm/exynos/exynos_drm_core.c | |||
@@ -28,7 +28,6 @@ int exynos_drm_subdrv_register(struct exynos_drm_subdrv *subdrv) | |||
28 | 28 | ||
29 | return 0; | 29 | return 0; |
30 | } | 30 | } |
31 | EXPORT_SYMBOL_GPL(exynos_drm_subdrv_register); | ||
32 | 31 | ||
33 | int exynos_drm_subdrv_unregister(struct exynos_drm_subdrv *subdrv) | 32 | int exynos_drm_subdrv_unregister(struct exynos_drm_subdrv *subdrv) |
34 | { | 33 | { |
@@ -39,7 +38,6 @@ int exynos_drm_subdrv_unregister(struct exynos_drm_subdrv *subdrv) | |||
39 | 38 | ||
40 | return 0; | 39 | return 0; |
41 | } | 40 | } |
42 | EXPORT_SYMBOL_GPL(exynos_drm_subdrv_unregister); | ||
43 | 41 | ||
44 | int exynos_drm_device_subdrv_probe(struct drm_device *dev) | 42 | int exynos_drm_device_subdrv_probe(struct drm_device *dev) |
45 | { | 43 | { |
@@ -69,7 +67,6 @@ int exynos_drm_device_subdrv_probe(struct drm_device *dev) | |||
69 | 67 | ||
70 | return 0; | 68 | return 0; |
71 | } | 69 | } |
72 | EXPORT_SYMBOL_GPL(exynos_drm_device_subdrv_probe); | ||
73 | 70 | ||
74 | int exynos_drm_device_subdrv_remove(struct drm_device *dev) | 71 | int exynos_drm_device_subdrv_remove(struct drm_device *dev) |
75 | { | 72 | { |
@@ -87,7 +84,6 @@ int exynos_drm_device_subdrv_remove(struct drm_device *dev) | |||
87 | 84 | ||
88 | return 0; | 85 | return 0; |
89 | } | 86 | } |
90 | EXPORT_SYMBOL_GPL(exynos_drm_device_subdrv_remove); | ||
91 | 87 | ||
92 | int exynos_drm_subdrv_open(struct drm_device *dev, struct drm_file *file) | 88 | int exynos_drm_subdrv_open(struct drm_device *dev, struct drm_file *file) |
93 | { | 89 | { |
@@ -111,7 +107,6 @@ err: | |||
111 | } | 107 | } |
112 | return ret; | 108 | return ret; |
113 | } | 109 | } |
114 | EXPORT_SYMBOL_GPL(exynos_drm_subdrv_open); | ||
115 | 110 | ||
116 | void exynos_drm_subdrv_close(struct drm_device *dev, struct drm_file *file) | 111 | void exynos_drm_subdrv_close(struct drm_device *dev, struct drm_file *file) |
117 | { | 112 | { |
@@ -122,4 +117,3 @@ void exynos_drm_subdrv_close(struct drm_device *dev, struct drm_file *file) | |||
122 | subdrv->close(dev, subdrv->dev, file); | 117 | subdrv->close(dev, subdrv->dev, file); |
123 | } | 118 | } |
124 | } | 119 | } |
125 | EXPORT_SYMBOL_GPL(exynos_drm_subdrv_close); | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c b/drivers/gpu/drm/exynos/exynos_drm_crtc.c index 0872aa2f450f..ed28823d3b35 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c | |||
@@ -41,20 +41,6 @@ static void exynos_drm_crtc_disable(struct drm_crtc *crtc) | |||
41 | exynos_crtc->ops->disable(exynos_crtc); | 41 | exynos_crtc->ops->disable(exynos_crtc); |
42 | } | 42 | } |
43 | 43 | ||
44 | static bool | ||
45 | exynos_drm_crtc_mode_fixup(struct drm_crtc *crtc, | ||
46 | const struct drm_display_mode *mode, | ||
47 | struct drm_display_mode *adjusted_mode) | ||
48 | { | ||
49 | struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc); | ||
50 | |||
51 | if (exynos_crtc->ops->mode_fixup) | ||
52 | return exynos_crtc->ops->mode_fixup(exynos_crtc, mode, | ||
53 | adjusted_mode); | ||
54 | |||
55 | return true; | ||
56 | } | ||
57 | |||
58 | static void | 44 | static void |
59 | exynos_drm_crtc_mode_set_nofb(struct drm_crtc *crtc) | 45 | exynos_drm_crtc_mode_set_nofb(struct drm_crtc *crtc) |
60 | { | 46 | { |
@@ -99,7 +85,6 @@ static void exynos_crtc_atomic_flush(struct drm_crtc *crtc, | |||
99 | static struct drm_crtc_helper_funcs exynos_crtc_helper_funcs = { | 85 | static struct drm_crtc_helper_funcs exynos_crtc_helper_funcs = { |
100 | .enable = exynos_drm_crtc_enable, | 86 | .enable = exynos_drm_crtc_enable, |
101 | .disable = exynos_drm_crtc_disable, | 87 | .disable = exynos_drm_crtc_disable, |
102 | .mode_fixup = exynos_drm_crtc_mode_fixup, | ||
103 | .mode_set_nofb = exynos_drm_crtc_mode_set_nofb, | 88 | .mode_set_nofb = exynos_drm_crtc_mode_set_nofb, |
104 | .atomic_begin = exynos_crtc_atomic_begin, | 89 | .atomic_begin = exynos_crtc_atomic_begin, |
105 | .atomic_flush = exynos_crtc_atomic_flush, | 90 | .atomic_flush = exynos_crtc_atomic_flush, |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index 831d2e4cacf9..ae9e6b2d3758 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c | |||
@@ -304,6 +304,7 @@ int exynos_atomic_commit(struct drm_device *dev, struct drm_atomic_state *state, | |||
304 | return 0; | 304 | return 0; |
305 | } | 305 | } |
306 | 306 | ||
307 | #ifdef CONFIG_PM_SLEEP | ||
307 | static int exynos_drm_suspend(struct drm_device *dev, pm_message_t state) | 308 | static int exynos_drm_suspend(struct drm_device *dev, pm_message_t state) |
308 | { | 309 | { |
309 | struct drm_connector *connector; | 310 | struct drm_connector *connector; |
@@ -340,6 +341,7 @@ static int exynos_drm_resume(struct drm_device *dev) | |||
340 | 341 | ||
341 | return 0; | 342 | return 0; |
342 | } | 343 | } |
344 | #endif | ||
343 | 345 | ||
344 | static int exynos_drm_open(struct drm_device *dev, struct drm_file *file) | 346 | static int exynos_drm_open(struct drm_device *dev, struct drm_file *file) |
345 | { | 347 | { |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h index b7ba21dfb696..6c717ba672db 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h | |||
@@ -82,7 +82,6 @@ struct exynos_drm_plane { | |||
82 | * | 82 | * |
83 | * @enable: enable the device | 83 | * @enable: enable the device |
84 | * @disable: disable the device | 84 | * @disable: disable the device |
85 | * @mode_fixup: fix mode data before applying it | ||
86 | * @commit: set current hw specific display mode to hw. | 85 | * @commit: set current hw specific display mode to hw. |
87 | * @enable_vblank: specific driver callback for enabling vblank interrupt. | 86 | * @enable_vblank: specific driver callback for enabling vblank interrupt. |
88 | * @disable_vblank: specific driver callback for disabling vblank interrupt. | 87 | * @disable_vblank: specific driver callback for disabling vblank interrupt. |
@@ -103,9 +102,6 @@ struct exynos_drm_crtc; | |||
103 | struct exynos_drm_crtc_ops { | 102 | struct exynos_drm_crtc_ops { |
104 | void (*enable)(struct exynos_drm_crtc *crtc); | 103 | void (*enable)(struct exynos_drm_crtc *crtc); |
105 | void (*disable)(struct exynos_drm_crtc *crtc); | 104 | void (*disable)(struct exynos_drm_crtc *crtc); |
106 | bool (*mode_fixup)(struct exynos_drm_crtc *crtc, | ||
107 | const struct drm_display_mode *mode, | ||
108 | struct drm_display_mode *adjusted_mode); | ||
109 | void (*commit)(struct exynos_drm_crtc *crtc); | 105 | void (*commit)(struct exynos_drm_crtc *crtc); |
110 | int (*enable_vblank)(struct exynos_drm_crtc *crtc); | 106 | int (*enable_vblank)(struct exynos_drm_crtc *crtc); |
111 | void (*disable_vblank)(struct exynos_drm_crtc *crtc); | 107 | void (*disable_vblank)(struct exynos_drm_crtc *crtc); |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimc.c b/drivers/gpu/drm/exynos/exynos_drm_fimc.c index 2a652359af64..dd3a5e6d58c8 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimc.c | |||
@@ -1206,23 +1206,6 @@ static struct exynos_drm_ipp_ops fimc_dst_ops = { | |||
1206 | .set_addr = fimc_dst_set_addr, | 1206 | .set_addr = fimc_dst_set_addr, |
1207 | }; | 1207 | }; |
1208 | 1208 | ||
1209 | static int fimc_clk_ctrl(struct fimc_context *ctx, bool enable) | ||
1210 | { | ||
1211 | DRM_DEBUG_KMS("enable[%d]\n", enable); | ||
1212 | |||
1213 | if (enable) { | ||
1214 | clk_prepare_enable(ctx->clocks[FIMC_CLK_GATE]); | ||
1215 | clk_prepare_enable(ctx->clocks[FIMC_CLK_WB_A]); | ||
1216 | ctx->suspended = false; | ||
1217 | } else { | ||
1218 | clk_disable_unprepare(ctx->clocks[FIMC_CLK_GATE]); | ||
1219 | clk_disable_unprepare(ctx->clocks[FIMC_CLK_WB_A]); | ||
1220 | ctx->suspended = true; | ||
1221 | } | ||
1222 | |||
1223 | return 0; | ||
1224 | } | ||
1225 | |||
1226 | static irqreturn_t fimc_irq_handler(int irq, void *dev_id) | 1209 | static irqreturn_t fimc_irq_handler(int irq, void *dev_id) |
1227 | { | 1210 | { |
1228 | struct fimc_context *ctx = dev_id; | 1211 | struct fimc_context *ctx = dev_id; |
@@ -1780,6 +1763,24 @@ static int fimc_remove(struct platform_device *pdev) | |||
1780 | return 0; | 1763 | return 0; |
1781 | } | 1764 | } |
1782 | 1765 | ||
1766 | #ifdef CONFIG_PM | ||
1767 | static int fimc_clk_ctrl(struct fimc_context *ctx, bool enable) | ||
1768 | { | ||
1769 | DRM_DEBUG_KMS("enable[%d]\n", enable); | ||
1770 | |||
1771 | if (enable) { | ||
1772 | clk_prepare_enable(ctx->clocks[FIMC_CLK_GATE]); | ||
1773 | clk_prepare_enable(ctx->clocks[FIMC_CLK_WB_A]); | ||
1774 | ctx->suspended = false; | ||
1775 | } else { | ||
1776 | clk_disable_unprepare(ctx->clocks[FIMC_CLK_GATE]); | ||
1777 | clk_disable_unprepare(ctx->clocks[FIMC_CLK_WB_A]); | ||
1778 | ctx->suspended = true; | ||
1779 | } | ||
1780 | |||
1781 | return 0; | ||
1782 | } | ||
1783 | |||
1783 | #ifdef CONFIG_PM_SLEEP | 1784 | #ifdef CONFIG_PM_SLEEP |
1784 | static int fimc_suspend(struct device *dev) | 1785 | static int fimc_suspend(struct device *dev) |
1785 | { | 1786 | { |
@@ -1806,7 +1807,6 @@ static int fimc_resume(struct device *dev) | |||
1806 | } | 1807 | } |
1807 | #endif | 1808 | #endif |
1808 | 1809 | ||
1809 | #ifdef CONFIG_PM | ||
1810 | static int fimc_runtime_suspend(struct device *dev) | 1810 | static int fimc_runtime_suspend(struct device *dev) |
1811 | { | 1811 | { |
1812 | struct fimc_context *ctx = get_fimc_context(dev); | 1812 | struct fimc_context *ctx = get_fimc_context(dev); |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index 750a9e6b9e8d..3d1aba67758b 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c | |||
@@ -41,7 +41,6 @@ | |||
41 | * CPU Interface. | 41 | * CPU Interface. |
42 | */ | 42 | */ |
43 | 43 | ||
44 | #define FIMD_DEFAULT_FRAMERATE 60 | ||
45 | #define MIN_FB_WIDTH_FOR_16WORD_BURST 128 | 44 | #define MIN_FB_WIDTH_FOR_16WORD_BURST 128 |
46 | 45 | ||
47 | /* position control register for hardware window 0, 2 ~ 4.*/ | 46 | /* position control register for hardware window 0, 2 ~ 4.*/ |
@@ -377,16 +376,6 @@ static u32 fimd_calc_clkdiv(struct fimd_context *ctx, | |||
377 | return (clkdiv < 0x100) ? clkdiv : 0xff; | 376 | return (clkdiv < 0x100) ? clkdiv : 0xff; |
378 | } | 377 | } |
379 | 378 | ||
380 | static bool fimd_mode_fixup(struct exynos_drm_crtc *crtc, | ||
381 | const struct drm_display_mode *mode, | ||
382 | struct drm_display_mode *adjusted_mode) | ||
383 | { | ||
384 | if (adjusted_mode->vrefresh == 0) | ||
385 | adjusted_mode->vrefresh = FIMD_DEFAULT_FRAMERATE; | ||
386 | |||
387 | return true; | ||
388 | } | ||
389 | |||
390 | static void fimd_commit(struct exynos_drm_crtc *crtc) | 379 | static void fimd_commit(struct exynos_drm_crtc *crtc) |
391 | { | 380 | { |
392 | struct fimd_context *ctx = crtc->ctx; | 381 | struct fimd_context *ctx = crtc->ctx; |
@@ -882,13 +871,12 @@ static void fimd_dp_clock_enable(struct exynos_drm_crtc *crtc, bool enable) | |||
882 | return; | 871 | return; |
883 | 872 | ||
884 | val = enable ? DP_MIE_CLK_DP_ENABLE : DP_MIE_CLK_DISABLE; | 873 | val = enable ? DP_MIE_CLK_DP_ENABLE : DP_MIE_CLK_DISABLE; |
885 | writel(DP_MIE_CLK_DP_ENABLE, ctx->regs + DP_MIE_CLKCON); | 874 | writel(val, ctx->regs + DP_MIE_CLKCON); |
886 | } | 875 | } |
887 | 876 | ||
888 | static const struct exynos_drm_crtc_ops fimd_crtc_ops = { | 877 | static const struct exynos_drm_crtc_ops fimd_crtc_ops = { |
889 | .enable = fimd_enable, | 878 | .enable = fimd_enable, |
890 | .disable = fimd_disable, | 879 | .disable = fimd_disable, |
891 | .mode_fixup = fimd_mode_fixup, | ||
892 | .commit = fimd_commit, | 880 | .commit = fimd_commit, |
893 | .enable_vblank = fimd_enable_vblank, | 881 | .enable_vblank = fimd_enable_vblank, |
894 | .disable_vblank = fimd_disable_vblank, | 882 | .disable_vblank = fimd_disable_vblank, |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_g2d.c b/drivers/gpu/drm/exynos/exynos_drm_g2d.c index 3734c34aed16..c17efdb238a6 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_g2d.c +++ b/drivers/gpu/drm/exynos/exynos_drm_g2d.c | |||
@@ -1059,7 +1059,6 @@ int exynos_g2d_get_ver_ioctl(struct drm_device *drm_dev, void *data, | |||
1059 | 1059 | ||
1060 | return 0; | 1060 | return 0; |
1061 | } | 1061 | } |
1062 | EXPORT_SYMBOL_GPL(exynos_g2d_get_ver_ioctl); | ||
1063 | 1062 | ||
1064 | int exynos_g2d_set_cmdlist_ioctl(struct drm_device *drm_dev, void *data, | 1063 | int exynos_g2d_set_cmdlist_ioctl(struct drm_device *drm_dev, void *data, |
1065 | struct drm_file *file) | 1064 | struct drm_file *file) |
@@ -1230,7 +1229,6 @@ err: | |||
1230 | g2d_put_cmdlist(g2d, node); | 1229 | g2d_put_cmdlist(g2d, node); |
1231 | return ret; | 1230 | return ret; |
1232 | } | 1231 | } |
1233 | EXPORT_SYMBOL_GPL(exynos_g2d_set_cmdlist_ioctl); | ||
1234 | 1232 | ||
1235 | int exynos_g2d_exec_ioctl(struct drm_device *drm_dev, void *data, | 1233 | int exynos_g2d_exec_ioctl(struct drm_device *drm_dev, void *data, |
1236 | struct drm_file *file) | 1234 | struct drm_file *file) |
@@ -1293,7 +1291,6 @@ int exynos_g2d_exec_ioctl(struct drm_device *drm_dev, void *data, | |||
1293 | out: | 1291 | out: |
1294 | return 0; | 1292 | return 0; |
1295 | } | 1293 | } |
1296 | EXPORT_SYMBOL_GPL(exynos_g2d_exec_ioctl); | ||
1297 | 1294 | ||
1298 | static int g2d_subdrv_probe(struct drm_device *drm_dev, struct device *dev) | 1295 | static int g2d_subdrv_probe(struct drm_device *drm_dev, struct device *dev) |
1299 | { | 1296 | { |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c index f12fbc36b120..407afedb6003 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.c +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c | |||
@@ -56,39 +56,35 @@ static int exynos_drm_alloc_buf(struct exynos_drm_gem_obj *obj) | |||
56 | nr_pages = obj->size >> PAGE_SHIFT; | 56 | nr_pages = obj->size >> PAGE_SHIFT; |
57 | 57 | ||
58 | if (!is_drm_iommu_supported(dev)) { | 58 | if (!is_drm_iommu_supported(dev)) { |
59 | dma_addr_t start_addr; | ||
60 | unsigned int i = 0; | ||
61 | |||
62 | obj->pages = drm_calloc_large(nr_pages, sizeof(struct page *)); | 59 | obj->pages = drm_calloc_large(nr_pages, sizeof(struct page *)); |
63 | if (!obj->pages) { | 60 | if (!obj->pages) { |
64 | DRM_ERROR("failed to allocate pages.\n"); | 61 | DRM_ERROR("failed to allocate pages.\n"); |
65 | return -ENOMEM; | 62 | return -ENOMEM; |
66 | } | 63 | } |
64 | } | ||
67 | 65 | ||
68 | obj->cookie = dma_alloc_attrs(dev->dev, | 66 | obj->cookie = dma_alloc_attrs(dev->dev, obj->size, &obj->dma_addr, |
69 | obj->size, | 67 | GFP_KERNEL, &obj->dma_attrs); |
70 | &obj->dma_addr, GFP_KERNEL, | 68 | if (!obj->cookie) { |
71 | &obj->dma_attrs); | 69 | DRM_ERROR("failed to allocate buffer.\n"); |
72 | if (!obj->cookie) { | 70 | if (obj->pages) |
73 | DRM_ERROR("failed to allocate buffer.\n"); | ||
74 | drm_free_large(obj->pages); | 71 | drm_free_large(obj->pages); |
75 | return -ENOMEM; | 72 | return -ENOMEM; |
76 | } | 73 | } |
74 | |||
75 | if (obj->pages) { | ||
76 | dma_addr_t start_addr; | ||
77 | unsigned int i = 0; | ||
77 | 78 | ||
78 | start_addr = obj->dma_addr; | 79 | start_addr = obj->dma_addr; |
79 | while (i < nr_pages) { | 80 | while (i < nr_pages) { |
80 | obj->pages[i] = phys_to_page(start_addr); | 81 | obj->pages[i] = pfn_to_page(dma_to_pfn(dev->dev, |
82 | start_addr)); | ||
81 | start_addr += PAGE_SIZE; | 83 | start_addr += PAGE_SIZE; |
82 | i++; | 84 | i++; |
83 | } | 85 | } |
84 | } else { | 86 | } else { |
85 | obj->pages = dma_alloc_attrs(dev->dev, obj->size, | 87 | obj->pages = obj->cookie; |
86 | &obj->dma_addr, GFP_KERNEL, | ||
87 | &obj->dma_attrs); | ||
88 | if (!obj->pages) { | ||
89 | DRM_ERROR("failed to allocate buffer.\n"); | ||
90 | return -ENOMEM; | ||
91 | } | ||
92 | } | 88 | } |
93 | 89 | ||
94 | DRM_DEBUG_KMS("dma_addr(0x%lx), size(0x%lx)\n", | 90 | DRM_DEBUG_KMS("dma_addr(0x%lx), size(0x%lx)\n", |
@@ -110,15 +106,11 @@ static void exynos_drm_free_buf(struct exynos_drm_gem_obj *obj) | |||
110 | DRM_DEBUG_KMS("dma_addr(0x%lx), size(0x%lx)\n", | 106 | DRM_DEBUG_KMS("dma_addr(0x%lx), size(0x%lx)\n", |
111 | (unsigned long)obj->dma_addr, obj->size); | 107 | (unsigned long)obj->dma_addr, obj->size); |
112 | 108 | ||
113 | if (!is_drm_iommu_supported(dev)) { | 109 | dma_free_attrs(dev->dev, obj->size, obj->cookie, |
114 | dma_free_attrs(dev->dev, obj->size, obj->cookie, | 110 | (dma_addr_t)obj->dma_addr, &obj->dma_attrs); |
115 | (dma_addr_t)obj->dma_addr, &obj->dma_attrs); | ||
116 | drm_free_large(obj->pages); | ||
117 | } else | ||
118 | dma_free_attrs(dev->dev, obj->size, obj->pages, | ||
119 | (dma_addr_t)obj->dma_addr, &obj->dma_attrs); | ||
120 | 111 | ||
121 | obj->dma_addr = (dma_addr_t)NULL; | 112 | if (!is_drm_iommu_supported(dev)) |
113 | drm_free_large(obj->pages); | ||
122 | } | 114 | } |
123 | 115 | ||
124 | static int exynos_drm_gem_handle_create(struct drm_gem_object *obj, | 116 | static int exynos_drm_gem_handle_create(struct drm_gem_object *obj, |
@@ -156,18 +148,14 @@ void exynos_drm_gem_destroy(struct exynos_drm_gem_obj *exynos_gem_obj) | |||
156 | * once dmabuf's refcount becomes 0. | 148 | * once dmabuf's refcount becomes 0. |
157 | */ | 149 | */ |
158 | if (obj->import_attach) | 150 | if (obj->import_attach) |
159 | goto out; | 151 | drm_prime_gem_destroy(obj, exynos_gem_obj->sgt); |
160 | 152 | else | |
161 | exynos_drm_free_buf(exynos_gem_obj); | 153 | exynos_drm_free_buf(exynos_gem_obj); |
162 | |||
163 | out: | ||
164 | drm_gem_free_mmap_offset(obj); | ||
165 | 154 | ||
166 | /* release file pointer to gem object. */ | 155 | /* release file pointer to gem object. */ |
167 | drm_gem_object_release(obj); | 156 | drm_gem_object_release(obj); |
168 | 157 | ||
169 | kfree(exynos_gem_obj); | 158 | kfree(exynos_gem_obj); |
170 | exynos_gem_obj = NULL; | ||
171 | } | 159 | } |
172 | 160 | ||
173 | unsigned long exynos_drm_gem_get_size(struct drm_device *dev, | 161 | unsigned long exynos_drm_gem_get_size(struct drm_device *dev, |
@@ -190,8 +178,7 @@ unsigned long exynos_drm_gem_get_size(struct drm_device *dev, | |||
190 | return exynos_gem_obj->size; | 178 | return exynos_gem_obj->size; |
191 | } | 179 | } |
192 | 180 | ||
193 | 181 | static struct exynos_drm_gem_obj *exynos_drm_gem_init(struct drm_device *dev, | |
194 | struct exynos_drm_gem_obj *exynos_drm_gem_init(struct drm_device *dev, | ||
195 | unsigned long size) | 182 | unsigned long size) |
196 | { | 183 | { |
197 | struct exynos_drm_gem_obj *exynos_gem_obj; | 184 | struct exynos_drm_gem_obj *exynos_gem_obj; |
@@ -212,6 +199,13 @@ struct exynos_drm_gem_obj *exynos_drm_gem_init(struct drm_device *dev, | |||
212 | return ERR_PTR(ret); | 199 | return ERR_PTR(ret); |
213 | } | 200 | } |
214 | 201 | ||
202 | ret = drm_gem_create_mmap_offset(obj); | ||
203 | if (ret < 0) { | ||
204 | drm_gem_object_release(obj); | ||
205 | kfree(exynos_gem_obj); | ||
206 | return ERR_PTR(ret); | ||
207 | } | ||
208 | |||
215 | DRM_DEBUG_KMS("created file object = 0x%x\n", (unsigned int)obj->filp); | 209 | DRM_DEBUG_KMS("created file object = 0x%x\n", (unsigned int)obj->filp); |
216 | 210 | ||
217 | return exynos_gem_obj; | 211 | return exynos_gem_obj; |
@@ -313,7 +307,7 @@ void exynos_drm_gem_put_dma_addr(struct drm_device *dev, | |||
313 | drm_gem_object_unreference_unlocked(obj); | 307 | drm_gem_object_unreference_unlocked(obj); |
314 | } | 308 | } |
315 | 309 | ||
316 | int exynos_drm_gem_mmap_buffer(struct exynos_drm_gem_obj *exynos_gem_obj, | 310 | static int exynos_drm_gem_mmap_buffer(struct exynos_drm_gem_obj *exynos_gem_obj, |
317 | struct vm_area_struct *vma) | 311 | struct vm_area_struct *vma) |
318 | { | 312 | { |
319 | struct drm_device *drm_dev = exynos_gem_obj->base.dev; | 313 | struct drm_device *drm_dev = exynos_gem_obj->base.dev; |
@@ -342,7 +336,8 @@ int exynos_drm_gem_mmap_buffer(struct exynos_drm_gem_obj *exynos_gem_obj, | |||
342 | 336 | ||
343 | int exynos_drm_gem_get_ioctl(struct drm_device *dev, void *data, | 337 | int exynos_drm_gem_get_ioctl(struct drm_device *dev, void *data, |
344 | struct drm_file *file_priv) | 338 | struct drm_file *file_priv) |
345 | { struct exynos_drm_gem_obj *exynos_gem_obj; | 339 | { |
340 | struct exynos_drm_gem_obj *exynos_gem_obj; | ||
346 | struct drm_exynos_gem_info *args = data; | 341 | struct drm_exynos_gem_info *args = data; |
347 | struct drm_gem_object *obj; | 342 | struct drm_gem_object *obj; |
348 | 343 | ||
@@ -402,6 +397,7 @@ int exynos_drm_gem_dumb_create(struct drm_file *file_priv, | |||
402 | struct drm_mode_create_dumb *args) | 397 | struct drm_mode_create_dumb *args) |
403 | { | 398 | { |
404 | struct exynos_drm_gem_obj *exynos_gem_obj; | 399 | struct exynos_drm_gem_obj *exynos_gem_obj; |
400 | unsigned int flags; | ||
405 | int ret; | 401 | int ret; |
406 | 402 | ||
407 | /* | 403 | /* |
@@ -413,16 +409,12 @@ int exynos_drm_gem_dumb_create(struct drm_file *file_priv, | |||
413 | args->pitch = args->width * ((args->bpp + 7) / 8); | 409 | args->pitch = args->width * ((args->bpp + 7) / 8); |
414 | args->size = args->pitch * args->height; | 410 | args->size = args->pitch * args->height; |
415 | 411 | ||
416 | if (is_drm_iommu_supported(dev)) { | 412 | if (is_drm_iommu_supported(dev)) |
417 | exynos_gem_obj = exynos_drm_gem_create(dev, | 413 | flags = EXYNOS_BO_NONCONTIG | EXYNOS_BO_WC; |
418 | EXYNOS_BO_NONCONTIG | EXYNOS_BO_WC, | 414 | else |
419 | args->size); | 415 | flags = EXYNOS_BO_CONTIG | EXYNOS_BO_WC; |
420 | } else { | ||
421 | exynos_gem_obj = exynos_drm_gem_create(dev, | ||
422 | EXYNOS_BO_CONTIG | EXYNOS_BO_WC, | ||
423 | args->size); | ||
424 | } | ||
425 | 416 | ||
417 | exynos_gem_obj = exynos_drm_gem_create(dev, flags, args->size); | ||
426 | if (IS_ERR(exynos_gem_obj)) { | 418 | if (IS_ERR(exynos_gem_obj)) { |
427 | dev_warn(dev->dev, "FB allocation failed.\n"); | 419 | dev_warn(dev->dev, "FB allocation failed.\n"); |
428 | return PTR_ERR(exynos_gem_obj); | 420 | return PTR_ERR(exynos_gem_obj); |
@@ -460,14 +452,9 @@ int exynos_drm_gem_dumb_map_offset(struct drm_file *file_priv, | |||
460 | goto unlock; | 452 | goto unlock; |
461 | } | 453 | } |
462 | 454 | ||
463 | ret = drm_gem_create_mmap_offset(obj); | ||
464 | if (ret) | ||
465 | goto out; | ||
466 | |||
467 | *offset = drm_vma_node_offset_addr(&obj->vma_node); | 455 | *offset = drm_vma_node_offset_addr(&obj->vma_node); |
468 | DRM_DEBUG_KMS("offset = 0x%lx\n", (unsigned long)*offset); | 456 | DRM_DEBUG_KMS("offset = 0x%lx\n", (unsigned long)*offset); |
469 | 457 | ||
470 | out: | ||
471 | drm_gem_object_unreference(obj); | 458 | drm_gem_object_unreference(obj); |
472 | unlock: | 459 | unlock: |
473 | mutex_unlock(&dev->struct_mutex); | 460 | mutex_unlock(&dev->struct_mutex); |
@@ -543,7 +530,6 @@ int exynos_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma) | |||
543 | 530 | ||
544 | err_close_vm: | 531 | err_close_vm: |
545 | drm_gem_vm_close(vma); | 532 | drm_gem_vm_close(vma); |
546 | drm_gem_free_mmap_offset(obj); | ||
547 | 533 | ||
548 | return ret; | 534 | return ret; |
549 | } | 535 | } |
@@ -588,6 +574,8 @@ exynos_drm_gem_prime_import_sg_table(struct drm_device *dev, | |||
588 | if (ret < 0) | 574 | if (ret < 0) |
589 | goto err_free_large; | 575 | goto err_free_large; |
590 | 576 | ||
577 | exynos_gem_obj->sgt = sgt; | ||
578 | |||
591 | if (sgt->nents == 1) { | 579 | if (sgt->nents == 1) { |
592 | /* always physically continuous memory if sgt->nents is 1. */ | 580 | /* always physically continuous memory if sgt->nents is 1. */ |
593 | exynos_gem_obj->flags |= EXYNOS_BO_CONTIG; | 581 | exynos_gem_obj->flags |= EXYNOS_BO_CONTIG; |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.h b/drivers/gpu/drm/exynos/exynos_drm_gem.h index cd62f8410d1e..b62d1007c0e0 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.h +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.h | |||
@@ -39,6 +39,7 @@ | |||
39 | * - this address could be physical address without IOMMU and | 39 | * - this address could be physical address without IOMMU and |
40 | * device address with IOMMU. | 40 | * device address with IOMMU. |
41 | * @pages: Array of backing pages. | 41 | * @pages: Array of backing pages. |
42 | * @sgt: Imported sg_table. | ||
42 | * | 43 | * |
43 | * P.S. this object would be transferred to user as kms_bo.handle so | 44 | * P.S. this object would be transferred to user as kms_bo.handle so |
44 | * user can access the buffer through kms_bo.handle. | 45 | * user can access the buffer through kms_bo.handle. |
@@ -52,6 +53,7 @@ struct exynos_drm_gem_obj { | |||
52 | dma_addr_t dma_addr; | 53 | dma_addr_t dma_addr; |
53 | struct dma_attrs dma_attrs; | 54 | struct dma_attrs dma_attrs; |
54 | struct page **pages; | 55 | struct page **pages; |
56 | struct sg_table *sgt; | ||
55 | }; | 57 | }; |
56 | 58 | ||
57 | struct page **exynos_gem_get_pages(struct drm_gem_object *obj, gfp_t gfpmask); | 59 | struct page **exynos_gem_get_pages(struct drm_gem_object *obj, gfp_t gfpmask); |
@@ -59,10 +61,6 @@ struct page **exynos_gem_get_pages(struct drm_gem_object *obj, gfp_t gfpmask); | |||
59 | /* destroy a buffer with gem object */ | 61 | /* destroy a buffer with gem object */ |
60 | void exynos_drm_gem_destroy(struct exynos_drm_gem_obj *exynos_gem_obj); | 62 | void exynos_drm_gem_destroy(struct exynos_drm_gem_obj *exynos_gem_obj); |
61 | 63 | ||
62 | /* create a private gem object and initialize it. */ | ||
63 | struct exynos_drm_gem_obj *exynos_drm_gem_init(struct drm_device *dev, | ||
64 | unsigned long size); | ||
65 | |||
66 | /* create a new buffer with gem object */ | 64 | /* create a new buffer with gem object */ |
67 | struct exynos_drm_gem_obj *exynos_drm_gem_create(struct drm_device *dev, | 65 | struct exynos_drm_gem_obj *exynos_drm_gem_create(struct drm_device *dev, |
68 | unsigned int flags, | 66 | unsigned int flags, |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_rotator.c b/drivers/gpu/drm/exynos/exynos_drm_rotator.c index 425e70625388..2f5c118f4c8e 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_rotator.c +++ b/drivers/gpu/drm/exynos/exynos_drm_rotator.c | |||
@@ -786,6 +786,7 @@ static int rotator_remove(struct platform_device *pdev) | |||
786 | return 0; | 786 | return 0; |
787 | } | 787 | } |
788 | 788 | ||
789 | #ifdef CONFIG_PM | ||
789 | static int rotator_clk_crtl(struct rot_context *rot, bool enable) | 790 | static int rotator_clk_crtl(struct rot_context *rot, bool enable) |
790 | { | 791 | { |
791 | if (enable) { | 792 | if (enable) { |
@@ -822,7 +823,6 @@ static int rotator_resume(struct device *dev) | |||
822 | } | 823 | } |
823 | #endif | 824 | #endif |
824 | 825 | ||
825 | #ifdef CONFIG_PM | ||
826 | static int rotator_runtime_suspend(struct device *dev) | 826 | static int rotator_runtime_suspend(struct device *dev) |
827 | { | 827 | { |
828 | struct rot_context *rot = dev_get_drvdata(dev); | 828 | struct rot_context *rot = dev_get_drvdata(dev); |
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c index 3e4be5a3becd..6ade06888432 100644 --- a/drivers/gpu/drm/i915/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/intel_dp_mst.c | |||
@@ -462,11 +462,17 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo | |||
462 | drm_object_attach_property(&connector->base, dev->mode_config.tile_property, 0); | 462 | drm_object_attach_property(&connector->base, dev->mode_config.tile_property, 0); |
463 | 463 | ||
464 | drm_mode_connector_set_path_property(connector, pathprop); | 464 | drm_mode_connector_set_path_property(connector, pathprop); |
465 | return connector; | ||
466 | } | ||
467 | |||
468 | static void intel_dp_register_mst_connector(struct drm_connector *connector) | ||
469 | { | ||
470 | struct intel_connector *intel_connector = to_intel_connector(connector); | ||
471 | struct drm_device *dev = connector->dev; | ||
465 | drm_modeset_lock_all(dev); | 472 | drm_modeset_lock_all(dev); |
466 | intel_connector_add_to_fbdev(intel_connector); | 473 | intel_connector_add_to_fbdev(intel_connector); |
467 | drm_modeset_unlock_all(dev); | 474 | drm_modeset_unlock_all(dev); |
468 | drm_connector_register(&intel_connector->base); | 475 | drm_connector_register(&intel_connector->base); |
469 | return connector; | ||
470 | } | 476 | } |
471 | 477 | ||
472 | static void intel_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr, | 478 | static void intel_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr, |
@@ -512,6 +518,7 @@ static void intel_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr) | |||
512 | 518 | ||
513 | static struct drm_dp_mst_topology_cbs mst_cbs = { | 519 | static struct drm_dp_mst_topology_cbs mst_cbs = { |
514 | .add_connector = intel_dp_add_mst_connector, | 520 | .add_connector = intel_dp_add_mst_connector, |
521 | .register_connector = intel_dp_register_mst_connector, | ||
515 | .destroy_connector = intel_dp_destroy_mst_connector, | 522 | .destroy_connector = intel_dp_destroy_mst_connector, |
516 | .hotplug = intel_dp_mst_hotplug, | 523 | .hotplug = intel_dp_mst_hotplug, |
517 | }; | 524 | }; |
diff --git a/drivers/gpu/drm/i915/intel_hotplug.c b/drivers/gpu/drm/i915/intel_hotplug.c index 53c0173a39fe..b17785719598 100644 --- a/drivers/gpu/drm/i915/intel_hotplug.c +++ b/drivers/gpu/drm/i915/intel_hotplug.c | |||
@@ -180,7 +180,7 @@ static void intel_hpd_irq_storm_disable(struct drm_i915_private *dev_priv) | |||
180 | 180 | ||
181 | /* Enable polling and queue hotplug re-enabling. */ | 181 | /* Enable polling and queue hotplug re-enabling. */ |
182 | if (hpd_disabled) { | 182 | if (hpd_disabled) { |
183 | drm_kms_helper_poll_enable(dev); | 183 | drm_kms_helper_poll_enable_locked(dev); |
184 | mod_delayed_work(system_wq, &dev_priv->hotplug.reenable_work, | 184 | mod_delayed_work(system_wq, &dev_priv->hotplug.reenable_work, |
185 | msecs_to_jiffies(HPD_STORM_REENABLE_DELAY)); | 185 | msecs_to_jiffies(HPD_STORM_REENABLE_DELAY)); |
186 | } | 186 | } |
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c index 72e0edd7bbde..7412caedcf7f 100644 --- a/drivers/gpu/drm/i915/intel_lrc.c +++ b/drivers/gpu/drm/i915/intel_lrc.c | |||
@@ -484,18 +484,18 @@ void intel_lrc_irq_handler(struct intel_engine_cs *ring) | |||
484 | status_pointer = I915_READ(RING_CONTEXT_STATUS_PTR(ring)); | 484 | status_pointer = I915_READ(RING_CONTEXT_STATUS_PTR(ring)); |
485 | 485 | ||
486 | read_pointer = ring->next_context_status_buffer; | 486 | read_pointer = ring->next_context_status_buffer; |
487 | write_pointer = status_pointer & 0x07; | 487 | write_pointer = status_pointer & GEN8_CSB_PTR_MASK; |
488 | if (read_pointer > write_pointer) | 488 | if (read_pointer > write_pointer) |
489 | write_pointer += 6; | 489 | write_pointer += GEN8_CSB_ENTRIES; |
490 | 490 | ||
491 | spin_lock(&ring->execlist_lock); | 491 | spin_lock(&ring->execlist_lock); |
492 | 492 | ||
493 | while (read_pointer < write_pointer) { | 493 | while (read_pointer < write_pointer) { |
494 | read_pointer++; | 494 | read_pointer++; |
495 | status = I915_READ(RING_CONTEXT_STATUS_BUF(ring) + | 495 | status = I915_READ(RING_CONTEXT_STATUS_BUF(ring) + |
496 | (read_pointer % 6) * 8); | 496 | (read_pointer % GEN8_CSB_ENTRIES) * 8); |
497 | status_id = I915_READ(RING_CONTEXT_STATUS_BUF(ring) + | 497 | status_id = I915_READ(RING_CONTEXT_STATUS_BUF(ring) + |
498 | (read_pointer % 6) * 8 + 4); | 498 | (read_pointer % GEN8_CSB_ENTRIES) * 8 + 4); |
499 | 499 | ||
500 | if (status & GEN8_CTX_STATUS_IDLE_ACTIVE) | 500 | if (status & GEN8_CTX_STATUS_IDLE_ACTIVE) |
501 | continue; | 501 | continue; |
@@ -521,10 +521,12 @@ void intel_lrc_irq_handler(struct intel_engine_cs *ring) | |||
521 | spin_unlock(&ring->execlist_lock); | 521 | spin_unlock(&ring->execlist_lock); |
522 | 522 | ||
523 | WARN(submit_contexts > 2, "More than two context complete events?\n"); | 523 | WARN(submit_contexts > 2, "More than two context complete events?\n"); |
524 | ring->next_context_status_buffer = write_pointer % 6; | 524 | ring->next_context_status_buffer = write_pointer % GEN8_CSB_ENTRIES; |
525 | 525 | ||
526 | I915_WRITE(RING_CONTEXT_STATUS_PTR(ring), | 526 | I915_WRITE(RING_CONTEXT_STATUS_PTR(ring), |
527 | _MASKED_FIELD(0x07 << 8, ((u32)ring->next_context_status_buffer & 0x07) << 8)); | 527 | _MASKED_FIELD(GEN8_CSB_PTR_MASK << 8, |
528 | ((u32)ring->next_context_status_buffer & | ||
529 | GEN8_CSB_PTR_MASK) << 8)); | ||
528 | } | 530 | } |
529 | 531 | ||
530 | static int execlists_context_queue(struct drm_i915_gem_request *request) | 532 | static int execlists_context_queue(struct drm_i915_gem_request *request) |
@@ -1422,6 +1424,7 @@ static int gen8_init_common_ring(struct intel_engine_cs *ring) | |||
1422 | { | 1424 | { |
1423 | struct drm_device *dev = ring->dev; | 1425 | struct drm_device *dev = ring->dev; |
1424 | struct drm_i915_private *dev_priv = dev->dev_private; | 1426 | struct drm_i915_private *dev_priv = dev->dev_private; |
1427 | u8 next_context_status_buffer_hw; | ||
1425 | 1428 | ||
1426 | I915_WRITE_IMR(ring, ~(ring->irq_enable_mask | ring->irq_keep_mask)); | 1429 | I915_WRITE_IMR(ring, ~(ring->irq_enable_mask | ring->irq_keep_mask)); |
1427 | I915_WRITE(RING_HWSTAM(ring->mmio_base), 0xffffffff); | 1430 | I915_WRITE(RING_HWSTAM(ring->mmio_base), 0xffffffff); |
@@ -1436,7 +1439,29 @@ static int gen8_init_common_ring(struct intel_engine_cs *ring) | |||
1436 | _MASKED_BIT_DISABLE(GFX_REPLAY_MODE) | | 1439 | _MASKED_BIT_DISABLE(GFX_REPLAY_MODE) | |
1437 | _MASKED_BIT_ENABLE(GFX_RUN_LIST_ENABLE)); | 1440 | _MASKED_BIT_ENABLE(GFX_RUN_LIST_ENABLE)); |
1438 | POSTING_READ(RING_MODE_GEN7(ring)); | 1441 | POSTING_READ(RING_MODE_GEN7(ring)); |
1439 | ring->next_context_status_buffer = 0; | 1442 | |
1443 | /* | ||
1444 | * Instead of resetting the Context Status Buffer (CSB) read pointer to | ||
1445 | * zero, we need to read the write pointer from hardware and use its | ||
1446 | * value because "this register is power context save restored". | ||
1447 | * Effectively, these states have been observed: | ||
1448 | * | ||
1449 | * | Suspend-to-idle (freeze) | Suspend-to-RAM (mem) | | ||
1450 | * BDW | CSB regs not reset | CSB regs reset | | ||
1451 | * CHT | CSB regs not reset | CSB regs not reset | | ||
1452 | */ | ||
1453 | next_context_status_buffer_hw = (I915_READ(RING_CONTEXT_STATUS_PTR(ring)) | ||
1454 | & GEN8_CSB_PTR_MASK); | ||
1455 | |||
1456 | /* | ||
1457 | * When the CSB registers are reset (also after power-up / gpu reset), | ||
1458 | * CSB write pointer is set to all 1's, which is not valid, use '5' in | ||
1459 | * this special case, so the first element read is CSB[0]. | ||
1460 | */ | ||
1461 | if (next_context_status_buffer_hw == GEN8_CSB_PTR_MASK) | ||
1462 | next_context_status_buffer_hw = (GEN8_CSB_ENTRIES - 1); | ||
1463 | |||
1464 | ring->next_context_status_buffer = next_context_status_buffer_hw; | ||
1440 | DRM_DEBUG_DRIVER("Execlists enabled for %s\n", ring->name); | 1465 | DRM_DEBUG_DRIVER("Execlists enabled for %s\n", ring->name); |
1441 | 1466 | ||
1442 | memset(&ring->hangcheck, 0, sizeof(ring->hangcheck)); | 1467 | memset(&ring->hangcheck, 0, sizeof(ring->hangcheck)); |
diff --git a/drivers/gpu/drm/i915/intel_lrc.h b/drivers/gpu/drm/i915/intel_lrc.h index 64f89f9982a2..3c63bb32ad81 100644 --- a/drivers/gpu/drm/i915/intel_lrc.h +++ b/drivers/gpu/drm/i915/intel_lrc.h | |||
@@ -25,6 +25,8 @@ | |||
25 | #define _INTEL_LRC_H_ | 25 | #define _INTEL_LRC_H_ |
26 | 26 | ||
27 | #define GEN8_LR_CONTEXT_ALIGN 4096 | 27 | #define GEN8_LR_CONTEXT_ALIGN 4096 |
28 | #define GEN8_CSB_ENTRIES 6 | ||
29 | #define GEN8_CSB_PTR_MASK 0x07 | ||
28 | 30 | ||
29 | /* Execlists regs */ | 31 | /* Execlists regs */ |
30 | #define RING_ELSP(ring) ((ring)->mmio_base+0x230) | 32 | #define RING_ELSP(ring) ((ring)->mmio_base+0x230) |
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c index af7fdb3bd663..7401cf90b0db 100644 --- a/drivers/gpu/drm/i915/intel_runtime_pm.c +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c | |||
@@ -246,7 +246,8 @@ static void skl_power_well_post_enable(struct drm_i915_private *dev_priv, | |||
246 | } | 246 | } |
247 | 247 | ||
248 | if (power_well->data == SKL_DISP_PW_1) { | 248 | if (power_well->data == SKL_DISP_PW_1) { |
249 | intel_prepare_ddi(dev); | 249 | if (!dev_priv->power_domains.initializing) |
250 | intel_prepare_ddi(dev); | ||
250 | gen8_irq_power_well_post_enable(dev_priv, 1 << PIPE_A); | 251 | gen8_irq_power_well_post_enable(dev_priv, 1 << PIPE_A); |
251 | } | 252 | } |
252 | } | 253 | } |
diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c index dd845f82cc24..4649bd2ed340 100644 --- a/drivers/gpu/drm/qxl/qxl_display.c +++ b/drivers/gpu/drm/qxl/qxl_display.c | |||
@@ -618,7 +618,7 @@ static int qxl_crtc_mode_set(struct drm_crtc *crtc, | |||
618 | adjusted_mode->hdisplay, | 618 | adjusted_mode->hdisplay, |
619 | adjusted_mode->vdisplay); | 619 | adjusted_mode->vdisplay); |
620 | 620 | ||
621 | if (qcrtc->index == 0) | 621 | if (bo->is_primary == false) |
622 | recreate_primary = true; | 622 | recreate_primary = true; |
623 | 623 | ||
624 | if (bo->surf.stride * bo->surf.height > qdev->vram_size) { | 624 | if (bo->surf.stride * bo->surf.height > qdev->vram_size) { |
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c index c3872598b85a..65adb9c72377 100644 --- a/drivers/gpu/drm/radeon/atombios_encoders.c +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | |||
@@ -1624,8 +1624,9 @@ radeon_atom_encoder_dpms_avivo(struct drm_encoder *encoder, int mode) | |||
1624 | } else | 1624 | } else |
1625 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); | 1625 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); |
1626 | if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { | 1626 | if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { |
1627 | args.ucAction = ATOM_LCD_BLON; | 1627 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
1628 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); | 1628 | |
1629 | atombios_set_backlight_level(radeon_encoder, dig->backlight_level); | ||
1629 | } | 1630 | } |
1630 | break; | 1631 | break; |
1631 | case DRM_MODE_DPMS_STANDBY: | 1632 | case DRM_MODE_DPMS_STANDBY: |
@@ -1706,8 +1707,7 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) | |||
1706 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_ON, 0); | 1707 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_ON, 0); |
1707 | } | 1708 | } |
1708 | if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) | 1709 | if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) |
1709 | atombios_dig_transmitter_setup(encoder, | 1710 | atombios_set_backlight_level(radeon_encoder, dig->backlight_level); |
1710 | ATOM_TRANSMITTER_ACTION_LCD_BLON, 0, 0); | ||
1711 | if (ext_encoder) | 1711 | if (ext_encoder) |
1712 | atombios_external_encoder_setup(encoder, ext_encoder, ATOM_ENABLE); | 1712 | atombios_external_encoder_setup(encoder, ext_encoder, ATOM_ENABLE); |
1713 | break; | 1713 | break; |
diff --git a/drivers/gpu/drm/radeon/radeon_dp_mst.c b/drivers/gpu/drm/radeon/radeon_dp_mst.c index 5e09c061847f..6cddae44fa6e 100644 --- a/drivers/gpu/drm/radeon/radeon_dp_mst.c +++ b/drivers/gpu/drm/radeon/radeon_dp_mst.c | |||
@@ -265,7 +265,6 @@ static struct drm_connector *radeon_dp_add_mst_connector(struct drm_dp_mst_topol | |||
265 | { | 265 | { |
266 | struct radeon_connector *master = container_of(mgr, struct radeon_connector, mst_mgr); | 266 | struct radeon_connector *master = container_of(mgr, struct radeon_connector, mst_mgr); |
267 | struct drm_device *dev = master->base.dev; | 267 | struct drm_device *dev = master->base.dev; |
268 | struct radeon_device *rdev = dev->dev_private; | ||
269 | struct radeon_connector *radeon_connector; | 268 | struct radeon_connector *radeon_connector; |
270 | struct drm_connector *connector; | 269 | struct drm_connector *connector; |
271 | 270 | ||
@@ -286,12 +285,19 @@ static struct drm_connector *radeon_dp_add_mst_connector(struct drm_dp_mst_topol | |||
286 | drm_object_attach_property(&connector->base, dev->mode_config.path_property, 0); | 285 | drm_object_attach_property(&connector->base, dev->mode_config.path_property, 0); |
287 | drm_mode_connector_set_path_property(connector, pathprop); | 286 | drm_mode_connector_set_path_property(connector, pathprop); |
288 | 287 | ||
288 | return connector; | ||
289 | } | ||
290 | |||
291 | static void radeon_dp_register_mst_connector(struct drm_connector *connector) | ||
292 | { | ||
293 | struct drm_device *dev = connector->dev; | ||
294 | struct radeon_device *rdev = dev->dev_private; | ||
295 | |||
289 | drm_modeset_lock_all(dev); | 296 | drm_modeset_lock_all(dev); |
290 | radeon_fb_add_connector(rdev, connector); | 297 | radeon_fb_add_connector(rdev, connector); |
291 | drm_modeset_unlock_all(dev); | 298 | drm_modeset_unlock_all(dev); |
292 | 299 | ||
293 | drm_connector_register(connector); | 300 | drm_connector_register(connector); |
294 | return connector; | ||
295 | } | 301 | } |
296 | 302 | ||
297 | static void radeon_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr, | 303 | static void radeon_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr, |
@@ -324,6 +330,7 @@ static void radeon_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr) | |||
324 | 330 | ||
325 | struct drm_dp_mst_topology_cbs mst_cbs = { | 331 | struct drm_dp_mst_topology_cbs mst_cbs = { |
326 | .add_connector = radeon_dp_add_mst_connector, | 332 | .add_connector = radeon_dp_add_mst_connector, |
333 | .register_connector = radeon_dp_register_mst_connector, | ||
327 | .destroy_connector = radeon_dp_destroy_mst_connector, | 334 | .destroy_connector = radeon_dp_destroy_mst_connector, |
328 | .hotplug = radeon_dp_mst_hotplug, | 335 | .hotplug = radeon_dp_mst_hotplug, |
329 | }; | 336 | }; |
diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c index 7214858ffcea..1aa657fe31cb 100644 --- a/drivers/gpu/drm/radeon/radeon_fb.c +++ b/drivers/gpu/drm/radeon/radeon_fb.c | |||
@@ -48,40 +48,10 @@ struct radeon_fbdev { | |||
48 | struct radeon_device *rdev; | 48 | struct radeon_device *rdev; |
49 | }; | 49 | }; |
50 | 50 | ||
51 | /** | ||
52 | * radeon_fb_helper_set_par - Hide cursor on CRTCs used by fbdev. | ||
53 | * | ||
54 | * @info: fbdev info | ||
55 | * | ||
56 | * This function hides the cursor on all CRTCs used by fbdev. | ||
57 | */ | ||
58 | static int radeon_fb_helper_set_par(struct fb_info *info) | ||
59 | { | ||
60 | int ret; | ||
61 | |||
62 | ret = drm_fb_helper_set_par(info); | ||
63 | |||
64 | /* XXX: with universal plane support fbdev will automatically disable | ||
65 | * all non-primary planes (including the cursor) | ||
66 | */ | ||
67 | if (ret == 0) { | ||
68 | struct drm_fb_helper *fb_helper = info->par; | ||
69 | int i; | ||
70 | |||
71 | for (i = 0; i < fb_helper->crtc_count; i++) { | ||
72 | struct drm_crtc *crtc = fb_helper->crtc_info[i].mode_set.crtc; | ||
73 | |||
74 | radeon_crtc_cursor_set2(crtc, NULL, 0, 0, 0, 0, 0); | ||
75 | } | ||
76 | } | ||
77 | |||
78 | return ret; | ||
79 | } | ||
80 | |||
81 | static struct fb_ops radeonfb_ops = { | 51 | static struct fb_ops radeonfb_ops = { |
82 | .owner = THIS_MODULE, | 52 | .owner = THIS_MODULE, |
83 | .fb_check_var = drm_fb_helper_check_var, | 53 | .fb_check_var = drm_fb_helper_check_var, |
84 | .fb_set_par = radeon_fb_helper_set_par, | 54 | .fb_set_par = drm_fb_helper_set_par, |
85 | .fb_fillrect = drm_fb_helper_cfb_fillrect, | 55 | .fb_fillrect = drm_fb_helper_cfb_fillrect, |
86 | .fb_copyarea = drm_fb_helper_cfb_copyarea, | 56 | .fb_copyarea = drm_fb_helper_cfb_copyarea, |
87 | .fb_imageblit = drm_fb_helper_cfb_imageblit, | 57 | .fb_imageblit = drm_fb_helper_cfb_imageblit, |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c index 5ae8f921da2a..8a76821177a6 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c | |||
@@ -681,6 +681,14 @@ static bool vmw_cmdbuf_try_alloc(struct vmw_cmdbuf_man *man, | |||
681 | 0, 0, | 681 | 0, 0, |
682 | DRM_MM_SEARCH_DEFAULT, | 682 | DRM_MM_SEARCH_DEFAULT, |
683 | DRM_MM_CREATE_DEFAULT); | 683 | DRM_MM_CREATE_DEFAULT); |
684 | if (ret) { | ||
685 | (void) vmw_cmdbuf_man_process(man); | ||
686 | ret = drm_mm_insert_node_generic(&man->mm, info->node, | ||
687 | info->page_size, 0, 0, | ||
688 | DRM_MM_SEARCH_DEFAULT, | ||
689 | DRM_MM_CREATE_DEFAULT); | ||
690 | } | ||
691 | |||
684 | spin_unlock_bh(&man->lock); | 692 | spin_unlock_bh(&man->lock); |
685 | info->done = !ret; | 693 | info->done = !ret; |
686 | 694 | ||
diff --git a/drivers/hwmon/abx500.c b/drivers/hwmon/abx500.c index 6cb89c0ebab6..1fd46859ed29 100644 --- a/drivers/hwmon/abx500.c +++ b/drivers/hwmon/abx500.c | |||
@@ -470,6 +470,7 @@ static const struct of_device_id abx500_temp_match[] = { | |||
470 | { .compatible = "stericsson,abx500-temp" }, | 470 | { .compatible = "stericsson,abx500-temp" }, |
471 | {}, | 471 | {}, |
472 | }; | 472 | }; |
473 | MODULE_DEVICE_TABLE(of, abx500_temp_match); | ||
473 | #endif | 474 | #endif |
474 | 475 | ||
475 | static struct platform_driver abx500_temp_driver = { | 476 | static struct platform_driver abx500_temp_driver = { |
diff --git a/drivers/hwmon/gpio-fan.c b/drivers/hwmon/gpio-fan.c index a3dae6d0082a..82de3deeb18a 100644 --- a/drivers/hwmon/gpio-fan.c +++ b/drivers/hwmon/gpio-fan.c | |||
@@ -539,6 +539,7 @@ static const struct of_device_id of_gpio_fan_match[] = { | |||
539 | { .compatible = "gpio-fan", }, | 539 | { .compatible = "gpio-fan", }, |
540 | {}, | 540 | {}, |
541 | }; | 541 | }; |
542 | MODULE_DEVICE_TABLE(of, of_gpio_fan_match); | ||
542 | #endif /* CONFIG_OF_GPIO */ | 543 | #endif /* CONFIG_OF_GPIO */ |
543 | 544 | ||
544 | static int gpio_fan_probe(struct platform_device *pdev) | 545 | static int gpio_fan_probe(struct platform_device *pdev) |
diff --git a/drivers/hwmon/pwm-fan.c b/drivers/hwmon/pwm-fan.c index 2d9a712699ff..3e23003f78b0 100644 --- a/drivers/hwmon/pwm-fan.c +++ b/drivers/hwmon/pwm-fan.c | |||
@@ -323,6 +323,7 @@ static const struct of_device_id of_pwm_fan_match[] = { | |||
323 | { .compatible = "pwm-fan", }, | 323 | { .compatible = "pwm-fan", }, |
324 | {}, | 324 | {}, |
325 | }; | 325 | }; |
326 | MODULE_DEVICE_TABLE(of, of_pwm_fan_match); | ||
326 | 327 | ||
327 | static struct platform_driver pwm_fan_driver = { | 328 | static struct platform_driver pwm_fan_driver = { |
328 | .probe = pwm_fan_probe, | 329 | .probe = pwm_fan_probe, |
diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c index 3a3738fe016b..cd4510a63375 100644 --- a/drivers/idle/intel_idle.c +++ b/drivers/idle/intel_idle.c | |||
@@ -620,7 +620,7 @@ static struct cpuidle_state skl_cstates[] = { | |||
620 | .name = "C6-SKL", | 620 | .name = "C6-SKL", |
621 | .desc = "MWAIT 0x20", | 621 | .desc = "MWAIT 0x20", |
622 | .flags = MWAIT2flg(0x20) | CPUIDLE_FLAG_TLB_FLUSHED, | 622 | .flags = MWAIT2flg(0x20) | CPUIDLE_FLAG_TLB_FLUSHED, |
623 | .exit_latency = 75, | 623 | .exit_latency = 85, |
624 | .target_residency = 200, | 624 | .target_residency = 200, |
625 | .enter = &intel_idle, | 625 | .enter = &intel_idle, |
626 | .enter_freeze = intel_idle_freeze, }, | 626 | .enter_freeze = intel_idle_freeze, }, |
@@ -636,11 +636,19 @@ static struct cpuidle_state skl_cstates[] = { | |||
636 | .name = "C8-SKL", | 636 | .name = "C8-SKL", |
637 | .desc = "MWAIT 0x40", | 637 | .desc = "MWAIT 0x40", |
638 | .flags = MWAIT2flg(0x40) | CPUIDLE_FLAG_TLB_FLUSHED, | 638 | .flags = MWAIT2flg(0x40) | CPUIDLE_FLAG_TLB_FLUSHED, |
639 | .exit_latency = 174, | 639 | .exit_latency = 200, |
640 | .target_residency = 800, | 640 | .target_residency = 800, |
641 | .enter = &intel_idle, | 641 | .enter = &intel_idle, |
642 | .enter_freeze = intel_idle_freeze, }, | 642 | .enter_freeze = intel_idle_freeze, }, |
643 | { | 643 | { |
644 | .name = "C9-SKL", | ||
645 | .desc = "MWAIT 0x50", | ||
646 | .flags = MWAIT2flg(0x50) | CPUIDLE_FLAG_TLB_FLUSHED, | ||
647 | .exit_latency = 480, | ||
648 | .target_residency = 5000, | ||
649 | .enter = &intel_idle, | ||
650 | .enter_freeze = intel_idle_freeze, }, | ||
651 | { | ||
644 | .name = "C10-SKL", | 652 | .name = "C10-SKL", |
645 | .desc = "MWAIT 0x60", | 653 | .desc = "MWAIT 0x60", |
646 | .flags = MWAIT2flg(0x60) | CPUIDLE_FLAG_TLB_FLUSHED, | 654 | .flags = MWAIT2flg(0x60) | CPUIDLE_FLAG_TLB_FLUSHED, |
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c index 41d6911e244e..f1ccd40beae9 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c | |||
@@ -245,7 +245,6 @@ static int mlx5_ib_query_device(struct ib_device *ibdev, | |||
245 | props->device_cap_flags |= IB_DEVICE_BAD_QKEY_CNTR; | 245 | props->device_cap_flags |= IB_DEVICE_BAD_QKEY_CNTR; |
246 | if (MLX5_CAP_GEN(mdev, apm)) | 246 | if (MLX5_CAP_GEN(mdev, apm)) |
247 | props->device_cap_flags |= IB_DEVICE_AUTO_PATH_MIG; | 247 | props->device_cap_flags |= IB_DEVICE_AUTO_PATH_MIG; |
248 | props->device_cap_flags |= IB_DEVICE_LOCAL_DMA_LKEY; | ||
249 | if (MLX5_CAP_GEN(mdev, xrc)) | 248 | if (MLX5_CAP_GEN(mdev, xrc)) |
250 | props->device_cap_flags |= IB_DEVICE_XRC; | 249 | props->device_cap_flags |= IB_DEVICE_XRC; |
251 | props->device_cap_flags |= IB_DEVICE_MEM_MGT_EXTENSIONS; | 250 | props->device_cap_flags |= IB_DEVICE_MEM_MGT_EXTENSIONS; |
@@ -795,53 +794,6 @@ static int mlx5_ib_mmap(struct ib_ucontext *ibcontext, struct vm_area_struct *vm | |||
795 | return 0; | 794 | return 0; |
796 | } | 795 | } |
797 | 796 | ||
798 | static int alloc_pa_mkey(struct mlx5_ib_dev *dev, u32 *key, u32 pdn) | ||
799 | { | ||
800 | struct mlx5_create_mkey_mbox_in *in; | ||
801 | struct mlx5_mkey_seg *seg; | ||
802 | struct mlx5_core_mr mr; | ||
803 | int err; | ||
804 | |||
805 | in = kzalloc(sizeof(*in), GFP_KERNEL); | ||
806 | if (!in) | ||
807 | return -ENOMEM; | ||
808 | |||
809 | seg = &in->seg; | ||
810 | seg->flags = MLX5_PERM_LOCAL_READ | MLX5_ACCESS_MODE_PA; | ||
811 | seg->flags_pd = cpu_to_be32(pdn | MLX5_MKEY_LEN64); | ||
812 | seg->qpn_mkey7_0 = cpu_to_be32(0xffffff << 8); | ||
813 | seg->start_addr = 0; | ||
814 | |||
815 | err = mlx5_core_create_mkey(dev->mdev, &mr, in, sizeof(*in), | ||
816 | NULL, NULL, NULL); | ||
817 | if (err) { | ||
818 | mlx5_ib_warn(dev, "failed to create mkey, %d\n", err); | ||
819 | goto err_in; | ||
820 | } | ||
821 | |||
822 | kfree(in); | ||
823 | *key = mr.key; | ||
824 | |||
825 | return 0; | ||
826 | |||
827 | err_in: | ||
828 | kfree(in); | ||
829 | |||
830 | return err; | ||
831 | } | ||
832 | |||
833 | static void free_pa_mkey(struct mlx5_ib_dev *dev, u32 key) | ||
834 | { | ||
835 | struct mlx5_core_mr mr; | ||
836 | int err; | ||
837 | |||
838 | memset(&mr, 0, sizeof(mr)); | ||
839 | mr.key = key; | ||
840 | err = mlx5_core_destroy_mkey(dev->mdev, &mr); | ||
841 | if (err) | ||
842 | mlx5_ib_warn(dev, "failed to destroy mkey 0x%x\n", key); | ||
843 | } | ||
844 | |||
845 | static struct ib_pd *mlx5_ib_alloc_pd(struct ib_device *ibdev, | 797 | static struct ib_pd *mlx5_ib_alloc_pd(struct ib_device *ibdev, |
846 | struct ib_ucontext *context, | 798 | struct ib_ucontext *context, |
847 | struct ib_udata *udata) | 799 | struct ib_udata *udata) |
@@ -867,13 +819,6 @@ static struct ib_pd *mlx5_ib_alloc_pd(struct ib_device *ibdev, | |||
867 | kfree(pd); | 819 | kfree(pd); |
868 | return ERR_PTR(-EFAULT); | 820 | return ERR_PTR(-EFAULT); |
869 | } | 821 | } |
870 | } else { | ||
871 | err = alloc_pa_mkey(to_mdev(ibdev), &pd->pa_lkey, pd->pdn); | ||
872 | if (err) { | ||
873 | mlx5_core_dealloc_pd(to_mdev(ibdev)->mdev, pd->pdn); | ||
874 | kfree(pd); | ||
875 | return ERR_PTR(err); | ||
876 | } | ||
877 | } | 822 | } |
878 | 823 | ||
879 | return &pd->ibpd; | 824 | return &pd->ibpd; |
@@ -884,9 +829,6 @@ static int mlx5_ib_dealloc_pd(struct ib_pd *pd) | |||
884 | struct mlx5_ib_dev *mdev = to_mdev(pd->device); | 829 | struct mlx5_ib_dev *mdev = to_mdev(pd->device); |
885 | struct mlx5_ib_pd *mpd = to_mpd(pd); | 830 | struct mlx5_ib_pd *mpd = to_mpd(pd); |
886 | 831 | ||
887 | if (!pd->uobject) | ||
888 | free_pa_mkey(mdev, mpd->pa_lkey); | ||
889 | |||
890 | mlx5_core_dealloc_pd(mdev->mdev, mpd->pdn); | 832 | mlx5_core_dealloc_pd(mdev->mdev, mpd->pdn); |
891 | kfree(mpd); | 833 | kfree(mpd); |
892 | 834 | ||
@@ -1245,18 +1187,10 @@ static int create_dev_resources(struct mlx5_ib_resources *devr) | |||
1245 | struct ib_srq_init_attr attr; | 1187 | struct ib_srq_init_attr attr; |
1246 | struct mlx5_ib_dev *dev; | 1188 | struct mlx5_ib_dev *dev; |
1247 | struct ib_cq_init_attr cq_attr = {.cqe = 1}; | 1189 | struct ib_cq_init_attr cq_attr = {.cqe = 1}; |
1248 | u32 rsvd_lkey; | ||
1249 | int ret = 0; | 1190 | int ret = 0; |
1250 | 1191 | ||
1251 | dev = container_of(devr, struct mlx5_ib_dev, devr); | 1192 | dev = container_of(devr, struct mlx5_ib_dev, devr); |
1252 | 1193 | ||
1253 | ret = mlx5_core_query_special_context(dev->mdev, &rsvd_lkey); | ||
1254 | if (ret) { | ||
1255 | pr_err("Failed to query special context %d\n", ret); | ||
1256 | return ret; | ||
1257 | } | ||
1258 | dev->ib_dev.local_dma_lkey = rsvd_lkey; | ||
1259 | |||
1260 | devr->p0 = mlx5_ib_alloc_pd(&dev->ib_dev, NULL, NULL); | 1194 | devr->p0 = mlx5_ib_alloc_pd(&dev->ib_dev, NULL, NULL); |
1261 | if (IS_ERR(devr->p0)) { | 1195 | if (IS_ERR(devr->p0)) { |
1262 | ret = PTR_ERR(devr->p0); | 1196 | ret = PTR_ERR(devr->p0); |
@@ -1418,6 +1352,7 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev) | |||
1418 | strlcpy(dev->ib_dev.name, "mlx5_%d", IB_DEVICE_NAME_MAX); | 1352 | strlcpy(dev->ib_dev.name, "mlx5_%d", IB_DEVICE_NAME_MAX); |
1419 | dev->ib_dev.owner = THIS_MODULE; | 1353 | dev->ib_dev.owner = THIS_MODULE; |
1420 | dev->ib_dev.node_type = RDMA_NODE_IB_CA; | 1354 | dev->ib_dev.node_type = RDMA_NODE_IB_CA; |
1355 | dev->ib_dev.local_dma_lkey = 0 /* not supported for now */; | ||
1421 | dev->num_ports = MLX5_CAP_GEN(mdev, num_ports); | 1356 | dev->num_ports = MLX5_CAP_GEN(mdev, num_ports); |
1422 | dev->ib_dev.phys_port_cnt = dev->num_ports; | 1357 | dev->ib_dev.phys_port_cnt = dev->num_ports; |
1423 | dev->ib_dev.num_comp_vectors = | 1358 | dev->ib_dev.num_comp_vectors = |
diff --git a/drivers/infiniband/hw/mlx5/mlx5_ib.h b/drivers/infiniband/hw/mlx5/mlx5_ib.h index bb8cda79e881..22123b79d550 100644 --- a/drivers/infiniband/hw/mlx5/mlx5_ib.h +++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h | |||
@@ -103,7 +103,6 @@ static inline struct mlx5_ib_ucontext *to_mucontext(struct ib_ucontext *ibuconte | |||
103 | struct mlx5_ib_pd { | 103 | struct mlx5_ib_pd { |
104 | struct ib_pd ibpd; | 104 | struct ib_pd ibpd; |
105 | u32 pdn; | 105 | u32 pdn; |
106 | u32 pa_lkey; | ||
107 | }; | 106 | }; |
108 | 107 | ||
109 | /* Use macros here so that don't have to duplicate | 108 | /* Use macros here so that don't have to duplicate |
@@ -213,7 +212,6 @@ struct mlx5_ib_qp { | |||
213 | int uuarn; | 212 | int uuarn; |
214 | 213 | ||
215 | int create_type; | 214 | int create_type; |
216 | u32 pa_lkey; | ||
217 | 215 | ||
218 | /* Store signature errors */ | 216 | /* Store signature errors */ |
219 | bool signature_en; | 217 | bool signature_en; |
diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c index c745c6c5e10d..6f521a3418e8 100644 --- a/drivers/infiniband/hw/mlx5/qp.c +++ b/drivers/infiniband/hw/mlx5/qp.c | |||
@@ -925,8 +925,6 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd, | |||
925 | err = create_kernel_qp(dev, init_attr, qp, &in, &inlen); | 925 | err = create_kernel_qp(dev, init_attr, qp, &in, &inlen); |
926 | if (err) | 926 | if (err) |
927 | mlx5_ib_dbg(dev, "err %d\n", err); | 927 | mlx5_ib_dbg(dev, "err %d\n", err); |
928 | else | ||
929 | qp->pa_lkey = to_mpd(pd)->pa_lkey; | ||
930 | } | 928 | } |
931 | 929 | ||
932 | if (err) | 930 | if (err) |
@@ -2045,7 +2043,7 @@ static void set_frwr_pages(struct mlx5_wqe_data_seg *dseg, | |||
2045 | mfrpl->mapped_page_list[i] = cpu_to_be64(page_list[i] | perm); | 2043 | mfrpl->mapped_page_list[i] = cpu_to_be64(page_list[i] | perm); |
2046 | dseg->addr = cpu_to_be64(mfrpl->map); | 2044 | dseg->addr = cpu_to_be64(mfrpl->map); |
2047 | dseg->byte_count = cpu_to_be32(ALIGN(sizeof(u64) * wr->wr.fast_reg.page_list_len, 64)); | 2045 | dseg->byte_count = cpu_to_be32(ALIGN(sizeof(u64) * wr->wr.fast_reg.page_list_len, 64)); |
2048 | dseg->lkey = cpu_to_be32(pd->pa_lkey); | 2046 | dseg->lkey = cpu_to_be32(pd->ibpd.local_dma_lkey); |
2049 | } | 2047 | } |
2050 | 2048 | ||
2051 | static __be32 send_ieth(struct ib_send_wr *wr) | 2049 | static __be32 send_ieth(struct ib_send_wr *wr) |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h index ca2873698d75..4cd5428a2399 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib.h +++ b/drivers/infiniband/ulp/ipoib/ipoib.h | |||
@@ -80,7 +80,7 @@ enum { | |||
80 | IPOIB_NUM_WC = 4, | 80 | IPOIB_NUM_WC = 4, |
81 | 81 | ||
82 | IPOIB_MAX_PATH_REC_QUEUE = 3, | 82 | IPOIB_MAX_PATH_REC_QUEUE = 3, |
83 | IPOIB_MAX_MCAST_QUEUE = 3, | 83 | IPOIB_MAX_MCAST_QUEUE = 64, |
84 | 84 | ||
85 | IPOIB_FLAG_OPER_UP = 0, | 85 | IPOIB_FLAG_OPER_UP = 0, |
86 | IPOIB_FLAG_INITIALIZED = 1, | 86 | IPOIB_FLAG_INITIALIZED = 1, |
@@ -548,6 +548,8 @@ void ipoib_path_iter_read(struct ipoib_path_iter *iter, | |||
548 | 548 | ||
549 | int ipoib_mcast_attach(struct net_device *dev, u16 mlid, | 549 | int ipoib_mcast_attach(struct net_device *dev, u16 mlid, |
550 | union ib_gid *mgid, int set_qkey); | 550 | union ib_gid *mgid, int set_qkey); |
551 | int ipoib_mcast_leave(struct net_device *dev, struct ipoib_mcast *mcast); | ||
552 | struct ipoib_mcast *__ipoib_mcast_find(struct net_device *dev, void *mgid); | ||
551 | 553 | ||
552 | int ipoib_init_qp(struct net_device *dev); | 554 | int ipoib_init_qp(struct net_device *dev); |
553 | int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca); | 555 | int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca); |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index 36536ce5a3e2..f74316e679d2 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c | |||
@@ -1149,6 +1149,9 @@ static void __ipoib_reap_neigh(struct ipoib_dev_priv *priv) | |||
1149 | unsigned long dt; | 1149 | unsigned long dt; |
1150 | unsigned long flags; | 1150 | unsigned long flags; |
1151 | int i; | 1151 | int i; |
1152 | LIST_HEAD(remove_list); | ||
1153 | struct ipoib_mcast *mcast, *tmcast; | ||
1154 | struct net_device *dev = priv->dev; | ||
1152 | 1155 | ||
1153 | if (test_bit(IPOIB_STOP_NEIGH_GC, &priv->flags)) | 1156 | if (test_bit(IPOIB_STOP_NEIGH_GC, &priv->flags)) |
1154 | return; | 1157 | return; |
@@ -1176,6 +1179,19 @@ static void __ipoib_reap_neigh(struct ipoib_dev_priv *priv) | |||
1176 | lockdep_is_held(&priv->lock))) != NULL) { | 1179 | lockdep_is_held(&priv->lock))) != NULL) { |
1177 | /* was the neigh idle for two GC periods */ | 1180 | /* was the neigh idle for two GC periods */ |
1178 | if (time_after(neigh_obsolete, neigh->alive)) { | 1181 | if (time_after(neigh_obsolete, neigh->alive)) { |
1182 | u8 *mgid = neigh->daddr + 4; | ||
1183 | |||
1184 | /* Is this multicast ? */ | ||
1185 | if (*mgid == 0xff) { | ||
1186 | mcast = __ipoib_mcast_find(dev, mgid); | ||
1187 | |||
1188 | if (mcast && test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { | ||
1189 | list_del(&mcast->list); | ||
1190 | rb_erase(&mcast->rb_node, &priv->multicast_tree); | ||
1191 | list_add_tail(&mcast->list, &remove_list); | ||
1192 | } | ||
1193 | } | ||
1194 | |||
1179 | rcu_assign_pointer(*np, | 1195 | rcu_assign_pointer(*np, |
1180 | rcu_dereference_protected(neigh->hnext, | 1196 | rcu_dereference_protected(neigh->hnext, |
1181 | lockdep_is_held(&priv->lock))); | 1197 | lockdep_is_held(&priv->lock))); |
@@ -1191,6 +1207,8 @@ static void __ipoib_reap_neigh(struct ipoib_dev_priv *priv) | |||
1191 | 1207 | ||
1192 | out_unlock: | 1208 | out_unlock: |
1193 | spin_unlock_irqrestore(&priv->lock, flags); | 1209 | spin_unlock_irqrestore(&priv->lock, flags); |
1210 | list_for_each_entry_safe(mcast, tmcast, &remove_list, list) | ||
1211 | ipoib_mcast_leave(dev, mcast); | ||
1194 | } | 1212 | } |
1195 | 1213 | ||
1196 | static void ipoib_reap_neigh(struct work_struct *work) | 1214 | static void ipoib_reap_neigh(struct work_struct *work) |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c index 09a1748f9d13..136cbefe00f8 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c | |||
@@ -153,7 +153,7 @@ static struct ipoib_mcast *ipoib_mcast_alloc(struct net_device *dev, | |||
153 | return mcast; | 153 | return mcast; |
154 | } | 154 | } |
155 | 155 | ||
156 | static struct ipoib_mcast *__ipoib_mcast_find(struct net_device *dev, void *mgid) | 156 | struct ipoib_mcast *__ipoib_mcast_find(struct net_device *dev, void *mgid) |
157 | { | 157 | { |
158 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 158 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
159 | struct rb_node *n = priv->multicast_tree.rb_node; | 159 | struct rb_node *n = priv->multicast_tree.rb_node; |
@@ -508,17 +508,19 @@ static void ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast) | |||
508 | rec.hop_limit = priv->broadcast->mcmember.hop_limit; | 508 | rec.hop_limit = priv->broadcast->mcmember.hop_limit; |
509 | 509 | ||
510 | /* | 510 | /* |
511 | * Historically Linux IPoIB has never properly supported SEND | 511 | * Send-only IB Multicast joins do not work at the core |
512 | * ONLY join. It emulated it by not providing all the required | 512 | * IB layer yet, so we can't use them here. However, |
513 | * attributes, which is enough to prevent group creation and | 513 | * we are emulating an Ethernet multicast send, which |
514 | * detect if there are full members or not. A major problem | 514 | * does not require a multicast subscription and will |
515 | * with supporting SEND ONLY is detecting when the group is | 515 | * still send properly. The most appropriate thing to |
516 | * auto-destroyed as IPoIB will cache the MLID.. | 516 | * do is to create the group if it doesn't exist as that |
517 | * most closely emulates the behavior, from a user space | ||
518 | * application perspecitive, of Ethernet multicast | ||
519 | * operation. For now, we do a full join, maybe later | ||
520 | * when the core IB layers support send only joins we | ||
521 | * will use them. | ||
517 | */ | 522 | */ |
518 | #if 1 | 523 | #if 0 |
519 | if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) | ||
520 | comp_mask &= ~IB_SA_MCMEMBER_REC_TRAFFIC_CLASS; | ||
521 | #else | ||
522 | if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) | 524 | if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) |
523 | rec.join_state = 4; | 525 | rec.join_state = 4; |
524 | #endif | 526 | #endif |
@@ -675,7 +677,7 @@ int ipoib_mcast_stop_thread(struct net_device *dev) | |||
675 | return 0; | 677 | return 0; |
676 | } | 678 | } |
677 | 679 | ||
678 | static int ipoib_mcast_leave(struct net_device *dev, struct ipoib_mcast *mcast) | 680 | int ipoib_mcast_leave(struct net_device *dev, struct ipoib_mcast *mcast) |
679 | { | 681 | { |
680 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 682 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
681 | int ret = 0; | 683 | int ret = 0; |
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c b/drivers/infiniband/ulp/iser/iscsi_iser.c index 1ace5d83a4d7..f58ff96b6cbb 100644 --- a/drivers/infiniband/ulp/iser/iscsi_iser.c +++ b/drivers/infiniband/ulp/iser/iscsi_iser.c | |||
@@ -97,6 +97,11 @@ unsigned int iser_max_sectors = ISER_DEF_MAX_SECTORS; | |||
97 | module_param_named(max_sectors, iser_max_sectors, uint, S_IRUGO | S_IWUSR); | 97 | module_param_named(max_sectors, iser_max_sectors, uint, S_IRUGO | S_IWUSR); |
98 | MODULE_PARM_DESC(max_sectors, "Max number of sectors in a single scsi command (default:1024"); | 98 | MODULE_PARM_DESC(max_sectors, "Max number of sectors in a single scsi command (default:1024"); |
99 | 99 | ||
100 | bool iser_always_reg = true; | ||
101 | module_param_named(always_register, iser_always_reg, bool, S_IRUGO); | ||
102 | MODULE_PARM_DESC(always_register, | ||
103 | "Always register memory, even for continuous memory regions (default:true)"); | ||
104 | |||
100 | bool iser_pi_enable = false; | 105 | bool iser_pi_enable = false; |
101 | module_param_named(pi_enable, iser_pi_enable, bool, S_IRUGO); | 106 | module_param_named(pi_enable, iser_pi_enable, bool, S_IRUGO); |
102 | MODULE_PARM_DESC(pi_enable, "Enable T10-PI offload support (default:disabled)"); | 107 | MODULE_PARM_DESC(pi_enable, "Enable T10-PI offload support (default:disabled)"); |
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.h b/drivers/infiniband/ulp/iser/iscsi_iser.h index 86f6583485ef..a5edd6ede692 100644 --- a/drivers/infiniband/ulp/iser/iscsi_iser.h +++ b/drivers/infiniband/ulp/iser/iscsi_iser.h | |||
@@ -611,6 +611,7 @@ extern int iser_debug_level; | |||
611 | extern bool iser_pi_enable; | 611 | extern bool iser_pi_enable; |
612 | extern int iser_pi_guard; | 612 | extern int iser_pi_guard; |
613 | extern unsigned int iser_max_sectors; | 613 | extern unsigned int iser_max_sectors; |
614 | extern bool iser_always_reg; | ||
614 | 615 | ||
615 | int iser_assign_reg_ops(struct iser_device *device); | 616 | int iser_assign_reg_ops(struct iser_device *device); |
616 | 617 | ||
diff --git a/drivers/infiniband/ulp/iser/iser_memory.c b/drivers/infiniband/ulp/iser/iser_memory.c index 2493cc748db8..4c46d67d37a1 100644 --- a/drivers/infiniband/ulp/iser/iser_memory.c +++ b/drivers/infiniband/ulp/iser/iser_memory.c | |||
@@ -803,11 +803,12 @@ static int | |||
803 | iser_reg_prot_sg(struct iscsi_iser_task *task, | 803 | iser_reg_prot_sg(struct iscsi_iser_task *task, |
804 | struct iser_data_buf *mem, | 804 | struct iser_data_buf *mem, |
805 | struct iser_fr_desc *desc, | 805 | struct iser_fr_desc *desc, |
806 | bool use_dma_key, | ||
806 | struct iser_mem_reg *reg) | 807 | struct iser_mem_reg *reg) |
807 | { | 808 | { |
808 | struct iser_device *device = task->iser_conn->ib_conn.device; | 809 | struct iser_device *device = task->iser_conn->ib_conn.device; |
809 | 810 | ||
810 | if (mem->dma_nents == 1) | 811 | if (use_dma_key) |
811 | return iser_reg_dma(device, mem, reg); | 812 | return iser_reg_dma(device, mem, reg); |
812 | 813 | ||
813 | return device->reg_ops->reg_mem(task, mem, &desc->pi_ctx->rsc, reg); | 814 | return device->reg_ops->reg_mem(task, mem, &desc->pi_ctx->rsc, reg); |
@@ -817,11 +818,12 @@ static int | |||
817 | iser_reg_data_sg(struct iscsi_iser_task *task, | 818 | iser_reg_data_sg(struct iscsi_iser_task *task, |
818 | struct iser_data_buf *mem, | 819 | struct iser_data_buf *mem, |
819 | struct iser_fr_desc *desc, | 820 | struct iser_fr_desc *desc, |
821 | bool use_dma_key, | ||
820 | struct iser_mem_reg *reg) | 822 | struct iser_mem_reg *reg) |
821 | { | 823 | { |
822 | struct iser_device *device = task->iser_conn->ib_conn.device; | 824 | struct iser_device *device = task->iser_conn->ib_conn.device; |
823 | 825 | ||
824 | if (mem->dma_nents == 1) | 826 | if (use_dma_key) |
825 | return iser_reg_dma(device, mem, reg); | 827 | return iser_reg_dma(device, mem, reg); |
826 | 828 | ||
827 | return device->reg_ops->reg_mem(task, mem, &desc->rsc, reg); | 829 | return device->reg_ops->reg_mem(task, mem, &desc->rsc, reg); |
@@ -836,14 +838,17 @@ int iser_reg_rdma_mem(struct iscsi_iser_task *task, | |||
836 | struct iser_mem_reg *reg = &task->rdma_reg[dir]; | 838 | struct iser_mem_reg *reg = &task->rdma_reg[dir]; |
837 | struct iser_mem_reg *data_reg; | 839 | struct iser_mem_reg *data_reg; |
838 | struct iser_fr_desc *desc = NULL; | 840 | struct iser_fr_desc *desc = NULL; |
841 | bool use_dma_key; | ||
839 | int err; | 842 | int err; |
840 | 843 | ||
841 | err = iser_handle_unaligned_buf(task, mem, dir); | 844 | err = iser_handle_unaligned_buf(task, mem, dir); |
842 | if (unlikely(err)) | 845 | if (unlikely(err)) |
843 | return err; | 846 | return err; |
844 | 847 | ||
845 | if (mem->dma_nents != 1 || | 848 | use_dma_key = (mem->dma_nents == 1 && !iser_always_reg && |
846 | scsi_get_prot_op(task->sc) != SCSI_PROT_NORMAL) { | 849 | scsi_get_prot_op(task->sc) == SCSI_PROT_NORMAL); |
850 | |||
851 | if (!use_dma_key) { | ||
847 | desc = device->reg_ops->reg_desc_get(ib_conn); | 852 | desc = device->reg_ops->reg_desc_get(ib_conn); |
848 | reg->mem_h = desc; | 853 | reg->mem_h = desc; |
849 | } | 854 | } |
@@ -853,7 +858,7 @@ int iser_reg_rdma_mem(struct iscsi_iser_task *task, | |||
853 | else | 858 | else |
854 | data_reg = &task->desc.data_reg; | 859 | data_reg = &task->desc.data_reg; |
855 | 860 | ||
856 | err = iser_reg_data_sg(task, mem, desc, data_reg); | 861 | err = iser_reg_data_sg(task, mem, desc, use_dma_key, data_reg); |
857 | if (unlikely(err)) | 862 | if (unlikely(err)) |
858 | goto err_reg; | 863 | goto err_reg; |
859 | 864 | ||
@@ -866,7 +871,8 @@ int iser_reg_rdma_mem(struct iscsi_iser_task *task, | |||
866 | if (unlikely(err)) | 871 | if (unlikely(err)) |
867 | goto err_reg; | 872 | goto err_reg; |
868 | 873 | ||
869 | err = iser_reg_prot_sg(task, mem, desc, prot_reg); | 874 | err = iser_reg_prot_sg(task, mem, desc, |
875 | use_dma_key, prot_reg); | ||
870 | if (unlikely(err)) | 876 | if (unlikely(err)) |
871 | goto err_reg; | 877 | goto err_reg; |
872 | } | 878 | } |
diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c b/drivers/infiniband/ulp/iser/iser_verbs.c index ae70cc1463ac..85132d867bc8 100644 --- a/drivers/infiniband/ulp/iser/iser_verbs.c +++ b/drivers/infiniband/ulp/iser/iser_verbs.c | |||
@@ -133,11 +133,15 @@ static int iser_create_device_ib_res(struct iser_device *device) | |||
133 | (unsigned long)comp); | 133 | (unsigned long)comp); |
134 | } | 134 | } |
135 | 135 | ||
136 | device->mr = ib_get_dma_mr(device->pd, IB_ACCESS_LOCAL_WRITE | | 136 | if (!iser_always_reg) { |
137 | IB_ACCESS_REMOTE_WRITE | | 137 | int access = IB_ACCESS_LOCAL_WRITE | |
138 | IB_ACCESS_REMOTE_READ); | 138 | IB_ACCESS_REMOTE_WRITE | |
139 | if (IS_ERR(device->mr)) | 139 | IB_ACCESS_REMOTE_READ; |
140 | goto dma_mr_err; | 140 | |
141 | device->mr = ib_get_dma_mr(device->pd, access); | ||
142 | if (IS_ERR(device->mr)) | ||
143 | goto dma_mr_err; | ||
144 | } | ||
141 | 145 | ||
142 | INIT_IB_EVENT_HANDLER(&device->event_handler, device->ib_device, | 146 | INIT_IB_EVENT_HANDLER(&device->event_handler, device->ib_device, |
143 | iser_event_handler); | 147 | iser_event_handler); |
@@ -147,7 +151,8 @@ static int iser_create_device_ib_res(struct iser_device *device) | |||
147 | return 0; | 151 | return 0; |
148 | 152 | ||
149 | handler_err: | 153 | handler_err: |
150 | ib_dereg_mr(device->mr); | 154 | if (device->mr) |
155 | ib_dereg_mr(device->mr); | ||
151 | dma_mr_err: | 156 | dma_mr_err: |
152 | for (i = 0; i < device->comps_used; i++) | 157 | for (i = 0; i < device->comps_used; i++) |
153 | tasklet_kill(&device->comps[i].tasklet); | 158 | tasklet_kill(&device->comps[i].tasklet); |
@@ -173,7 +178,6 @@ comps_err: | |||
173 | static void iser_free_device_ib_res(struct iser_device *device) | 178 | static void iser_free_device_ib_res(struct iser_device *device) |
174 | { | 179 | { |
175 | int i; | 180 | int i; |
176 | BUG_ON(device->mr == NULL); | ||
177 | 181 | ||
178 | for (i = 0; i < device->comps_used; i++) { | 182 | for (i = 0; i < device->comps_used; i++) { |
179 | struct iser_comp *comp = &device->comps[i]; | 183 | struct iser_comp *comp = &device->comps[i]; |
@@ -184,7 +188,8 @@ static void iser_free_device_ib_res(struct iser_device *device) | |||
184 | } | 188 | } |
185 | 189 | ||
186 | (void)ib_unregister_event_handler(&device->event_handler); | 190 | (void)ib_unregister_event_handler(&device->event_handler); |
187 | (void)ib_dereg_mr(device->mr); | 191 | if (device->mr) |
192 | (void)ib_dereg_mr(device->mr); | ||
188 | ib_dealloc_pd(device->pd); | 193 | ib_dealloc_pd(device->pd); |
189 | 194 | ||
190 | kfree(device->comps); | 195 | kfree(device->comps); |
diff --git a/drivers/input/joystick/Kconfig b/drivers/input/joystick/Kconfig index 56eb471b5576..4215b5382092 100644 --- a/drivers/input/joystick/Kconfig +++ b/drivers/input/joystick/Kconfig | |||
@@ -196,6 +196,7 @@ config JOYSTICK_TWIDJOY | |||
196 | config JOYSTICK_ZHENHUA | 196 | config JOYSTICK_ZHENHUA |
197 | tristate "5-byte Zhenhua RC transmitter" | 197 | tristate "5-byte Zhenhua RC transmitter" |
198 | select SERIO | 198 | select SERIO |
199 | select BITREVERSE | ||
199 | help | 200 | help |
200 | Say Y here if you have a Zhen Hua PPM-4CH transmitter which is | 201 | Say Y here if you have a Zhen Hua PPM-4CH transmitter which is |
201 | supplied with a ready to fly micro electric indoor helicopters | 202 | supplied with a ready to fly micro electric indoor helicopters |
diff --git a/drivers/input/joystick/walkera0701.c b/drivers/input/joystick/walkera0701.c index b76ac580703c..a8bc2fe170dd 100644 --- a/drivers/input/joystick/walkera0701.c +++ b/drivers/input/joystick/walkera0701.c | |||
@@ -150,7 +150,7 @@ static void walkera0701_irq_handler(void *handler_data) | |||
150 | if (w->counter == 24) { /* full frame */ | 150 | if (w->counter == 24) { /* full frame */ |
151 | walkera0701_parse_frame(w); | 151 | walkera0701_parse_frame(w); |
152 | w->counter = NO_SYNC; | 152 | w->counter = NO_SYNC; |
153 | if (abs(pulse_time - SYNC_PULSE) < RESERVE) /* new frame sync */ | 153 | if (abs64(pulse_time - SYNC_PULSE) < RESERVE) /* new frame sync */ |
154 | w->counter = 0; | 154 | w->counter = 0; |
155 | } else { | 155 | } else { |
156 | if ((pulse_time > (ANALOG_MIN_PULSE - RESERVE) | 156 | if ((pulse_time > (ANALOG_MIN_PULSE - RESERVE) |
@@ -161,7 +161,7 @@ static void walkera0701_irq_handler(void *handler_data) | |||
161 | } else | 161 | } else |
162 | w->counter = NO_SYNC; | 162 | w->counter = NO_SYNC; |
163 | } | 163 | } |
164 | } else if (abs(pulse_time - SYNC_PULSE - BIN0_PULSE) < | 164 | } else if (abs64(pulse_time - SYNC_PULSE - BIN0_PULSE) < |
165 | RESERVE + BIN1_PULSE - BIN0_PULSE) /* frame sync .. */ | 165 | RESERVE + BIN1_PULSE - BIN0_PULSE) /* frame sync .. */ |
166 | w->counter = 0; | 166 | w->counter = 0; |
167 | 167 | ||
diff --git a/drivers/input/keyboard/omap4-keypad.c b/drivers/input/keyboard/omap4-keypad.c index b052afec9a11..6639b2b8528a 100644 --- a/drivers/input/keyboard/omap4-keypad.c +++ b/drivers/input/keyboard/omap4-keypad.c | |||
@@ -266,7 +266,7 @@ static int omap4_keypad_probe(struct platform_device *pdev) | |||
266 | 266 | ||
267 | error = omap4_keypad_parse_dt(&pdev->dev, keypad_data); | 267 | error = omap4_keypad_parse_dt(&pdev->dev, keypad_data); |
268 | if (error) | 268 | if (error) |
269 | return error; | 269 | goto err_free_keypad; |
270 | 270 | ||
271 | res = request_mem_region(res->start, resource_size(res), pdev->name); | 271 | res = request_mem_region(res->start, resource_size(res), pdev->name); |
272 | if (!res) { | 272 | if (!res) { |
diff --git a/drivers/input/misc/pm8941-pwrkey.c b/drivers/input/misc/pm8941-pwrkey.c index 867db8a91372..e317b75357a0 100644 --- a/drivers/input/misc/pm8941-pwrkey.c +++ b/drivers/input/misc/pm8941-pwrkey.c | |||
@@ -93,7 +93,7 @@ static int pm8941_reboot_notify(struct notifier_block *nb, | |||
93 | default: | 93 | default: |
94 | reset_type = PON_PS_HOLD_TYPE_HARD_RESET; | 94 | reset_type = PON_PS_HOLD_TYPE_HARD_RESET; |
95 | break; | 95 | break; |
96 | }; | 96 | } |
97 | 97 | ||
98 | error = regmap_update_bits(pwrkey->regmap, | 98 | error = regmap_update_bits(pwrkey->regmap, |
99 | pwrkey->baseaddr + PON_PS_HOLD_RST_CTL, | 99 | pwrkey->baseaddr + PON_PS_HOLD_RST_CTL, |
diff --git a/drivers/input/misc/uinput.c b/drivers/input/misc/uinput.c index 345df9b03aed..5adbcedcb81c 100644 --- a/drivers/input/misc/uinput.c +++ b/drivers/input/misc/uinput.c | |||
@@ -414,7 +414,7 @@ static int uinput_setup_device(struct uinput_device *udev, | |||
414 | dev->id.product = user_dev->id.product; | 414 | dev->id.product = user_dev->id.product; |
415 | dev->id.version = user_dev->id.version; | 415 | dev->id.version = user_dev->id.version; |
416 | 416 | ||
417 | for_each_set_bit(i, dev->absbit, ABS_CNT) { | 417 | for (i = 0; i < ABS_CNT; i++) { |
418 | input_abs_set_max(dev, i, user_dev->absmax[i]); | 418 | input_abs_set_max(dev, i, user_dev->absmax[i]); |
419 | input_abs_set_min(dev, i, user_dev->absmin[i]); | 419 | input_abs_set_min(dev, i, user_dev->absmin[i]); |
420 | input_abs_set_fuzz(dev, i, user_dev->absfuzz[i]); | 420 | input_abs_set_fuzz(dev, i, user_dev->absfuzz[i]); |
diff --git a/drivers/input/mouse/elan_i2c.h b/drivers/input/mouse/elan_i2c.h index 73670f2aebfd..c0ec26118732 100644 --- a/drivers/input/mouse/elan_i2c.h +++ b/drivers/input/mouse/elan_i2c.h | |||
@@ -60,7 +60,7 @@ struct elan_transport_ops { | |||
60 | int (*get_sm_version)(struct i2c_client *client, | 60 | int (*get_sm_version)(struct i2c_client *client, |
61 | u8* ic_type, u8 *version); | 61 | u8* ic_type, u8 *version); |
62 | int (*get_checksum)(struct i2c_client *client, bool iap, u16 *csum); | 62 | int (*get_checksum)(struct i2c_client *client, bool iap, u16 *csum); |
63 | int (*get_product_id)(struct i2c_client *client, u8 *id); | 63 | int (*get_product_id)(struct i2c_client *client, u16 *id); |
64 | 64 | ||
65 | int (*get_max)(struct i2c_client *client, | 65 | int (*get_max)(struct i2c_client *client, |
66 | unsigned int *max_x, unsigned int *max_y); | 66 | unsigned int *max_x, unsigned int *max_y); |
diff --git a/drivers/input/mouse/elan_i2c_core.c b/drivers/input/mouse/elan_i2c_core.c index fa945304b9a5..5e1665bbaa0b 100644 --- a/drivers/input/mouse/elan_i2c_core.c +++ b/drivers/input/mouse/elan_i2c_core.c | |||
@@ -40,7 +40,7 @@ | |||
40 | #include "elan_i2c.h" | 40 | #include "elan_i2c.h" |
41 | 41 | ||
42 | #define DRIVER_NAME "elan_i2c" | 42 | #define DRIVER_NAME "elan_i2c" |
43 | #define ELAN_DRIVER_VERSION "1.6.0" | 43 | #define ELAN_DRIVER_VERSION "1.6.1" |
44 | #define ETP_MAX_PRESSURE 255 | 44 | #define ETP_MAX_PRESSURE 255 |
45 | #define ETP_FWIDTH_REDUCE 90 | 45 | #define ETP_FWIDTH_REDUCE 90 |
46 | #define ETP_FINGER_WIDTH 15 | 46 | #define ETP_FINGER_WIDTH 15 |
@@ -76,7 +76,7 @@ struct elan_tp_data { | |||
76 | unsigned int x_res; | 76 | unsigned int x_res; |
77 | unsigned int y_res; | 77 | unsigned int y_res; |
78 | 78 | ||
79 | u8 product_id; | 79 | u16 product_id; |
80 | u8 fw_version; | 80 | u8 fw_version; |
81 | u8 sm_version; | 81 | u8 sm_version; |
82 | u8 iap_version; | 82 | u8 iap_version; |
@@ -98,15 +98,25 @@ static int elan_get_fwinfo(u8 iap_version, u16 *validpage_count, | |||
98 | u16 *signature_address) | 98 | u16 *signature_address) |
99 | { | 99 | { |
100 | switch (iap_version) { | 100 | switch (iap_version) { |
101 | case 0x00: | ||
102 | case 0x06: | ||
101 | case 0x08: | 103 | case 0x08: |
102 | *validpage_count = 512; | 104 | *validpage_count = 512; |
103 | break; | 105 | break; |
106 | case 0x03: | ||
107 | case 0x07: | ||
104 | case 0x09: | 108 | case 0x09: |
109 | case 0x0A: | ||
110 | case 0x0B: | ||
111 | case 0x0C: | ||
105 | *validpage_count = 768; | 112 | *validpage_count = 768; |
106 | break; | 113 | break; |
107 | case 0x0D: | 114 | case 0x0D: |
108 | *validpage_count = 896; | 115 | *validpage_count = 896; |
109 | break; | 116 | break; |
117 | case 0x0E: | ||
118 | *validpage_count = 640; | ||
119 | break; | ||
110 | default: | 120 | default: |
111 | /* unknown ic type clear value */ | 121 | /* unknown ic type clear value */ |
112 | *validpage_count = 0; | 122 | *validpage_count = 0; |
@@ -266,11 +276,10 @@ static int elan_query_device_info(struct elan_tp_data *data) | |||
266 | 276 | ||
267 | error = elan_get_fwinfo(data->iap_version, &data->fw_validpage_count, | 277 | error = elan_get_fwinfo(data->iap_version, &data->fw_validpage_count, |
268 | &data->fw_signature_address); | 278 | &data->fw_signature_address); |
269 | if (error) { | 279 | if (error) |
270 | dev_err(&data->client->dev, | 280 | dev_warn(&data->client->dev, |
271 | "unknown iap version %d\n", data->iap_version); | 281 | "unexpected iap version %#04x (ic type: %#04x), firmware update will not work\n", |
272 | return error; | 282 | data->iap_version, data->ic_type); |
273 | } | ||
274 | 283 | ||
275 | return 0; | 284 | return 0; |
276 | } | 285 | } |
@@ -486,6 +495,9 @@ static ssize_t elan_sysfs_update_fw(struct device *dev, | |||
486 | const u8 *fw_signature; | 495 | const u8 *fw_signature; |
487 | static const u8 signature[] = {0xAA, 0x55, 0xCC, 0x33, 0xFF, 0xFF}; | 496 | static const u8 signature[] = {0xAA, 0x55, 0xCC, 0x33, 0xFF, 0xFF}; |
488 | 497 | ||
498 | if (data->fw_validpage_count == 0) | ||
499 | return -EINVAL; | ||
500 | |||
489 | /* Look for a firmware with the product id appended. */ | 501 | /* Look for a firmware with the product id appended. */ |
490 | fw_name = kasprintf(GFP_KERNEL, ETP_FW_NAME, data->product_id); | 502 | fw_name = kasprintf(GFP_KERNEL, ETP_FW_NAME, data->product_id); |
491 | if (!fw_name) { | 503 | if (!fw_name) { |
diff --git a/drivers/input/mouse/elan_i2c_i2c.c b/drivers/input/mouse/elan_i2c_i2c.c index 683c840c9dd7..a679e56c44cd 100644 --- a/drivers/input/mouse/elan_i2c_i2c.c +++ b/drivers/input/mouse/elan_i2c_i2c.c | |||
@@ -276,7 +276,7 @@ static int elan_i2c_get_sm_version(struct i2c_client *client, | |||
276 | return 0; | 276 | return 0; |
277 | } | 277 | } |
278 | 278 | ||
279 | static int elan_i2c_get_product_id(struct i2c_client *client, u8 *id) | 279 | static int elan_i2c_get_product_id(struct i2c_client *client, u16 *id) |
280 | { | 280 | { |
281 | int error; | 281 | int error; |
282 | u8 val[3]; | 282 | u8 val[3]; |
@@ -287,7 +287,7 @@ static int elan_i2c_get_product_id(struct i2c_client *client, u8 *id) | |||
287 | return error; | 287 | return error; |
288 | } | 288 | } |
289 | 289 | ||
290 | *id = val[0]; | 290 | *id = le16_to_cpup((__le16 *)val); |
291 | return 0; | 291 | return 0; |
292 | } | 292 | } |
293 | 293 | ||
diff --git a/drivers/input/mouse/elan_i2c_smbus.c b/drivers/input/mouse/elan_i2c_smbus.c index ff36a366b2aa..cb6aecbc1dc2 100644 --- a/drivers/input/mouse/elan_i2c_smbus.c +++ b/drivers/input/mouse/elan_i2c_smbus.c | |||
@@ -183,7 +183,7 @@ static int elan_smbus_get_sm_version(struct i2c_client *client, | |||
183 | return 0; | 183 | return 0; |
184 | } | 184 | } |
185 | 185 | ||
186 | static int elan_smbus_get_product_id(struct i2c_client *client, u8 *id) | 186 | static int elan_smbus_get_product_id(struct i2c_client *client, u16 *id) |
187 | { | 187 | { |
188 | int error; | 188 | int error; |
189 | u8 val[3]; | 189 | u8 val[3]; |
@@ -195,7 +195,7 @@ static int elan_smbus_get_product_id(struct i2c_client *client, u8 *id) | |||
195 | return error; | 195 | return error; |
196 | } | 196 | } |
197 | 197 | ||
198 | *id = val[1]; | 198 | *id = be16_to_cpup((__be16 *)val); |
199 | return 0; | 199 | return 0; |
200 | } | 200 | } |
201 | 201 | ||
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c index 994ae7886156..6025eb430c0a 100644 --- a/drivers/input/mouse/synaptics.c +++ b/drivers/input/mouse/synaptics.c | |||
@@ -519,18 +519,14 @@ static int synaptics_set_mode(struct psmouse *psmouse) | |||
519 | struct synaptics_data *priv = psmouse->private; | 519 | struct synaptics_data *priv = psmouse->private; |
520 | 520 | ||
521 | priv->mode = 0; | 521 | priv->mode = 0; |
522 | 522 | if (priv->absolute_mode) | |
523 | if (priv->absolute_mode) { | ||
524 | priv->mode |= SYN_BIT_ABSOLUTE_MODE; | 523 | priv->mode |= SYN_BIT_ABSOLUTE_MODE; |
525 | if (SYN_CAP_EXTENDED(priv->capabilities)) | 524 | if (priv->disable_gesture) |
526 | priv->mode |= SYN_BIT_W_MODE; | ||
527 | } | ||
528 | |||
529 | if (!SYN_MODE_WMODE(priv->mode) && priv->disable_gesture) | ||
530 | priv->mode |= SYN_BIT_DISABLE_GESTURE; | 525 | priv->mode |= SYN_BIT_DISABLE_GESTURE; |
531 | |||
532 | if (psmouse->rate >= 80) | 526 | if (psmouse->rate >= 80) |
533 | priv->mode |= SYN_BIT_HIGH_RATE; | 527 | priv->mode |= SYN_BIT_HIGH_RATE; |
528 | if (SYN_CAP_EXTENDED(priv->capabilities)) | ||
529 | priv->mode |= SYN_BIT_W_MODE; | ||
534 | 530 | ||
535 | if (synaptics_mode_cmd(psmouse, priv->mode)) | 531 | if (synaptics_mode_cmd(psmouse, priv->mode)) |
536 | return -1; | 532 | return -1; |
diff --git a/drivers/input/serio/libps2.c b/drivers/input/serio/libps2.c index 75516996db20..316f2c897101 100644 --- a/drivers/input/serio/libps2.c +++ b/drivers/input/serio/libps2.c | |||
@@ -212,12 +212,17 @@ int __ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command) | |||
212 | * time before the ACK arrives. | 212 | * time before the ACK arrives. |
213 | */ | 213 | */ |
214 | if (ps2_sendbyte(ps2dev, command & 0xff, | 214 | if (ps2_sendbyte(ps2dev, command & 0xff, |
215 | command == PS2_CMD_RESET_BAT ? 1000 : 200)) | 215 | command == PS2_CMD_RESET_BAT ? 1000 : 200)) { |
216 | goto out; | 216 | serio_pause_rx(ps2dev->serio); |
217 | goto out_reset_flags; | ||
218 | } | ||
217 | 219 | ||
218 | for (i = 0; i < send; i++) | 220 | for (i = 0; i < send; i++) { |
219 | if (ps2_sendbyte(ps2dev, param[i], 200)) | 221 | if (ps2_sendbyte(ps2dev, param[i], 200)) { |
220 | goto out; | 222 | serio_pause_rx(ps2dev->serio); |
223 | goto out_reset_flags; | ||
224 | } | ||
225 | } | ||
221 | 226 | ||
222 | /* | 227 | /* |
223 | * The reset command takes a long time to execute. | 228 | * The reset command takes a long time to execute. |
@@ -234,17 +239,18 @@ int __ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command) | |||
234 | !(ps2dev->flags & PS2_FLAG_CMD), timeout); | 239 | !(ps2dev->flags & PS2_FLAG_CMD), timeout); |
235 | } | 240 | } |
236 | 241 | ||
242 | serio_pause_rx(ps2dev->serio); | ||
243 | |||
237 | if (param) | 244 | if (param) |
238 | for (i = 0; i < receive; i++) | 245 | for (i = 0; i < receive; i++) |
239 | param[i] = ps2dev->cmdbuf[(receive - 1) - i]; | 246 | param[i] = ps2dev->cmdbuf[(receive - 1) - i]; |
240 | 247 | ||
241 | if (ps2dev->cmdcnt && (command != PS2_CMD_RESET_BAT || ps2dev->cmdcnt != 1)) | 248 | if (ps2dev->cmdcnt && (command != PS2_CMD_RESET_BAT || ps2dev->cmdcnt != 1)) |
242 | goto out; | 249 | goto out_reset_flags; |
243 | 250 | ||
244 | rc = 0; | 251 | rc = 0; |
245 | 252 | ||
246 | out: | 253 | out_reset_flags: |
247 | serio_pause_rx(ps2dev->serio); | ||
248 | ps2dev->flags = 0; | 254 | ps2dev->flags = 0; |
249 | serio_continue_rx(ps2dev->serio); | 255 | serio_continue_rx(ps2dev->serio); |
250 | 256 | ||
diff --git a/drivers/input/serio/parkbd.c b/drivers/input/serio/parkbd.c index 26b45936f9fd..1e8cd6f1fe9e 100644 --- a/drivers/input/serio/parkbd.c +++ b/drivers/input/serio/parkbd.c | |||
@@ -194,6 +194,7 @@ static int __init parkbd_init(void) | |||
194 | parkbd_port = parkbd_allocate_serio(); | 194 | parkbd_port = parkbd_allocate_serio(); |
195 | if (!parkbd_port) { | 195 | if (!parkbd_port) { |
196 | parport_release(parkbd_dev); | 196 | parport_release(parkbd_dev); |
197 | parport_unregister_device(parkbd_dev); | ||
197 | return -ENOMEM; | 198 | return -ENOMEM; |
198 | } | 199 | } |
199 | 200 | ||
diff --git a/drivers/input/touchscreen/imx6ul_tsc.c b/drivers/input/touchscreen/imx6ul_tsc.c index ff0b75813daa..8275267eac25 100644 --- a/drivers/input/touchscreen/imx6ul_tsc.c +++ b/drivers/input/touchscreen/imx6ul_tsc.c | |||
@@ -94,7 +94,7 @@ struct imx6ul_tsc { | |||
94 | * TSC module need ADC to get the measure value. So | 94 | * TSC module need ADC to get the measure value. So |
95 | * before config TSC, we should initialize ADC module. | 95 | * before config TSC, we should initialize ADC module. |
96 | */ | 96 | */ |
97 | static void imx6ul_adc_init(struct imx6ul_tsc *tsc) | 97 | static int imx6ul_adc_init(struct imx6ul_tsc *tsc) |
98 | { | 98 | { |
99 | int adc_hc = 0; | 99 | int adc_hc = 0; |
100 | int adc_gc; | 100 | int adc_gc; |
@@ -122,17 +122,23 @@ static void imx6ul_adc_init(struct imx6ul_tsc *tsc) | |||
122 | 122 | ||
123 | timeout = wait_for_completion_timeout | 123 | timeout = wait_for_completion_timeout |
124 | (&tsc->completion, ADC_TIMEOUT); | 124 | (&tsc->completion, ADC_TIMEOUT); |
125 | if (timeout == 0) | 125 | if (timeout == 0) { |
126 | dev_err(tsc->dev, "Timeout for adc calibration\n"); | 126 | dev_err(tsc->dev, "Timeout for adc calibration\n"); |
127 | return -ETIMEDOUT; | ||
128 | } | ||
127 | 129 | ||
128 | adc_gs = readl(tsc->adc_regs + REG_ADC_GS); | 130 | adc_gs = readl(tsc->adc_regs + REG_ADC_GS); |
129 | if (adc_gs & ADC_CALF) | 131 | if (adc_gs & ADC_CALF) { |
130 | dev_err(tsc->dev, "ADC calibration failed\n"); | 132 | dev_err(tsc->dev, "ADC calibration failed\n"); |
133 | return -EINVAL; | ||
134 | } | ||
131 | 135 | ||
132 | /* TSC need the ADC work in hardware trigger */ | 136 | /* TSC need the ADC work in hardware trigger */ |
133 | adc_cfg = readl(tsc->adc_regs + REG_ADC_CFG); | 137 | adc_cfg = readl(tsc->adc_regs + REG_ADC_CFG); |
134 | adc_cfg |= ADC_HARDWARE_TRIGGER; | 138 | adc_cfg |= ADC_HARDWARE_TRIGGER; |
135 | writel(adc_cfg, tsc->adc_regs + REG_ADC_CFG); | 139 | writel(adc_cfg, tsc->adc_regs + REG_ADC_CFG); |
140 | |||
141 | return 0; | ||
136 | } | 142 | } |
137 | 143 | ||
138 | /* | 144 | /* |
@@ -188,11 +194,17 @@ static void imx6ul_tsc_set(struct imx6ul_tsc *tsc) | |||
188 | writel(start, tsc->tsc_regs + REG_TSC_FLOW_CONTROL); | 194 | writel(start, tsc->tsc_regs + REG_TSC_FLOW_CONTROL); |
189 | } | 195 | } |
190 | 196 | ||
191 | static void imx6ul_tsc_init(struct imx6ul_tsc *tsc) | 197 | static int imx6ul_tsc_init(struct imx6ul_tsc *tsc) |
192 | { | 198 | { |
193 | imx6ul_adc_init(tsc); | 199 | int err; |
200 | |||
201 | err = imx6ul_adc_init(tsc); | ||
202 | if (err) | ||
203 | return err; | ||
194 | imx6ul_tsc_channel_config(tsc); | 204 | imx6ul_tsc_channel_config(tsc); |
195 | imx6ul_tsc_set(tsc); | 205 | imx6ul_tsc_set(tsc); |
206 | |||
207 | return 0; | ||
196 | } | 208 | } |
197 | 209 | ||
198 | static void imx6ul_tsc_disable(struct imx6ul_tsc *tsc) | 210 | static void imx6ul_tsc_disable(struct imx6ul_tsc *tsc) |
@@ -311,9 +323,7 @@ static int imx6ul_tsc_open(struct input_dev *input_dev) | |||
311 | return err; | 323 | return err; |
312 | } | 324 | } |
313 | 325 | ||
314 | imx6ul_tsc_init(tsc); | 326 | return imx6ul_tsc_init(tsc); |
315 | |||
316 | return 0; | ||
317 | } | 327 | } |
318 | 328 | ||
319 | static void imx6ul_tsc_close(struct input_dev *input_dev) | 329 | static void imx6ul_tsc_close(struct input_dev *input_dev) |
@@ -337,7 +347,7 @@ static int imx6ul_tsc_probe(struct platform_device *pdev) | |||
337 | int tsc_irq; | 347 | int tsc_irq; |
338 | int adc_irq; | 348 | int adc_irq; |
339 | 349 | ||
340 | tsc = devm_kzalloc(&pdev->dev, sizeof(struct imx6ul_tsc), GFP_KERNEL); | 350 | tsc = devm_kzalloc(&pdev->dev, sizeof(*tsc), GFP_KERNEL); |
341 | if (!tsc) | 351 | if (!tsc) |
342 | return -ENOMEM; | 352 | return -ENOMEM; |
343 | 353 | ||
@@ -345,7 +355,7 @@ static int imx6ul_tsc_probe(struct platform_device *pdev) | |||
345 | if (!input_dev) | 355 | if (!input_dev) |
346 | return -ENOMEM; | 356 | return -ENOMEM; |
347 | 357 | ||
348 | input_dev->name = "iMX6UL TouchScreen Controller"; | 358 | input_dev->name = "iMX6UL Touchscreen Controller"; |
349 | input_dev->id.bustype = BUS_HOST; | 359 | input_dev->id.bustype = BUS_HOST; |
350 | 360 | ||
351 | input_dev->open = imx6ul_tsc_open; | 361 | input_dev->open = imx6ul_tsc_open; |
@@ -406,7 +416,7 @@ static int imx6ul_tsc_probe(struct platform_device *pdev) | |||
406 | } | 416 | } |
407 | 417 | ||
408 | adc_irq = platform_get_irq(pdev, 1); | 418 | adc_irq = platform_get_irq(pdev, 1); |
409 | if (adc_irq <= 0) { | 419 | if (adc_irq < 0) { |
410 | dev_err(&pdev->dev, "no adc irq resource?\n"); | 420 | dev_err(&pdev->dev, "no adc irq resource?\n"); |
411 | return adc_irq; | 421 | return adc_irq; |
412 | } | 422 | } |
@@ -491,7 +501,7 @@ static int __maybe_unused imx6ul_tsc_resume(struct device *dev) | |||
491 | goto out; | 501 | goto out; |
492 | } | 502 | } |
493 | 503 | ||
494 | imx6ul_tsc_init(tsc); | 504 | retval = imx6ul_tsc_init(tsc); |
495 | } | 505 | } |
496 | 506 | ||
497 | out: | 507 | out: |
diff --git a/drivers/input/touchscreen/mms114.c b/drivers/input/touchscreen/mms114.c index 7cce87650fc8..1fafc9f57af6 100644 --- a/drivers/input/touchscreen/mms114.c +++ b/drivers/input/touchscreen/mms114.c | |||
@@ -394,12 +394,12 @@ static struct mms114_platform_data *mms114_parse_dt(struct device *dev) | |||
394 | if (of_property_read_u32(np, "x-size", &pdata->x_size)) { | 394 | if (of_property_read_u32(np, "x-size", &pdata->x_size)) { |
395 | dev_err(dev, "failed to get x-size property\n"); | 395 | dev_err(dev, "failed to get x-size property\n"); |
396 | return NULL; | 396 | return NULL; |
397 | }; | 397 | } |
398 | 398 | ||
399 | if (of_property_read_u32(np, "y-size", &pdata->y_size)) { | 399 | if (of_property_read_u32(np, "y-size", &pdata->y_size)) { |
400 | dev_err(dev, "failed to get y-size property\n"); | 400 | dev_err(dev, "failed to get y-size property\n"); |
401 | return NULL; | 401 | return NULL; |
402 | }; | 402 | } |
403 | 403 | ||
404 | of_property_read_u32(np, "contact-threshold", | 404 | of_property_read_u32(np, "contact-threshold", |
405 | &pdata->contact_threshold); | 405 | &pdata->contact_threshold); |
diff --git a/drivers/iommu/Kconfig b/drivers/iommu/Kconfig index 4664c2a96c67..d9da766719c8 100644 --- a/drivers/iommu/Kconfig +++ b/drivers/iommu/Kconfig | |||
@@ -43,7 +43,7 @@ config IOMMU_IO_PGTABLE_LPAE_SELFTEST | |||
43 | endmenu | 43 | endmenu |
44 | 44 | ||
45 | config IOMMU_IOVA | 45 | config IOMMU_IOVA |
46 | bool | 46 | tristate |
47 | 47 | ||
48 | config OF_IOMMU | 48 | config OF_IOMMU |
49 | def_bool y | 49 | def_bool y |
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index 2d7349a3ee14..041bc1810a86 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c | |||
@@ -3215,6 +3215,8 @@ static struct iova *intel_alloc_iova(struct device *dev, | |||
3215 | 3215 | ||
3216 | /* Restrict dma_mask to the width that the iommu can handle */ | 3216 | /* Restrict dma_mask to the width that the iommu can handle */ |
3217 | dma_mask = min_t(uint64_t, DOMAIN_MAX_ADDR(domain->gaw), dma_mask); | 3217 | dma_mask = min_t(uint64_t, DOMAIN_MAX_ADDR(domain->gaw), dma_mask); |
3218 | /* Ensure we reserve the whole size-aligned region */ | ||
3219 | nrpages = __roundup_pow_of_two(nrpages); | ||
3218 | 3220 | ||
3219 | if (!dmar_forcedac && dma_mask > DMA_BIT_MASK(32)) { | 3221 | if (!dmar_forcedac && dma_mask > DMA_BIT_MASK(32)) { |
3220 | /* | 3222 | /* |
@@ -3711,7 +3713,7 @@ static inline int iommu_devinfo_cache_init(void) | |||
3711 | static int __init iommu_init_mempool(void) | 3713 | static int __init iommu_init_mempool(void) |
3712 | { | 3714 | { |
3713 | int ret; | 3715 | int ret; |
3714 | ret = iommu_iova_cache_init(); | 3716 | ret = iova_cache_get(); |
3715 | if (ret) | 3717 | if (ret) |
3716 | return ret; | 3718 | return ret; |
3717 | 3719 | ||
@@ -3725,7 +3727,7 @@ static int __init iommu_init_mempool(void) | |||
3725 | 3727 | ||
3726 | kmem_cache_destroy(iommu_domain_cache); | 3728 | kmem_cache_destroy(iommu_domain_cache); |
3727 | domain_error: | 3729 | domain_error: |
3728 | iommu_iova_cache_destroy(); | 3730 | iova_cache_put(); |
3729 | 3731 | ||
3730 | return -ENOMEM; | 3732 | return -ENOMEM; |
3731 | } | 3733 | } |
@@ -3734,7 +3736,7 @@ static void __init iommu_exit_mempool(void) | |||
3734 | { | 3736 | { |
3735 | kmem_cache_destroy(iommu_devinfo_cache); | 3737 | kmem_cache_destroy(iommu_devinfo_cache); |
3736 | kmem_cache_destroy(iommu_domain_cache); | 3738 | kmem_cache_destroy(iommu_domain_cache); |
3737 | iommu_iova_cache_destroy(); | 3739 | iova_cache_put(); |
3738 | } | 3740 | } |
3739 | 3741 | ||
3740 | static void quirk_ioat_snb_local_iommu(struct pci_dev *pdev) | 3742 | static void quirk_ioat_snb_local_iommu(struct pci_dev *pdev) |
diff --git a/drivers/iommu/iova.c b/drivers/iommu/iova.c index b7c3d923f3e1..fa0adef32bd6 100644 --- a/drivers/iommu/iova.c +++ b/drivers/iommu/iova.c | |||
@@ -18,42 +18,9 @@ | |||
18 | */ | 18 | */ |
19 | 19 | ||
20 | #include <linux/iova.h> | 20 | #include <linux/iova.h> |
21 | #include <linux/module.h> | ||
21 | #include <linux/slab.h> | 22 | #include <linux/slab.h> |
22 | 23 | ||
23 | static struct kmem_cache *iommu_iova_cache; | ||
24 | |||
25 | int iommu_iova_cache_init(void) | ||
26 | { | ||
27 | int ret = 0; | ||
28 | |||
29 | iommu_iova_cache = kmem_cache_create("iommu_iova", | ||
30 | sizeof(struct iova), | ||
31 | 0, | ||
32 | SLAB_HWCACHE_ALIGN, | ||
33 | NULL); | ||
34 | if (!iommu_iova_cache) { | ||
35 | pr_err("Couldn't create iova cache\n"); | ||
36 | ret = -ENOMEM; | ||
37 | } | ||
38 | |||
39 | return ret; | ||
40 | } | ||
41 | |||
42 | void iommu_iova_cache_destroy(void) | ||
43 | { | ||
44 | kmem_cache_destroy(iommu_iova_cache); | ||
45 | } | ||
46 | |||
47 | struct iova *alloc_iova_mem(void) | ||
48 | { | ||
49 | return kmem_cache_alloc(iommu_iova_cache, GFP_ATOMIC); | ||
50 | } | ||
51 | |||
52 | void free_iova_mem(struct iova *iova) | ||
53 | { | ||
54 | kmem_cache_free(iommu_iova_cache, iova); | ||
55 | } | ||
56 | |||
57 | void | 24 | void |
58 | init_iova_domain(struct iova_domain *iovad, unsigned long granule, | 25 | init_iova_domain(struct iova_domain *iovad, unsigned long granule, |
59 | unsigned long start_pfn, unsigned long pfn_32bit) | 26 | unsigned long start_pfn, unsigned long pfn_32bit) |
@@ -72,6 +39,7 @@ init_iova_domain(struct iova_domain *iovad, unsigned long granule, | |||
72 | iovad->start_pfn = start_pfn; | 39 | iovad->start_pfn = start_pfn; |
73 | iovad->dma_32bit_pfn = pfn_32bit; | 40 | iovad->dma_32bit_pfn = pfn_32bit; |
74 | } | 41 | } |
42 | EXPORT_SYMBOL_GPL(init_iova_domain); | ||
75 | 43 | ||
76 | static struct rb_node * | 44 | static struct rb_node * |
77 | __get_cached_rbnode(struct iova_domain *iovad, unsigned long *limit_pfn) | 45 | __get_cached_rbnode(struct iova_domain *iovad, unsigned long *limit_pfn) |
@@ -120,19 +88,14 @@ __cached_rbnode_delete_update(struct iova_domain *iovad, struct iova *free) | |||
120 | } | 88 | } |
121 | } | 89 | } |
122 | 90 | ||
123 | /* Computes the padding size required, to make the | 91 | /* |
124 | * the start address naturally aligned on its size | 92 | * Computes the padding size required, to make the start address |
93 | * naturally aligned on the power-of-two order of its size | ||
125 | */ | 94 | */ |
126 | static int | 95 | static unsigned int |
127 | iova_get_pad_size(int size, unsigned int limit_pfn) | 96 | iova_get_pad_size(unsigned int size, unsigned int limit_pfn) |
128 | { | 97 | { |
129 | unsigned int pad_size = 0; | 98 | return (limit_pfn + 1 - size) & (__roundup_pow_of_two(size) - 1); |
130 | unsigned int order = ilog2(size); | ||
131 | |||
132 | if (order) | ||
133 | pad_size = (limit_pfn + 1) % (1 << order); | ||
134 | |||
135 | return pad_size; | ||
136 | } | 99 | } |
137 | 100 | ||
138 | static int __alloc_and_insert_iova_range(struct iova_domain *iovad, | 101 | static int __alloc_and_insert_iova_range(struct iova_domain *iovad, |
@@ -242,6 +205,57 @@ iova_insert_rbtree(struct rb_root *root, struct iova *iova) | |||
242 | rb_insert_color(&iova->node, root); | 205 | rb_insert_color(&iova->node, root); |
243 | } | 206 | } |
244 | 207 | ||
208 | static struct kmem_cache *iova_cache; | ||
209 | static unsigned int iova_cache_users; | ||
210 | static DEFINE_MUTEX(iova_cache_mutex); | ||
211 | |||
212 | struct iova *alloc_iova_mem(void) | ||
213 | { | ||
214 | return kmem_cache_alloc(iova_cache, GFP_ATOMIC); | ||
215 | } | ||
216 | EXPORT_SYMBOL(alloc_iova_mem); | ||
217 | |||
218 | void free_iova_mem(struct iova *iova) | ||
219 | { | ||
220 | kmem_cache_free(iova_cache, iova); | ||
221 | } | ||
222 | EXPORT_SYMBOL(free_iova_mem); | ||
223 | |||
224 | int iova_cache_get(void) | ||
225 | { | ||
226 | mutex_lock(&iova_cache_mutex); | ||
227 | if (!iova_cache_users) { | ||
228 | iova_cache = kmem_cache_create( | ||
229 | "iommu_iova", sizeof(struct iova), 0, | ||
230 | SLAB_HWCACHE_ALIGN, NULL); | ||
231 | if (!iova_cache) { | ||
232 | mutex_unlock(&iova_cache_mutex); | ||
233 | printk(KERN_ERR "Couldn't create iova cache\n"); | ||
234 | return -ENOMEM; | ||
235 | } | ||
236 | } | ||
237 | |||
238 | iova_cache_users++; | ||
239 | mutex_unlock(&iova_cache_mutex); | ||
240 | |||
241 | return 0; | ||
242 | } | ||
243 | EXPORT_SYMBOL_GPL(iova_cache_get); | ||
244 | |||
245 | void iova_cache_put(void) | ||
246 | { | ||
247 | mutex_lock(&iova_cache_mutex); | ||
248 | if (WARN_ON(!iova_cache_users)) { | ||
249 | mutex_unlock(&iova_cache_mutex); | ||
250 | return; | ||
251 | } | ||
252 | iova_cache_users--; | ||
253 | if (!iova_cache_users) | ||
254 | kmem_cache_destroy(iova_cache); | ||
255 | mutex_unlock(&iova_cache_mutex); | ||
256 | } | ||
257 | EXPORT_SYMBOL_GPL(iova_cache_put); | ||
258 | |||
245 | /** | 259 | /** |
246 | * alloc_iova - allocates an iova | 260 | * alloc_iova - allocates an iova |
247 | * @iovad: - iova domain in question | 261 | * @iovad: - iova domain in question |
@@ -265,12 +279,6 @@ alloc_iova(struct iova_domain *iovad, unsigned long size, | |||
265 | if (!new_iova) | 279 | if (!new_iova) |
266 | return NULL; | 280 | return NULL; |
267 | 281 | ||
268 | /* If size aligned is set then round the size to | ||
269 | * to next power of two. | ||
270 | */ | ||
271 | if (size_aligned) | ||
272 | size = __roundup_pow_of_two(size); | ||
273 | |||
274 | ret = __alloc_and_insert_iova_range(iovad, size, limit_pfn, | 282 | ret = __alloc_and_insert_iova_range(iovad, size, limit_pfn, |
275 | new_iova, size_aligned); | 283 | new_iova, size_aligned); |
276 | 284 | ||
@@ -281,6 +289,7 @@ alloc_iova(struct iova_domain *iovad, unsigned long size, | |||
281 | 289 | ||
282 | return new_iova; | 290 | return new_iova; |
283 | } | 291 | } |
292 | EXPORT_SYMBOL_GPL(alloc_iova); | ||
284 | 293 | ||
285 | /** | 294 | /** |
286 | * find_iova - find's an iova for a given pfn | 295 | * find_iova - find's an iova for a given pfn |
@@ -321,6 +330,7 @@ struct iova *find_iova(struct iova_domain *iovad, unsigned long pfn) | |||
321 | spin_unlock_irqrestore(&iovad->iova_rbtree_lock, flags); | 330 | spin_unlock_irqrestore(&iovad->iova_rbtree_lock, flags); |
322 | return NULL; | 331 | return NULL; |
323 | } | 332 | } |
333 | EXPORT_SYMBOL_GPL(find_iova); | ||
324 | 334 | ||
325 | /** | 335 | /** |
326 | * __free_iova - frees the given iova | 336 | * __free_iova - frees the given iova |
@@ -339,6 +349,7 @@ __free_iova(struct iova_domain *iovad, struct iova *iova) | |||
339 | spin_unlock_irqrestore(&iovad->iova_rbtree_lock, flags); | 349 | spin_unlock_irqrestore(&iovad->iova_rbtree_lock, flags); |
340 | free_iova_mem(iova); | 350 | free_iova_mem(iova); |
341 | } | 351 | } |
352 | EXPORT_SYMBOL_GPL(__free_iova); | ||
342 | 353 | ||
343 | /** | 354 | /** |
344 | * free_iova - finds and frees the iova for a given pfn | 355 | * free_iova - finds and frees the iova for a given pfn |
@@ -356,6 +367,7 @@ free_iova(struct iova_domain *iovad, unsigned long pfn) | |||
356 | __free_iova(iovad, iova); | 367 | __free_iova(iovad, iova); |
357 | 368 | ||
358 | } | 369 | } |
370 | EXPORT_SYMBOL_GPL(free_iova); | ||
359 | 371 | ||
360 | /** | 372 | /** |
361 | * put_iova_domain - destroys the iova doamin | 373 | * put_iova_domain - destroys the iova doamin |
@@ -378,6 +390,7 @@ void put_iova_domain(struct iova_domain *iovad) | |||
378 | } | 390 | } |
379 | spin_unlock_irqrestore(&iovad->iova_rbtree_lock, flags); | 391 | spin_unlock_irqrestore(&iovad->iova_rbtree_lock, flags); |
380 | } | 392 | } |
393 | EXPORT_SYMBOL_GPL(put_iova_domain); | ||
381 | 394 | ||
382 | static int | 395 | static int |
383 | __is_range_overlap(struct rb_node *node, | 396 | __is_range_overlap(struct rb_node *node, |
@@ -467,6 +480,7 @@ finish: | |||
467 | spin_unlock_irqrestore(&iovad->iova_rbtree_lock, flags); | 480 | spin_unlock_irqrestore(&iovad->iova_rbtree_lock, flags); |
468 | return iova; | 481 | return iova; |
469 | } | 482 | } |
483 | EXPORT_SYMBOL_GPL(reserve_iova); | ||
470 | 484 | ||
471 | /** | 485 | /** |
472 | * copy_reserved_iova - copies the reserved between domains | 486 | * copy_reserved_iova - copies the reserved between domains |
@@ -493,6 +507,7 @@ copy_reserved_iova(struct iova_domain *from, struct iova_domain *to) | |||
493 | } | 507 | } |
494 | spin_unlock_irqrestore(&from->iova_rbtree_lock, flags); | 508 | spin_unlock_irqrestore(&from->iova_rbtree_lock, flags); |
495 | } | 509 | } |
510 | EXPORT_SYMBOL_GPL(copy_reserved_iova); | ||
496 | 511 | ||
497 | struct iova * | 512 | struct iova * |
498 | split_and_remove_iova(struct iova_domain *iovad, struct iova *iova, | 513 | split_and_remove_iova(struct iova_domain *iovad, struct iova *iova, |
@@ -534,3 +549,6 @@ error: | |||
534 | free_iova_mem(prev); | 549 | free_iova_mem(prev); |
535 | return NULL; | 550 | return NULL; |
536 | } | 551 | } |
552 | |||
553 | MODULE_AUTHOR("Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>"); | ||
554 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/irqchip/irq-gic-v3-its-pci-msi.c b/drivers/irqchip/irq-gic-v3-its-pci-msi.c index cf351c637464..a7c8c9ffbafd 100644 --- a/drivers/irqchip/irq-gic-v3-its-pci-msi.c +++ b/drivers/irqchip/irq-gic-v3-its-pci-msi.c | |||
@@ -62,7 +62,7 @@ static int its_get_pci_alias(struct pci_dev *pdev, u16 alias, void *data) | |||
62 | 62 | ||
63 | dev_alias->dev_id = alias; | 63 | dev_alias->dev_id = alias; |
64 | if (pdev != dev_alias->pdev) | 64 | if (pdev != dev_alias->pdev) |
65 | dev_alias->count += its_pci_msi_vec_count(dev_alias->pdev); | 65 | dev_alias->count += its_pci_msi_vec_count(pdev); |
66 | 66 | ||
67 | return 0; | 67 | return 0; |
68 | } | 68 | } |
diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c index ac7ae2b3cb83..25ceae9f7348 100644 --- a/drivers/irqchip/irq-gic-v3-its.c +++ b/drivers/irqchip/irq-gic-v3-its.c | |||
@@ -719,6 +719,9 @@ static unsigned long *its_lpi_alloc_chunks(int nr_irqs, int *base, int *nr_ids) | |||
719 | out: | 719 | out: |
720 | spin_unlock(&lpi_lock); | 720 | spin_unlock(&lpi_lock); |
721 | 721 | ||
722 | if (!bitmap) | ||
723 | *base = *nr_ids = 0; | ||
724 | |||
722 | return bitmap; | 725 | return bitmap; |
723 | } | 726 | } |
724 | 727 | ||
diff --git a/drivers/irqchip/irq-mips-gic.c b/drivers/irqchip/irq-mips-gic.c index af2f16bb8a94..aeaa061f0dbf 100644 --- a/drivers/irqchip/irq-mips-gic.c +++ b/drivers/irqchip/irq-mips-gic.c | |||
@@ -320,6 +320,14 @@ static void gic_handle_shared_int(bool chained) | |||
320 | intrmask[i] = gic_read(intrmask_reg); | 320 | intrmask[i] = gic_read(intrmask_reg); |
321 | pending_reg += gic_reg_step; | 321 | pending_reg += gic_reg_step; |
322 | intrmask_reg += gic_reg_step; | 322 | intrmask_reg += gic_reg_step; |
323 | |||
324 | if (!config_enabled(CONFIG_64BIT) || mips_cm_is64) | ||
325 | continue; | ||
326 | |||
327 | pending[i] |= (u64)gic_read(pending_reg) << 32; | ||
328 | intrmask[i] |= (u64)gic_read(intrmask_reg) << 32; | ||
329 | pending_reg += gic_reg_step; | ||
330 | intrmask_reg += gic_reg_step; | ||
323 | } | 331 | } |
324 | 332 | ||
325 | bitmap_and(pending, pending, intrmask, gic_shared_intrs); | 333 | bitmap_and(pending, pending, intrmask, gic_shared_intrs); |
@@ -426,7 +434,7 @@ static int gic_set_affinity(struct irq_data *d, const struct cpumask *cpumask, | |||
426 | spin_lock_irqsave(&gic_lock, flags); | 434 | spin_lock_irqsave(&gic_lock, flags); |
427 | 435 | ||
428 | /* Re-route this IRQ */ | 436 | /* Re-route this IRQ */ |
429 | gic_map_to_vpe(irq, cpumask_first(&tmp)); | 437 | gic_map_to_vpe(irq, mips_cm_vp_id(cpumask_first(&tmp))); |
430 | 438 | ||
431 | /* Update the pcpu_masks */ | 439 | /* Update the pcpu_masks */ |
432 | for (i = 0; i < NR_CPUS; i++) | 440 | for (i = 0; i < NR_CPUS; i++) |
@@ -599,7 +607,7 @@ static __init void gic_ipi_init_one(unsigned int intr, int cpu, | |||
599 | GIC_SHARED_TO_HWIRQ(intr)); | 607 | GIC_SHARED_TO_HWIRQ(intr)); |
600 | int i; | 608 | int i; |
601 | 609 | ||
602 | gic_map_to_vpe(intr, cpu); | 610 | gic_map_to_vpe(intr, mips_cm_vp_id(cpu)); |
603 | for (i = 0; i < NR_CPUS; i++) | 611 | for (i = 0; i < NR_CPUS; i++) |
604 | clear_bit(intr, pcpu_masks[i].pcpu_mask); | 612 | clear_bit(intr, pcpu_masks[i].pcpu_mask); |
605 | set_bit(intr, pcpu_masks[cpu].pcpu_mask); | 613 | set_bit(intr, pcpu_masks[cpu].pcpu_mask); |
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index e51de52eeb94..48b5890c28e3 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c | |||
@@ -1997,7 +1997,8 @@ int bitmap_resize(struct bitmap *bitmap, sector_t blocks, | |||
1997 | if (bitmap->mddev->bitmap_info.offset || bitmap->mddev->bitmap_info.file) | 1997 | if (bitmap->mddev->bitmap_info.offset || bitmap->mddev->bitmap_info.file) |
1998 | ret = bitmap_storage_alloc(&store, chunks, | 1998 | ret = bitmap_storage_alloc(&store, chunks, |
1999 | !bitmap->mddev->bitmap_info.external, | 1999 | !bitmap->mddev->bitmap_info.external, |
2000 | bitmap->cluster_slot); | 2000 | mddev_is_clustered(bitmap->mddev) |
2001 | ? bitmap->cluster_slot : 0); | ||
2001 | if (ret) | 2002 | if (ret) |
2002 | goto err; | 2003 | goto err; |
2003 | 2004 | ||
diff --git a/drivers/md/md.c b/drivers/md/md.c index 4f5ecbe94ccb..c702de18207a 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -5409,9 +5409,13 @@ static int md_set_readonly(struct mddev *mddev, struct block_device *bdev) | |||
5409 | * which will now never happen */ | 5409 | * which will now never happen */ |
5410 | wake_up_process(mddev->sync_thread->tsk); | 5410 | wake_up_process(mddev->sync_thread->tsk); |
5411 | 5411 | ||
5412 | if (mddev->external && test_bit(MD_CHANGE_PENDING, &mddev->flags)) | ||
5413 | return -EBUSY; | ||
5412 | mddev_unlock(mddev); | 5414 | mddev_unlock(mddev); |
5413 | wait_event(resync_wait, !test_bit(MD_RECOVERY_RUNNING, | 5415 | wait_event(resync_wait, !test_bit(MD_RECOVERY_RUNNING, |
5414 | &mddev->recovery)); | 5416 | &mddev->recovery)); |
5417 | wait_event(mddev->sb_wait, | ||
5418 | !test_bit(MD_CHANGE_PENDING, &mddev->flags)); | ||
5415 | mddev_lock_nointr(mddev); | 5419 | mddev_lock_nointr(mddev); |
5416 | 5420 | ||
5417 | mutex_lock(&mddev->open_mutex); | 5421 | mutex_lock(&mddev->open_mutex); |
@@ -8160,6 +8164,7 @@ void md_check_recovery(struct mddev *mddev) | |||
8160 | md_reap_sync_thread(mddev); | 8164 | md_reap_sync_thread(mddev); |
8161 | clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery); | 8165 | clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery); |
8162 | clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery); | 8166 | clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery); |
8167 | clear_bit(MD_CHANGE_PENDING, &mddev->flags); | ||
8163 | goto unlock; | 8168 | goto unlock; |
8164 | } | 8169 | } |
8165 | 8170 | ||
diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c index d222522c52e0..d132f06afdd1 100644 --- a/drivers/md/multipath.c +++ b/drivers/md/multipath.c | |||
@@ -470,8 +470,7 @@ static int multipath_run (struct mddev *mddev) | |||
470 | return 0; | 470 | return 0; |
471 | 471 | ||
472 | out_free_conf: | 472 | out_free_conf: |
473 | if (conf->pool) | 473 | mempool_destroy(conf->pool); |
474 | mempool_destroy(conf->pool); | ||
475 | kfree(conf->multipaths); | 474 | kfree(conf->multipaths); |
476 | kfree(conf); | 475 | kfree(conf); |
477 | mddev->private = NULL; | 476 | mddev->private = NULL; |
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index 63e619b2f44e..f8e5db0cb5aa 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c | |||
@@ -376,12 +376,6 @@ static int raid0_run(struct mddev *mddev) | |||
376 | struct md_rdev *rdev; | 376 | struct md_rdev *rdev; |
377 | bool discard_supported = false; | 377 | bool discard_supported = false; |
378 | 378 | ||
379 | rdev_for_each(rdev, mddev) { | ||
380 | disk_stack_limits(mddev->gendisk, rdev->bdev, | ||
381 | rdev->data_offset << 9); | ||
382 | if (blk_queue_discard(bdev_get_queue(rdev->bdev))) | ||
383 | discard_supported = true; | ||
384 | } | ||
385 | blk_queue_max_hw_sectors(mddev->queue, mddev->chunk_sectors); | 379 | blk_queue_max_hw_sectors(mddev->queue, mddev->chunk_sectors); |
386 | blk_queue_max_write_same_sectors(mddev->queue, mddev->chunk_sectors); | 380 | blk_queue_max_write_same_sectors(mddev->queue, mddev->chunk_sectors); |
387 | blk_queue_max_discard_sectors(mddev->queue, mddev->chunk_sectors); | 381 | blk_queue_max_discard_sectors(mddev->queue, mddev->chunk_sectors); |
@@ -390,6 +384,12 @@ static int raid0_run(struct mddev *mddev) | |||
390 | blk_queue_io_opt(mddev->queue, | 384 | blk_queue_io_opt(mddev->queue, |
391 | (mddev->chunk_sectors << 9) * mddev->raid_disks); | 385 | (mddev->chunk_sectors << 9) * mddev->raid_disks); |
392 | 386 | ||
387 | rdev_for_each(rdev, mddev) { | ||
388 | disk_stack_limits(mddev->gendisk, rdev->bdev, | ||
389 | rdev->data_offset << 9); | ||
390 | if (blk_queue_discard(bdev_get_queue(rdev->bdev))) | ||
391 | discard_supported = true; | ||
392 | } | ||
393 | if (!discard_supported) | 393 | if (!discard_supported) |
394 | queue_flag_clear_unlocked(QUEUE_FLAG_DISCARD, mddev->queue); | 394 | queue_flag_clear_unlocked(QUEUE_FLAG_DISCARD, mddev->queue); |
395 | else | 395 | else |
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 4517f06c41ba..049df6c4a8cc 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -881,8 +881,7 @@ static sector_t wait_barrier(struct r1conf *conf, struct bio *bio) | |||
881 | } | 881 | } |
882 | 882 | ||
883 | if (bio && bio_data_dir(bio) == WRITE) { | 883 | if (bio && bio_data_dir(bio) == WRITE) { |
884 | if (bio->bi_iter.bi_sector >= | 884 | if (bio->bi_iter.bi_sector >= conf->next_resync) { |
885 | conf->mddev->curr_resync_completed) { | ||
886 | if (conf->start_next_window == MaxSector) | 885 | if (conf->start_next_window == MaxSector) |
887 | conf->start_next_window = | 886 | conf->start_next_window = |
888 | conf->next_resync + | 887 | conf->next_resync + |
@@ -1516,7 +1515,7 @@ static void close_sync(struct r1conf *conf) | |||
1516 | conf->r1buf_pool = NULL; | 1515 | conf->r1buf_pool = NULL; |
1517 | 1516 | ||
1518 | spin_lock_irq(&conf->resync_lock); | 1517 | spin_lock_irq(&conf->resync_lock); |
1519 | conf->next_resync = 0; | 1518 | conf->next_resync = MaxSector - 2 * NEXT_NORMALIO_DISTANCE; |
1520 | conf->start_next_window = MaxSector; | 1519 | conf->start_next_window = MaxSector; |
1521 | conf->current_window_requests += | 1520 | conf->current_window_requests += |
1522 | conf->next_window_requests; | 1521 | conf->next_window_requests; |
@@ -2843,8 +2842,7 @@ static struct r1conf *setup_conf(struct mddev *mddev) | |||
2843 | 2842 | ||
2844 | abort: | 2843 | abort: |
2845 | if (conf) { | 2844 | if (conf) { |
2846 | if (conf->r1bio_pool) | 2845 | mempool_destroy(conf->r1bio_pool); |
2847 | mempool_destroy(conf->r1bio_pool); | ||
2848 | kfree(conf->mirrors); | 2846 | kfree(conf->mirrors); |
2849 | safe_put_page(conf->tmppage); | 2847 | safe_put_page(conf->tmppage); |
2850 | kfree(conf->poolinfo); | 2848 | kfree(conf->poolinfo); |
@@ -2946,8 +2944,7 @@ static void raid1_free(struct mddev *mddev, void *priv) | |||
2946 | { | 2944 | { |
2947 | struct r1conf *conf = priv; | 2945 | struct r1conf *conf = priv; |
2948 | 2946 | ||
2949 | if (conf->r1bio_pool) | 2947 | mempool_destroy(conf->r1bio_pool); |
2950 | mempool_destroy(conf->r1bio_pool); | ||
2951 | kfree(conf->mirrors); | 2948 | kfree(conf->mirrors); |
2952 | safe_put_page(conf->tmppage); | 2949 | safe_put_page(conf->tmppage); |
2953 | kfree(conf->poolinfo); | 2950 | kfree(conf->poolinfo); |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 0fc33eb88855..7c99a4037715 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
@@ -3486,8 +3486,7 @@ static struct r10conf *setup_conf(struct mddev *mddev) | |||
3486 | printk(KERN_ERR "md/raid10:%s: couldn't allocate memory.\n", | 3486 | printk(KERN_ERR "md/raid10:%s: couldn't allocate memory.\n", |
3487 | mdname(mddev)); | 3487 | mdname(mddev)); |
3488 | if (conf) { | 3488 | if (conf) { |
3489 | if (conf->r10bio_pool) | 3489 | mempool_destroy(conf->r10bio_pool); |
3490 | mempool_destroy(conf->r10bio_pool); | ||
3491 | kfree(conf->mirrors); | 3490 | kfree(conf->mirrors); |
3492 | safe_put_page(conf->tmppage); | 3491 | safe_put_page(conf->tmppage); |
3493 | kfree(conf); | 3492 | kfree(conf); |
@@ -3682,8 +3681,7 @@ static int run(struct mddev *mddev) | |||
3682 | 3681 | ||
3683 | out_free_conf: | 3682 | out_free_conf: |
3684 | md_unregister_thread(&mddev->thread); | 3683 | md_unregister_thread(&mddev->thread); |
3685 | if (conf->r10bio_pool) | 3684 | mempool_destroy(conf->r10bio_pool); |
3686 | mempool_destroy(conf->r10bio_pool); | ||
3687 | safe_put_page(conf->tmppage); | 3685 | safe_put_page(conf->tmppage); |
3688 | kfree(conf->mirrors); | 3686 | kfree(conf->mirrors); |
3689 | kfree(conf); | 3687 | kfree(conf); |
@@ -3696,8 +3694,7 @@ static void raid10_free(struct mddev *mddev, void *priv) | |||
3696 | { | 3694 | { |
3697 | struct r10conf *conf = priv; | 3695 | struct r10conf *conf = priv; |
3698 | 3696 | ||
3699 | if (conf->r10bio_pool) | 3697 | mempool_destroy(conf->r10bio_pool); |
3700 | mempool_destroy(conf->r10bio_pool); | ||
3701 | safe_put_page(conf->tmppage); | 3698 | safe_put_page(conf->tmppage); |
3702 | kfree(conf->mirrors); | 3699 | kfree(conf->mirrors); |
3703 | kfree(conf->mirrors_old); | 3700 | kfree(conf->mirrors_old); |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 15ef2c641b2b..49bb8d3ff9be 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -2271,8 +2271,7 @@ static void shrink_stripes(struct r5conf *conf) | |||
2271 | drop_one_stripe(conf)) | 2271 | drop_one_stripe(conf)) |
2272 | ; | 2272 | ; |
2273 | 2273 | ||
2274 | if (conf->slab_cache) | 2274 | kmem_cache_destroy(conf->slab_cache); |
2275 | kmem_cache_destroy(conf->slab_cache); | ||
2276 | conf->slab_cache = NULL; | 2275 | conf->slab_cache = NULL; |
2277 | } | 2276 | } |
2278 | 2277 | ||
@@ -3150,6 +3149,8 @@ handle_failed_stripe(struct r5conf *conf, struct stripe_head *sh, | |||
3150 | spin_unlock_irq(&sh->stripe_lock); | 3149 | spin_unlock_irq(&sh->stripe_lock); |
3151 | if (test_and_clear_bit(R5_Overlap, &sh->dev[i].flags)) | 3150 | if (test_and_clear_bit(R5_Overlap, &sh->dev[i].flags)) |
3152 | wake_up(&conf->wait_for_overlap); | 3151 | wake_up(&conf->wait_for_overlap); |
3152 | if (bi) | ||
3153 | s->to_read--; | ||
3153 | while (bi && bi->bi_iter.bi_sector < | 3154 | while (bi && bi->bi_iter.bi_sector < |
3154 | sh->dev[i].sector + STRIPE_SECTORS) { | 3155 | sh->dev[i].sector + STRIPE_SECTORS) { |
3155 | struct bio *nextbi = | 3156 | struct bio *nextbi = |
@@ -3169,6 +3170,8 @@ handle_failed_stripe(struct r5conf *conf, struct stripe_head *sh, | |||
3169 | */ | 3170 | */ |
3170 | clear_bit(R5_LOCKED, &sh->dev[i].flags); | 3171 | clear_bit(R5_LOCKED, &sh->dev[i].flags); |
3171 | } | 3172 | } |
3173 | s->to_write = 0; | ||
3174 | s->written = 0; | ||
3172 | 3175 | ||
3173 | if (test_and_clear_bit(STRIPE_FULL_WRITE, &sh->state)) | 3176 | if (test_and_clear_bit(STRIPE_FULL_WRITE, &sh->state)) |
3174 | if (atomic_dec_and_test(&conf->pending_full_writes)) | 3177 | if (atomic_dec_and_test(&conf->pending_full_writes)) |
@@ -3300,7 +3303,7 @@ static int need_this_block(struct stripe_head *sh, struct stripe_head_state *s, | |||
3300 | */ | 3303 | */ |
3301 | return 0; | 3304 | return 0; |
3302 | 3305 | ||
3303 | for (i = 0; i < s->failed; i++) { | 3306 | for (i = 0; i < s->failed && i < 2; i++) { |
3304 | if (fdev[i]->towrite && | 3307 | if (fdev[i]->towrite && |
3305 | !test_bit(R5_UPTODATE, &fdev[i]->flags) && | 3308 | !test_bit(R5_UPTODATE, &fdev[i]->flags) && |
3306 | !test_bit(R5_OVERWRITE, &fdev[i]->flags)) | 3309 | !test_bit(R5_OVERWRITE, &fdev[i]->flags)) |
@@ -3324,7 +3327,7 @@ static int need_this_block(struct stripe_head *sh, struct stripe_head_state *s, | |||
3324 | sh->sector < sh->raid_conf->mddev->recovery_cp) | 3327 | sh->sector < sh->raid_conf->mddev->recovery_cp) |
3325 | /* reconstruct-write isn't being forced */ | 3328 | /* reconstruct-write isn't being forced */ |
3326 | return 0; | 3329 | return 0; |
3327 | for (i = 0; i < s->failed; i++) { | 3330 | for (i = 0; i < s->failed && i < 2; i++) { |
3328 | if (s->failed_num[i] != sh->pd_idx && | 3331 | if (s->failed_num[i] != sh->pd_idx && |
3329 | s->failed_num[i] != sh->qd_idx && | 3332 | s->failed_num[i] != sh->qd_idx && |
3330 | !test_bit(R5_UPTODATE, &fdev[i]->flags) && | 3333 | !test_bit(R5_UPTODATE, &fdev[i]->flags) && |
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 0520064dc33b..a3eb20bdcd97 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c | |||
@@ -134,9 +134,11 @@ void mmc_request_done(struct mmc_host *host, struct mmc_request *mrq) | |||
134 | int err = cmd->error; | 134 | int err = cmd->error; |
135 | 135 | ||
136 | /* Flag re-tuning needed on CRC errors */ | 136 | /* Flag re-tuning needed on CRC errors */ |
137 | if (err == -EILSEQ || (mrq->sbc && mrq->sbc->error == -EILSEQ) || | 137 | if ((cmd->opcode != MMC_SEND_TUNING_BLOCK && |
138 | cmd->opcode != MMC_SEND_TUNING_BLOCK_HS200) && | ||
139 | (err == -EILSEQ || (mrq->sbc && mrq->sbc->error == -EILSEQ) || | ||
138 | (mrq->data && mrq->data->error == -EILSEQ) || | 140 | (mrq->data && mrq->data->error == -EILSEQ) || |
139 | (mrq->stop && mrq->stop->error == -EILSEQ)) | 141 | (mrq->stop && mrq->stop->error == -EILSEQ))) |
140 | mmc_retune_needed(host); | 142 | mmc_retune_needed(host); |
141 | 143 | ||
142 | if (err && cmd->retries && mmc_host_is_spi(host)) { | 144 | if (err && cmd->retries && mmc_host_is_spi(host)) { |
diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c index abd933b7029b..5466f25f0281 100644 --- a/drivers/mmc/core/host.c +++ b/drivers/mmc/core/host.c | |||
@@ -457,7 +457,7 @@ int mmc_of_parse(struct mmc_host *host) | |||
457 | 0, &cd_gpio_invert); | 457 | 0, &cd_gpio_invert); |
458 | if (!ret) | 458 | if (!ret) |
459 | dev_info(host->parent, "Got CD GPIO\n"); | 459 | dev_info(host->parent, "Got CD GPIO\n"); |
460 | else if (ret != -ENOENT) | 460 | else if (ret != -ENOENT && ret != -ENOSYS) |
461 | return ret; | 461 | return ret; |
462 | 462 | ||
463 | /* | 463 | /* |
@@ -481,7 +481,7 @@ int mmc_of_parse(struct mmc_host *host) | |||
481 | ret = mmc_gpiod_request_ro(host, "wp", 0, false, 0, &ro_gpio_invert); | 481 | ret = mmc_gpiod_request_ro(host, "wp", 0, false, 0, &ro_gpio_invert); |
482 | if (!ret) | 482 | if (!ret) |
483 | dev_info(host->parent, "Got WP GPIO\n"); | 483 | dev_info(host->parent, "Got WP GPIO\n"); |
484 | else if (ret != -ENOENT) | 484 | else if (ret != -ENOENT && ret != -ENOSYS) |
485 | return ret; | 485 | return ret; |
486 | 486 | ||
487 | if (of_property_read_bool(np, "disable-wp")) | 487 | if (of_property_read_bool(np, "disable-wp")) |
diff --git a/drivers/mmc/host/pxamci.c b/drivers/mmc/host/pxamci.c index 1420f29628c7..8cadd74e8407 100644 --- a/drivers/mmc/host/pxamci.c +++ b/drivers/mmc/host/pxamci.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/clk.h> | 28 | #include <linux/clk.h> |
29 | #include <linux/err.h> | 29 | #include <linux/err.h> |
30 | #include <linux/mmc/host.h> | 30 | #include <linux/mmc/host.h> |
31 | #include <linux/mmc/slot-gpio.h> | ||
31 | #include <linux/io.h> | 32 | #include <linux/io.h> |
32 | #include <linux/regulator/consumer.h> | 33 | #include <linux/regulator/consumer.h> |
33 | #include <linux/gpio.h> | 34 | #include <linux/gpio.h> |
@@ -454,12 +455,8 @@ static int pxamci_get_ro(struct mmc_host *mmc) | |||
454 | { | 455 | { |
455 | struct pxamci_host *host = mmc_priv(mmc); | 456 | struct pxamci_host *host = mmc_priv(mmc); |
456 | 457 | ||
457 | if (host->pdata && gpio_is_valid(host->pdata->gpio_card_ro)) { | 458 | if (host->pdata && gpio_is_valid(host->pdata->gpio_card_ro)) |
458 | if (host->pdata->gpio_card_ro_invert) | 459 | return mmc_gpio_get_ro(mmc); |
459 | return !gpio_get_value(host->pdata->gpio_card_ro); | ||
460 | else | ||
461 | return gpio_get_value(host->pdata->gpio_card_ro); | ||
462 | } | ||
463 | if (host->pdata && host->pdata->get_ro) | 460 | if (host->pdata && host->pdata->get_ro) |
464 | return !!host->pdata->get_ro(mmc_dev(mmc)); | 461 | return !!host->pdata->get_ro(mmc_dev(mmc)); |
465 | /* | 462 | /* |
@@ -551,6 +548,7 @@ static void pxamci_enable_sdio_irq(struct mmc_host *host, int enable) | |||
551 | 548 | ||
552 | static const struct mmc_host_ops pxamci_ops = { | 549 | static const struct mmc_host_ops pxamci_ops = { |
553 | .request = pxamci_request, | 550 | .request = pxamci_request, |
551 | .get_cd = mmc_gpio_get_cd, | ||
554 | .get_ro = pxamci_get_ro, | 552 | .get_ro = pxamci_get_ro, |
555 | .set_ios = pxamci_set_ios, | 553 | .set_ios = pxamci_set_ios, |
556 | .enable_sdio_irq = pxamci_enable_sdio_irq, | 554 | .enable_sdio_irq = pxamci_enable_sdio_irq, |
@@ -790,37 +788,31 @@ static int pxamci_probe(struct platform_device *pdev) | |||
790 | gpio_power = host->pdata->gpio_power; | 788 | gpio_power = host->pdata->gpio_power; |
791 | } | 789 | } |
792 | if (gpio_is_valid(gpio_power)) { | 790 | if (gpio_is_valid(gpio_power)) { |
793 | ret = gpio_request(gpio_power, "mmc card power"); | 791 | ret = devm_gpio_request(&pdev->dev, gpio_power, |
792 | "mmc card power"); | ||
794 | if (ret) { | 793 | if (ret) { |
795 | dev_err(&pdev->dev, "Failed requesting gpio_power %d\n", gpio_power); | 794 | dev_err(&pdev->dev, "Failed requesting gpio_power %d\n", |
795 | gpio_power); | ||
796 | goto out; | 796 | goto out; |
797 | } | 797 | } |
798 | gpio_direction_output(gpio_power, | 798 | gpio_direction_output(gpio_power, |
799 | host->pdata->gpio_power_invert); | 799 | host->pdata->gpio_power_invert); |
800 | } | 800 | } |
801 | if (gpio_is_valid(gpio_ro)) { | 801 | if (gpio_is_valid(gpio_ro)) |
802 | ret = gpio_request(gpio_ro, "mmc card read only"); | 802 | ret = mmc_gpio_request_ro(mmc, gpio_ro); |
803 | if (ret) { | 803 | if (ret) { |
804 | dev_err(&pdev->dev, "Failed requesting gpio_ro %d\n", gpio_ro); | 804 | dev_err(&pdev->dev, "Failed requesting gpio_ro %d\n", gpio_ro); |
805 | goto err_gpio_ro; | 805 | goto out; |
806 | } | 806 | } else { |
807 | gpio_direction_input(gpio_ro); | 807 | mmc->caps |= host->pdata->gpio_card_ro_invert ? |
808 | MMC_CAP2_RO_ACTIVE_HIGH : 0; | ||
808 | } | 809 | } |
809 | if (gpio_is_valid(gpio_cd)) { | ||
810 | ret = gpio_request(gpio_cd, "mmc card detect"); | ||
811 | if (ret) { | ||
812 | dev_err(&pdev->dev, "Failed requesting gpio_cd %d\n", gpio_cd); | ||
813 | goto err_gpio_cd; | ||
814 | } | ||
815 | gpio_direction_input(gpio_cd); | ||
816 | 810 | ||
817 | ret = request_irq(gpio_to_irq(gpio_cd), pxamci_detect_irq, | 811 | if (gpio_is_valid(gpio_cd)) |
818 | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, | 812 | ret = mmc_gpio_request_cd(mmc, gpio_cd, 0); |
819 | "mmc card detect", mmc); | 813 | if (ret) { |
820 | if (ret) { | 814 | dev_err(&pdev->dev, "Failed requesting gpio_cd %d\n", gpio_cd); |
821 | dev_err(&pdev->dev, "failed to request card detect IRQ\n"); | 815 | goto out; |
822 | goto err_request_irq; | ||
823 | } | ||
824 | } | 816 | } |
825 | 817 | ||
826 | if (host->pdata && host->pdata->init) | 818 | if (host->pdata && host->pdata->init) |
@@ -835,13 +827,7 @@ static int pxamci_probe(struct platform_device *pdev) | |||
835 | 827 | ||
836 | return 0; | 828 | return 0; |
837 | 829 | ||
838 | err_request_irq: | 830 | out: |
839 | gpio_free(gpio_cd); | ||
840 | err_gpio_cd: | ||
841 | gpio_free(gpio_ro); | ||
842 | err_gpio_ro: | ||
843 | gpio_free(gpio_power); | ||
844 | out: | ||
845 | if (host) { | 831 | if (host) { |
846 | if (host->dma_chan_rx) | 832 | if (host->dma_chan_rx) |
847 | dma_release_channel(host->dma_chan_rx); | 833 | dma_release_channel(host->dma_chan_rx); |
@@ -873,14 +859,6 @@ static int pxamci_remove(struct platform_device *pdev) | |||
873 | gpio_ro = host->pdata->gpio_card_ro; | 859 | gpio_ro = host->pdata->gpio_card_ro; |
874 | gpio_power = host->pdata->gpio_power; | 860 | gpio_power = host->pdata->gpio_power; |
875 | } | 861 | } |
876 | if (gpio_is_valid(gpio_cd)) { | ||
877 | free_irq(gpio_to_irq(gpio_cd), mmc); | ||
878 | gpio_free(gpio_cd); | ||
879 | } | ||
880 | if (gpio_is_valid(gpio_ro)) | ||
881 | gpio_free(gpio_ro); | ||
882 | if (gpio_is_valid(gpio_power)) | ||
883 | gpio_free(gpio_power); | ||
884 | if (host->vcc) | 862 | if (host->vcc) |
885 | regulator_put(host->vcc); | 863 | regulator_put(host->vcc); |
886 | 864 | ||
diff --git a/drivers/mmc/host/sunxi-mmc.c b/drivers/mmc/host/sunxi-mmc.c index a7b7a6771598..b981b8552e43 100644 --- a/drivers/mmc/host/sunxi-mmc.c +++ b/drivers/mmc/host/sunxi-mmc.c | |||
@@ -210,6 +210,16 @@ | |||
210 | #define SDXC_IDMAC_DES0_CES BIT(30) /* card error summary */ | 210 | #define SDXC_IDMAC_DES0_CES BIT(30) /* card error summary */ |
211 | #define SDXC_IDMAC_DES0_OWN BIT(31) /* 1-idma owns it, 0-host owns it */ | 211 | #define SDXC_IDMAC_DES0_OWN BIT(31) /* 1-idma owns it, 0-host owns it */ |
212 | 212 | ||
213 | #define SDXC_CLK_400K 0 | ||
214 | #define SDXC_CLK_25M 1 | ||
215 | #define SDXC_CLK_50M 2 | ||
216 | #define SDXC_CLK_50M_DDR 3 | ||
217 | |||
218 | struct sunxi_mmc_clk_delay { | ||
219 | u32 output; | ||
220 | u32 sample; | ||
221 | }; | ||
222 | |||
213 | struct sunxi_idma_des { | 223 | struct sunxi_idma_des { |
214 | u32 config; | 224 | u32 config; |
215 | u32 buf_size; | 225 | u32 buf_size; |
@@ -229,6 +239,7 @@ struct sunxi_mmc_host { | |||
229 | struct clk *clk_mmc; | 239 | struct clk *clk_mmc; |
230 | struct clk *clk_sample; | 240 | struct clk *clk_sample; |
231 | struct clk *clk_output; | 241 | struct clk *clk_output; |
242 | const struct sunxi_mmc_clk_delay *clk_delays; | ||
232 | 243 | ||
233 | /* irq */ | 244 | /* irq */ |
234 | spinlock_t lock; | 245 | spinlock_t lock; |
@@ -654,25 +665,19 @@ static int sunxi_mmc_clk_set_rate(struct sunxi_mmc_host *host, | |||
654 | 665 | ||
655 | /* determine delays */ | 666 | /* determine delays */ |
656 | if (rate <= 400000) { | 667 | if (rate <= 400000) { |
657 | oclk_dly = 180; | 668 | oclk_dly = host->clk_delays[SDXC_CLK_400K].output; |
658 | sclk_dly = 42; | 669 | sclk_dly = host->clk_delays[SDXC_CLK_400K].sample; |
659 | } else if (rate <= 25000000) { | 670 | } else if (rate <= 25000000) { |
660 | oclk_dly = 180; | 671 | oclk_dly = host->clk_delays[SDXC_CLK_25M].output; |
661 | sclk_dly = 75; | 672 | sclk_dly = host->clk_delays[SDXC_CLK_25M].sample; |
662 | } else if (rate <= 50000000) { | 673 | } else if (rate <= 50000000) { |
663 | if (ios->timing == MMC_TIMING_UHS_DDR50) { | 674 | if (ios->timing == MMC_TIMING_UHS_DDR50) { |
664 | oclk_dly = 60; | 675 | oclk_dly = host->clk_delays[SDXC_CLK_50M_DDR].output; |
665 | sclk_dly = 120; | 676 | sclk_dly = host->clk_delays[SDXC_CLK_50M_DDR].sample; |
666 | } else { | 677 | } else { |
667 | oclk_dly = 90; | 678 | oclk_dly = host->clk_delays[SDXC_CLK_50M].output; |
668 | sclk_dly = 150; | 679 | sclk_dly = host->clk_delays[SDXC_CLK_50M].sample; |
669 | } | 680 | } |
670 | } else if (rate <= 100000000) { | ||
671 | oclk_dly = 6; | ||
672 | sclk_dly = 24; | ||
673 | } else if (rate <= 200000000) { | ||
674 | oclk_dly = 3; | ||
675 | sclk_dly = 12; | ||
676 | } else { | 681 | } else { |
677 | return -EINVAL; | 682 | return -EINVAL; |
678 | } | 683 | } |
@@ -871,6 +876,7 @@ static void sunxi_mmc_request(struct mmc_host *mmc, struct mmc_request *mrq) | |||
871 | static const struct of_device_id sunxi_mmc_of_match[] = { | 876 | static const struct of_device_id sunxi_mmc_of_match[] = { |
872 | { .compatible = "allwinner,sun4i-a10-mmc", }, | 877 | { .compatible = "allwinner,sun4i-a10-mmc", }, |
873 | { .compatible = "allwinner,sun5i-a13-mmc", }, | 878 | { .compatible = "allwinner,sun5i-a13-mmc", }, |
879 | { .compatible = "allwinner,sun9i-a80-mmc", }, | ||
874 | { /* sentinel */ } | 880 | { /* sentinel */ } |
875 | }; | 881 | }; |
876 | MODULE_DEVICE_TABLE(of, sunxi_mmc_of_match); | 882 | MODULE_DEVICE_TABLE(of, sunxi_mmc_of_match); |
@@ -884,6 +890,20 @@ static struct mmc_host_ops sunxi_mmc_ops = { | |||
884 | .hw_reset = sunxi_mmc_hw_reset, | 890 | .hw_reset = sunxi_mmc_hw_reset, |
885 | }; | 891 | }; |
886 | 892 | ||
893 | static const struct sunxi_mmc_clk_delay sunxi_mmc_clk_delays[] = { | ||
894 | [SDXC_CLK_400K] = { .output = 180, .sample = 180 }, | ||
895 | [SDXC_CLK_25M] = { .output = 180, .sample = 75 }, | ||
896 | [SDXC_CLK_50M] = { .output = 90, .sample = 120 }, | ||
897 | [SDXC_CLK_50M_DDR] = { .output = 60, .sample = 120 }, | ||
898 | }; | ||
899 | |||
900 | static const struct sunxi_mmc_clk_delay sun9i_mmc_clk_delays[] = { | ||
901 | [SDXC_CLK_400K] = { .output = 180, .sample = 180 }, | ||
902 | [SDXC_CLK_25M] = { .output = 180, .sample = 75 }, | ||
903 | [SDXC_CLK_50M] = { .output = 150, .sample = 120 }, | ||
904 | [SDXC_CLK_50M_DDR] = { .output = 90, .sample = 120 }, | ||
905 | }; | ||
906 | |||
887 | static int sunxi_mmc_resource_request(struct sunxi_mmc_host *host, | 907 | static int sunxi_mmc_resource_request(struct sunxi_mmc_host *host, |
888 | struct platform_device *pdev) | 908 | struct platform_device *pdev) |
889 | { | 909 | { |
@@ -895,6 +915,11 @@ static int sunxi_mmc_resource_request(struct sunxi_mmc_host *host, | |||
895 | else | 915 | else |
896 | host->idma_des_size_bits = 16; | 916 | host->idma_des_size_bits = 16; |
897 | 917 | ||
918 | if (of_device_is_compatible(np, "allwinner,sun9i-a80-mmc")) | ||
919 | host->clk_delays = sun9i_mmc_clk_delays; | ||
920 | else | ||
921 | host->clk_delays = sunxi_mmc_clk_delays; | ||
922 | |||
898 | ret = mmc_regulator_get_supply(host->mmc); | 923 | ret = mmc_regulator_get_supply(host->mmc); |
899 | if (ret) { | 924 | if (ret) { |
900 | if (ret != -EPROBE_DEFER) | 925 | if (ret != -EPROBE_DEFER) |
diff --git a/drivers/mtd/ubi/io.c b/drivers/mtd/ubi/io.c index 5bbd1f094f4e..1fc23e48fe8e 100644 --- a/drivers/mtd/ubi/io.c +++ b/drivers/mtd/ubi/io.c | |||
@@ -926,6 +926,11 @@ static int validate_vid_hdr(const struct ubi_device *ubi, | |||
926 | goto bad; | 926 | goto bad; |
927 | } | 927 | } |
928 | 928 | ||
929 | if (data_size > ubi->leb_size) { | ||
930 | ubi_err(ubi, "bad data_size"); | ||
931 | goto bad; | ||
932 | } | ||
933 | |||
929 | if (vol_type == UBI_VID_STATIC) { | 934 | if (vol_type == UBI_VID_STATIC) { |
930 | /* | 935 | /* |
931 | * Although from high-level point of view static volumes may | 936 | * Although from high-level point of view static volumes may |
diff --git a/drivers/mtd/ubi/vtbl.c b/drivers/mtd/ubi/vtbl.c index 80bdd5b88bac..d85c19762160 100644 --- a/drivers/mtd/ubi/vtbl.c +++ b/drivers/mtd/ubi/vtbl.c | |||
@@ -649,6 +649,7 @@ static int init_volumes(struct ubi_device *ubi, | |||
649 | if (ubi->corr_peb_count) | 649 | if (ubi->corr_peb_count) |
650 | ubi_err(ubi, "%d PEBs are corrupted and not used", | 650 | ubi_err(ubi, "%d PEBs are corrupted and not used", |
651 | ubi->corr_peb_count); | 651 | ubi->corr_peb_count); |
652 | return -ENOSPC; | ||
652 | } | 653 | } |
653 | ubi->rsvd_pebs += reserved_pebs; | 654 | ubi->rsvd_pebs += reserved_pebs; |
654 | ubi->avail_pebs -= reserved_pebs; | 655 | ubi->avail_pebs -= reserved_pebs; |
diff --git a/drivers/mtd/ubi/wl.c b/drivers/mtd/ubi/wl.c index 275d9fb6fe5c..eb4489f9082f 100644 --- a/drivers/mtd/ubi/wl.c +++ b/drivers/mtd/ubi/wl.c | |||
@@ -1601,6 +1601,7 @@ int ubi_wl_init(struct ubi_device *ubi, struct ubi_attach_info *ai) | |||
1601 | if (ubi->corr_peb_count) | 1601 | if (ubi->corr_peb_count) |
1602 | ubi_err(ubi, "%d PEBs are corrupted and not used", | 1602 | ubi_err(ubi, "%d PEBs are corrupted and not used", |
1603 | ubi->corr_peb_count); | 1603 | ubi->corr_peb_count); |
1604 | err = -ENOSPC; | ||
1604 | goto out_free; | 1605 | goto out_free; |
1605 | } | 1606 | } |
1606 | ubi->avail_pebs -= reserved_pebs; | 1607 | ubi->avail_pebs -= reserved_pebs; |
diff --git a/drivers/net/dsa/mv88e6xxx.c b/drivers/net/dsa/mv88e6xxx.c index f8baa897d1a0..1f7dd927cc5e 100644 --- a/drivers/net/dsa/mv88e6xxx.c +++ b/drivers/net/dsa/mv88e6xxx.c | |||
@@ -2051,6 +2051,8 @@ static int mv88e6xxx_setup_port(struct dsa_switch *ds, int port) | |||
2051 | reg |= PORT_CONTROL_FRAME_ETHER_TYPE_DSA; | 2051 | reg |= PORT_CONTROL_FRAME_ETHER_TYPE_DSA; |
2052 | else | 2052 | else |
2053 | reg |= PORT_CONTROL_FRAME_MODE_DSA; | 2053 | reg |= PORT_CONTROL_FRAME_MODE_DSA; |
2054 | reg |= PORT_CONTROL_FORWARD_UNKNOWN | | ||
2055 | PORT_CONTROL_FORWARD_UNKNOWN_MC; | ||
2054 | } | 2056 | } |
2055 | 2057 | ||
2056 | if (mv88e6xxx_6352_family(ds) || mv88e6xxx_6351_family(ds) || | 2058 | if (mv88e6xxx_6352_family(ds) || mv88e6xxx_6351_family(ds) || |
diff --git a/drivers/net/ethernet/brocade/bna/bfa_ioc.c b/drivers/net/ethernet/brocade/bna/bfa_ioc.c index b7a0f7879de2..9e59663a6ead 100644 --- a/drivers/net/ethernet/brocade/bna/bfa_ioc.c +++ b/drivers/net/ethernet/brocade/bna/bfa_ioc.c | |||
@@ -1543,7 +1543,7 @@ bfa_flash_cmd_act_check(void __iomem *pci_bar) | |||
1543 | } | 1543 | } |
1544 | 1544 | ||
1545 | /* Flush FLI data fifo. */ | 1545 | /* Flush FLI data fifo. */ |
1546 | static u32 | 1546 | static int |
1547 | bfa_flash_fifo_flush(void __iomem *pci_bar) | 1547 | bfa_flash_fifo_flush(void __iomem *pci_bar) |
1548 | { | 1548 | { |
1549 | u32 i; | 1549 | u32 i; |
@@ -1573,11 +1573,11 @@ bfa_flash_fifo_flush(void __iomem *pci_bar) | |||
1573 | } | 1573 | } |
1574 | 1574 | ||
1575 | /* Read flash status. */ | 1575 | /* Read flash status. */ |
1576 | static u32 | 1576 | static int |
1577 | bfa_flash_status_read(void __iomem *pci_bar) | 1577 | bfa_flash_status_read(void __iomem *pci_bar) |
1578 | { | 1578 | { |
1579 | union bfa_flash_dev_status_reg dev_status; | 1579 | union bfa_flash_dev_status_reg dev_status; |
1580 | u32 status; | 1580 | int status; |
1581 | u32 ret_status; | 1581 | u32 ret_status; |
1582 | int i; | 1582 | int i; |
1583 | 1583 | ||
@@ -1611,11 +1611,11 @@ bfa_flash_status_read(void __iomem *pci_bar) | |||
1611 | } | 1611 | } |
1612 | 1612 | ||
1613 | /* Start flash read operation. */ | 1613 | /* Start flash read operation. */ |
1614 | static u32 | 1614 | static int |
1615 | bfa_flash_read_start(void __iomem *pci_bar, u32 offset, u32 len, | 1615 | bfa_flash_read_start(void __iomem *pci_bar, u32 offset, u32 len, |
1616 | char *buf) | 1616 | char *buf) |
1617 | { | 1617 | { |
1618 | u32 status; | 1618 | int status; |
1619 | 1619 | ||
1620 | /* len must be mutiple of 4 and not exceeding fifo size */ | 1620 | /* len must be mutiple of 4 and not exceeding fifo size */ |
1621 | if (len == 0 || len > BFA_FLASH_FIFO_SIZE || (len & 0x03) != 0) | 1621 | if (len == 0 || len > BFA_FLASH_FIFO_SIZE || (len & 0x03) != 0) |
@@ -1703,7 +1703,8 @@ static enum bfa_status | |||
1703 | bfa_flash_raw_read(void __iomem *pci_bar, u32 offset, char *buf, | 1703 | bfa_flash_raw_read(void __iomem *pci_bar, u32 offset, char *buf, |
1704 | u32 len) | 1704 | u32 len) |
1705 | { | 1705 | { |
1706 | u32 n, status; | 1706 | u32 n; |
1707 | int status; | ||
1707 | u32 off, l, s, residue, fifo_sz; | 1708 | u32 off, l, s, residue, fifo_sz; |
1708 | 1709 | ||
1709 | residue = len; | 1710 | residue = len; |
diff --git a/drivers/net/ethernet/hisilicon/hip04_eth.c b/drivers/net/ethernet/hisilicon/hip04_eth.c index cc2d8b4b18e3..253f8ed0537a 100644 --- a/drivers/net/ethernet/hisilicon/hip04_eth.c +++ b/drivers/net/ethernet/hisilicon/hip04_eth.c | |||
@@ -816,7 +816,7 @@ static int hip04_mac_probe(struct platform_device *pdev) | |||
816 | struct net_device *ndev; | 816 | struct net_device *ndev; |
817 | struct hip04_priv *priv; | 817 | struct hip04_priv *priv; |
818 | struct resource *res; | 818 | struct resource *res; |
819 | unsigned int irq; | 819 | int irq; |
820 | int ret; | 820 | int ret; |
821 | 821 | ||
822 | ndev = alloc_etherdev(sizeof(struct hip04_priv)); | 822 | ndev = alloc_etherdev(sizeof(struct hip04_priv)); |
diff --git a/drivers/net/ethernet/ibm/emac/core.h b/drivers/net/ethernet/ibm/emac/core.h index 28df37420da9..ac02c675c59c 100644 --- a/drivers/net/ethernet/ibm/emac/core.h +++ b/drivers/net/ethernet/ibm/emac/core.h | |||
@@ -460,8 +460,8 @@ struct emac_ethtool_regs_subhdr { | |||
460 | u32 index; | 460 | u32 index; |
461 | }; | 461 | }; |
462 | 462 | ||
463 | #define EMAC_ETHTOOL_REGS_VER 0 | 463 | #define EMAC_ETHTOOL_REGS_VER 3 |
464 | #define EMAC4_ETHTOOL_REGS_VER 1 | 464 | #define EMAC4_ETHTOOL_REGS_VER 4 |
465 | #define EMAC4SYNC_ETHTOOL_REGS_VER 2 | 465 | #define EMAC4SYNC_ETHTOOL_REGS_VER 5 |
466 | 466 | ||
467 | #endif /* __IBM_NEWEMAC_CORE_H */ | 467 | #endif /* __IBM_NEWEMAC_CORE_H */ |
diff --git a/drivers/net/ethernet/intel/i40e/i40e_adminq.c b/drivers/net/ethernet/intel/i40e/i40e_adminq.c index 3e0d20037675..62488a67149d 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_adminq.c +++ b/drivers/net/ethernet/intel/i40e/i40e_adminq.c | |||
@@ -946,6 +946,13 @@ i40e_status i40e_clean_arq_element(struct i40e_hw *hw, | |||
946 | /* take the lock before we start messing with the ring */ | 946 | /* take the lock before we start messing with the ring */ |
947 | mutex_lock(&hw->aq.arq_mutex); | 947 | mutex_lock(&hw->aq.arq_mutex); |
948 | 948 | ||
949 | if (hw->aq.arq.count == 0) { | ||
950 | i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE, | ||
951 | "AQRX: Admin queue not initialized.\n"); | ||
952 | ret_code = I40E_ERR_QUEUE_EMPTY; | ||
953 | goto clean_arq_element_err; | ||
954 | } | ||
955 | |||
949 | /* set next_to_use to head */ | 956 | /* set next_to_use to head */ |
950 | ntu = (rd32(hw, hw->aq.arq.head) & I40E_PF_ARQH_ARQH_MASK); | 957 | ntu = (rd32(hw, hw->aq.arq.head) & I40E_PF_ARQH_ARQH_MASK); |
951 | if (ntu == ntc) { | 958 | if (ntu == ntc) { |
@@ -1007,6 +1014,8 @@ clean_arq_element_out: | |||
1007 | /* Set pending if needed, unlock and return */ | 1014 | /* Set pending if needed, unlock and return */ |
1008 | if (pending != NULL) | 1015 | if (pending != NULL) |
1009 | *pending = (ntc > ntu ? hw->aq.arq.count : 0) + (ntu - ntc); | 1016 | *pending = (ntc > ntu ? hw->aq.arq.count : 0) + (ntu - ntc); |
1017 | |||
1018 | clean_arq_element_err: | ||
1010 | mutex_unlock(&hw->aq.arq_mutex); | 1019 | mutex_unlock(&hw->aq.arq_mutex); |
1011 | 1020 | ||
1012 | if (i40e_is_nvm_update_op(&e->desc)) { | 1021 | if (i40e_is_nvm_update_op(&e->desc)) { |
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index 851c1a159be8..2fdf978ae6a5 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c | |||
@@ -2672,7 +2672,8 @@ static int i40e_configure_rx_ring(struct i40e_ring *ring) | |||
2672 | rx_ctx.lrxqthresh = 2; | 2672 | rx_ctx.lrxqthresh = 2; |
2673 | rx_ctx.crcstrip = 1; | 2673 | rx_ctx.crcstrip = 1; |
2674 | rx_ctx.l2tsel = 1; | 2674 | rx_ctx.l2tsel = 1; |
2675 | rx_ctx.showiv = 1; | 2675 | /* this controls whether VLAN is stripped from inner headers */ |
2676 | rx_ctx.showiv = 0; | ||
2676 | #ifdef I40E_FCOE | 2677 | #ifdef I40E_FCOE |
2677 | rx_ctx.fc_ena = (vsi->type == I40E_VSI_FCOE); | 2678 | rx_ctx.fc_ena = (vsi->type == I40E_VSI_FCOE); |
2678 | #endif | 2679 | #endif |
diff --git a/drivers/net/ethernet/intel/i40evf/i40e_adminq.c b/drivers/net/ethernet/intel/i40evf/i40e_adminq.c index f08450b90774..929d47152bf2 100644 --- a/drivers/net/ethernet/intel/i40evf/i40e_adminq.c +++ b/drivers/net/ethernet/intel/i40evf/i40e_adminq.c | |||
@@ -887,6 +887,13 @@ i40e_status i40evf_clean_arq_element(struct i40e_hw *hw, | |||
887 | /* take the lock before we start messing with the ring */ | 887 | /* take the lock before we start messing with the ring */ |
888 | mutex_lock(&hw->aq.arq_mutex); | 888 | mutex_lock(&hw->aq.arq_mutex); |
889 | 889 | ||
890 | if (hw->aq.arq.count == 0) { | ||
891 | i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE, | ||
892 | "AQRX: Admin queue not initialized.\n"); | ||
893 | ret_code = I40E_ERR_QUEUE_EMPTY; | ||
894 | goto clean_arq_element_err; | ||
895 | } | ||
896 | |||
890 | /* set next_to_use to head */ | 897 | /* set next_to_use to head */ |
891 | ntu = (rd32(hw, hw->aq.arq.head) & I40E_VF_ARQH1_ARQH_MASK); | 898 | ntu = (rd32(hw, hw->aq.arq.head) & I40E_VF_ARQH1_ARQH_MASK); |
892 | if (ntu == ntc) { | 899 | if (ntu == ntc) { |
@@ -948,6 +955,8 @@ clean_arq_element_out: | |||
948 | /* Set pending if needed, unlock and return */ | 955 | /* Set pending if needed, unlock and return */ |
949 | if (pending != NULL) | 956 | if (pending != NULL) |
950 | *pending = (ntc > ntu ? hw->aq.arq.count : 0) + (ntu - ntc); | 957 | *pending = (ntc > ntu ? hw->aq.arq.count : 0) + (ntu - ntc); |
958 | |||
959 | clean_arq_element_err: | ||
951 | mutex_unlock(&hw->aq.arq_mutex); | 960 | mutex_unlock(&hw->aq.arq_mutex); |
952 | 961 | ||
953 | return ret_code; | 962 | return ret_code; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mcg.c b/drivers/net/ethernet/mellanox/mlx4/mcg.c index bd9ea0d01aae..1d4e2e054647 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mcg.c +++ b/drivers/net/ethernet/mellanox/mlx4/mcg.c | |||
@@ -1184,10 +1184,11 @@ out: | |||
1184 | if (prot == MLX4_PROT_ETH) { | 1184 | if (prot == MLX4_PROT_ETH) { |
1185 | /* manage the steering entry for promisc mode */ | 1185 | /* manage the steering entry for promisc mode */ |
1186 | if (new_entry) | 1186 | if (new_entry) |
1187 | new_steering_entry(dev, port, steer, index, qp->qpn); | 1187 | err = new_steering_entry(dev, port, steer, |
1188 | index, qp->qpn); | ||
1188 | else | 1189 | else |
1189 | existing_steering_entry(dev, port, steer, | 1190 | err = existing_steering_entry(dev, port, steer, |
1190 | index, qp->qpn); | 1191 | index, qp->qpn); |
1191 | } | 1192 | } |
1192 | if (err && link && index != -1) { | 1193 | if (err && link && index != -1) { |
1193 | if (index < dev->caps.num_mgms) | 1194 | if (index < dev->caps.num_mgms) |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fw.c b/drivers/net/ethernet/mellanox/mlx5/core/fw.c index aa0d5ffe92d8..9335e5ae18cc 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/fw.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/fw.c | |||
@@ -200,25 +200,3 @@ int mlx5_cmd_teardown_hca(struct mlx5_core_dev *dev) | |||
200 | 200 | ||
201 | return err; | 201 | return err; |
202 | } | 202 | } |
203 | |||
204 | int mlx5_core_query_special_context(struct mlx5_core_dev *dev, u32 *rsvd_lkey) | ||
205 | { | ||
206 | struct mlx5_cmd_query_special_contexts_mbox_in in; | ||
207 | struct mlx5_cmd_query_special_contexts_mbox_out out; | ||
208 | int err; | ||
209 | |||
210 | memset(&in, 0, sizeof(in)); | ||
211 | memset(&out, 0, sizeof(out)); | ||
212 | in.hdr.opcode = cpu_to_be16(MLX5_CMD_OP_QUERY_SPECIAL_CONTEXTS); | ||
213 | err = mlx5_cmd_exec(dev, &in, sizeof(in), &out, sizeof(out)); | ||
214 | if (err) | ||
215 | return err; | ||
216 | |||
217 | if (out.hdr.status) | ||
218 | err = mlx5_cmd_status_to_err(&out.hdr); | ||
219 | |||
220 | *rsvd_lkey = be32_to_cpu(out.resd_lkey); | ||
221 | |||
222 | return err; | ||
223 | } | ||
224 | EXPORT_SYMBOL(mlx5_core_query_special_context); | ||
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index 2b32e0c5a0b4..b4f21232019a 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c | |||
@@ -6081,7 +6081,7 @@ static void rtl_hw_start_8168h_1(struct rtl8169_private *tp) | |||
6081 | { | 6081 | { |
6082 | void __iomem *ioaddr = tp->mmio_addr; | 6082 | void __iomem *ioaddr = tp->mmio_addr; |
6083 | struct pci_dev *pdev = tp->pci_dev; | 6083 | struct pci_dev *pdev = tp->pci_dev; |
6084 | u16 rg_saw_cnt; | 6084 | int rg_saw_cnt; |
6085 | u32 data; | 6085 | u32 data; |
6086 | static const struct ephy_info e_info_8168h_1[] = { | 6086 | static const struct ephy_info e_info_8168h_1[] = { |
6087 | { 0x1e, 0x0800, 0x0001 }, | 6087 | { 0x1e, 0x0800, 0x0001 }, |
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index dd652f2ae03d..108a3118ace7 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c | |||
@@ -299,9 +299,10 @@ static long local_pci_probe(void *_ddi) | |||
299 | * Unbound PCI devices are always put in D0, regardless of | 299 | * Unbound PCI devices are always put in D0, regardless of |
300 | * runtime PM status. During probe, the device is set to | 300 | * runtime PM status. During probe, the device is set to |
301 | * active and the usage count is incremented. If the driver | 301 | * active and the usage count is incremented. If the driver |
302 | * supports runtime PM, it should call pm_runtime_put_noidle() | 302 | * supports runtime PM, it should call pm_runtime_put_noidle(), |
303 | * in its probe routine and pm_runtime_get_noresume() in its | 303 | * or any other runtime PM helper function decrementing the usage |
304 | * remove routine. | 304 | * count, in its probe routine and pm_runtime_get_noresume() in |
305 | * its remove routine. | ||
305 | */ | 306 | */ |
306 | pm_runtime_get_sync(dev); | 307 | pm_runtime_get_sync(dev); |
307 | pci_dev->driver = pci_drv; | 308 | pci_dev->driver = pci_drv; |
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index cbfc5990052b..126a48c6431e 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
@@ -1957,7 +1957,7 @@ static int scsi_mq_prep_fn(struct request *req) | |||
1957 | static void scsi_mq_done(struct scsi_cmnd *cmd) | 1957 | static void scsi_mq_done(struct scsi_cmnd *cmd) |
1958 | { | 1958 | { |
1959 | trace_scsi_dispatch_cmd_done(cmd); | 1959 | trace_scsi_dispatch_cmd_done(cmd); |
1960 | blk_mq_complete_request(cmd->request); | 1960 | blk_mq_complete_request(cmd->request, cmd->request->errors); |
1961 | } | 1961 | } |
1962 | 1962 | ||
1963 | static int scsi_queue_rq(struct blk_mq_hw_ctx *hctx, | 1963 | static int scsi_queue_rq(struct blk_mq_hw_ctx *hctx, |
diff --git a/drivers/thermal/power_allocator.c b/drivers/thermal/power_allocator.c index 7ff96270c933..e570ff084add 100644 --- a/drivers/thermal/power_allocator.c +++ b/drivers/thermal/power_allocator.c | |||
@@ -144,6 +144,16 @@ static void estimate_pid_constants(struct thermal_zone_device *tz, | |||
144 | switch_on_temp = 0; | 144 | switch_on_temp = 0; |
145 | 145 | ||
146 | temperature_threshold = control_temp - switch_on_temp; | 146 | temperature_threshold = control_temp - switch_on_temp; |
147 | /* | ||
148 | * estimate_pid_constants() tries to find appropriate default | ||
149 | * values for thermal zones that don't provide them. If a | ||
150 | * system integrator has configured a thermal zone with two | ||
151 | * passive trip points at the same temperature, that person | ||
152 | * hasn't put any effort to set up the thermal zone properly | ||
153 | * so just give up. | ||
154 | */ | ||
155 | if (!temperature_threshold) | ||
156 | return; | ||
147 | 157 | ||
148 | if (!tz->tzp->k_po || force) | 158 | if (!tz->tzp->k_po || force) |
149 | tz->tzp->k_po = int_to_frac(sustainable_power) / | 159 | tz->tzp->k_po = int_to_frac(sustainable_power) / |
diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig index c68edc16aa54..79e1aa1b0959 100644 --- a/drivers/watchdog/Kconfig +++ b/drivers/watchdog/Kconfig | |||
@@ -817,8 +817,9 @@ config ITCO_WDT | |||
817 | tristate "Intel TCO Timer/Watchdog" | 817 | tristate "Intel TCO Timer/Watchdog" |
818 | depends on (X86 || IA64) && PCI | 818 | depends on (X86 || IA64) && PCI |
819 | select WATCHDOG_CORE | 819 | select WATCHDOG_CORE |
820 | depends on I2C || I2C=n | ||
820 | select LPC_ICH if !EXPERT | 821 | select LPC_ICH if !EXPERT |
821 | select I2C_I801 if !EXPERT | 822 | select I2C_I801 if !EXPERT && I2C |
822 | ---help--- | 823 | ---help--- |
823 | Hardware driver for the intel TCO timer based watchdog devices. | 824 | Hardware driver for the intel TCO timer based watchdog devices. |
824 | These drivers are included in the Intel 82801 I/O Controller | 825 | These drivers are included in the Intel 82801 I/O Controller |
diff --git a/drivers/watchdog/bcm2835_wdt.c b/drivers/watchdog/bcm2835_wdt.c index 66c3e656a616..8a5ce5b5a0b6 100644 --- a/drivers/watchdog/bcm2835_wdt.c +++ b/drivers/watchdog/bcm2835_wdt.c | |||
@@ -36,6 +36,13 @@ | |||
36 | #define PM_RSTC_WRCFG_FULL_RESET 0x00000020 | 36 | #define PM_RSTC_WRCFG_FULL_RESET 0x00000020 |
37 | #define PM_RSTC_RESET 0x00000102 | 37 | #define PM_RSTC_RESET 0x00000102 |
38 | 38 | ||
39 | /* | ||
40 | * The Raspberry Pi firmware uses the RSTS register to know which partiton | ||
41 | * to boot from. The partiton value is spread into bits 0, 2, 4, 6, 8, 10. | ||
42 | * Partiton 63 is a special partition used by the firmware to indicate halt. | ||
43 | */ | ||
44 | #define PM_RSTS_RASPBERRYPI_HALT 0x555 | ||
45 | |||
39 | #define SECS_TO_WDOG_TICKS(x) ((x) << 16) | 46 | #define SECS_TO_WDOG_TICKS(x) ((x) << 16) |
40 | #define WDOG_TICKS_TO_SECS(x) ((x) >> 16) | 47 | #define WDOG_TICKS_TO_SECS(x) ((x) >> 16) |
41 | 48 | ||
@@ -151,8 +158,7 @@ static void bcm2835_power_off(void) | |||
151 | * hard reset. | 158 | * hard reset. |
152 | */ | 159 | */ |
153 | val = readl_relaxed(wdt->base + PM_RSTS); | 160 | val = readl_relaxed(wdt->base + PM_RSTS); |
154 | val &= PM_RSTC_WRCFG_CLR; | 161 | val |= PM_PASSWORD | PM_RSTS_RASPBERRYPI_HALT; |
155 | val |= PM_PASSWORD | PM_RSTS_HADWRH_SET; | ||
156 | writel_relaxed(val, wdt->base + PM_RSTS); | 162 | writel_relaxed(val, wdt->base + PM_RSTS); |
157 | 163 | ||
158 | /* Continue with normal reset mechanism */ | 164 | /* Continue with normal reset mechanism */ |
diff --git a/drivers/watchdog/gef_wdt.c b/drivers/watchdog/gef_wdt.c index cc1bdfc2ff71..006e2348022c 100644 --- a/drivers/watchdog/gef_wdt.c +++ b/drivers/watchdog/gef_wdt.c | |||
@@ -303,6 +303,7 @@ static const struct of_device_id gef_wdt_ids[] = { | |||
303 | }, | 303 | }, |
304 | {}, | 304 | {}, |
305 | }; | 305 | }; |
306 | MODULE_DEVICE_TABLE(of, gef_wdt_ids); | ||
306 | 307 | ||
307 | static struct platform_driver gef_wdt_driver = { | 308 | static struct platform_driver gef_wdt_driver = { |
308 | .driver = { | 309 | .driver = { |
diff --git a/drivers/watchdog/mena21_wdt.c b/drivers/watchdog/mena21_wdt.c index 69013007dc47..098fa9c34d6d 100644 --- a/drivers/watchdog/mena21_wdt.c +++ b/drivers/watchdog/mena21_wdt.c | |||
@@ -253,6 +253,7 @@ static const struct of_device_id a21_wdt_ids[] = { | |||
253 | { .compatible = "men,a021-wdt" }, | 253 | { .compatible = "men,a021-wdt" }, |
254 | { }, | 254 | { }, |
255 | }; | 255 | }; |
256 | MODULE_DEVICE_TABLE(of, a21_wdt_ids); | ||
256 | 257 | ||
257 | static struct platform_driver a21_wdt_driver = { | 258 | static struct platform_driver a21_wdt_driver = { |
258 | .probe = a21_wdt_probe, | 259 | .probe = a21_wdt_probe, |
diff --git a/drivers/watchdog/moxart_wdt.c b/drivers/watchdog/moxart_wdt.c index 2789da2c0515..60b0605bd7e6 100644 --- a/drivers/watchdog/moxart_wdt.c +++ b/drivers/watchdog/moxart_wdt.c | |||
@@ -168,6 +168,7 @@ static const struct of_device_id moxart_watchdog_match[] = { | |||
168 | { .compatible = "moxa,moxart-watchdog" }, | 168 | { .compatible = "moxa,moxart-watchdog" }, |
169 | { }, | 169 | { }, |
170 | }; | 170 | }; |
171 | MODULE_DEVICE_TABLE(of, moxart_watchdog_match); | ||
171 | 172 | ||
172 | static struct platform_driver moxart_wdt_driver = { | 173 | static struct platform_driver moxart_wdt_driver = { |
173 | .probe = moxart_wdt_probe, | 174 | .probe = moxart_wdt_probe, |