Skip to content

Commit 8448cef

Browse files
committed
Merge tag 'hsi-for-4.8' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-hsi
Pull HSI updates from Sebastian Reichel: - proper runtime pm support for omap-ssi and ssi-protocol - misc fixes * tag 'hsi-for-4.8' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-hsi: (24 commits) HSI: omap_ssi: drop pm_runtime_irq_safe HSI: omap_ssi_port: use rpm autosuspend API HSI: omap_ssi: call msg->complete() from process context HSI: omap_ssi_port: ensure clocks are kept enabled during transfer HSI: omap_ssi_port: replace pm_runtime_put_sync with non-sync variant HSI: omap_ssi_port: avoid calling runtime_pm_*_sync inside spinlock HSI: omap_ssi_port: avoid pm_runtime_get_sync in ssi_start_dma and ssi_start_pio HSI: omap_ssi_port: switch to threaded pio irq HSI: omap_ssi_core: remove pm_runtime_get_sync call from tasklet HSI: omap_ssi_core: use pm_runtime_put instead of pm_runtime_put_sync HSI: omap_ssi_port: prepare start_tx/stop_tx for blocking pm_runtime calls HSI: core: switch port event notifier from atomic to blocking HSI: omap_ssi_port: replace wkin_cken with atomic bitmap operations HSI: omap_ssi: convert cawake irq handler to thread HSI: ssi_protocol: fix ssip_xmit invocation HSI: ssi_protocol: replace spin_lock with spin_lock_bh HSI: ssi_protocol: avoid ssi_waketest call with held spinlock HSI: omap_ssi: do not reset module HSI: omap_ssi_port: remove useless newline hsi: Only descend into hsi directory when CONFIG_HSI is set ...
2 parents 818e607 + 9c99e5e commit 8448cef

File tree

10 files changed

+239
-190
lines changed

10 files changed

+239
-190
lines changed

Documentation/DocBook/device-drivers.tmpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,7 @@ X!Ilib/fonts/fonts.c
484484
</para>
485485

486486
!Iinclude/linux/hsi/hsi.h
487-
!Edrivers/hsi/hsi.c
487+
!Edrivers/hsi/hsi_core.c
488488
</chapter>
489489

490490
<chapter id="pwm">

drivers/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ obj-$(CONFIG_TARGET_CORE) += target/
7878
obj-$(CONFIG_MTD) += mtd/
7979
obj-$(CONFIG_SPI) += spi/
8080
obj-$(CONFIG_SPMI) += spmi/
81-
obj-y += hsi/
81+
obj-$(CONFIG_HSI) += hsi/
8282
obj-y += net/
8383
obj-$(CONFIG_ATM) += atm/
8484
obj-$(CONFIG_FUSION) += message/

drivers/hsi/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
#
22
# Makefile for HSI
33
#
4-
obj-$(CONFIG_HSI_BOARDINFO) += hsi_boardinfo.o
54
obj-$(CONFIG_HSI) += hsi.o
5+
hsi-objs := hsi_core.o
6+
hsi-$(CONFIG_HSI_BOARDINFO) += hsi_boardinfo.o
67
obj-y += controllers/
78
obj-y += clients/

drivers/hsi/clients/cmt_speech.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -444,8 +444,8 @@ static void cs_hsi_read_on_control_complete(struct hsi_msg *msg)
444444
hi->control_state &= ~SSI_CHANNEL_STATE_READING;
445445
if (msg->status == HSI_STATUS_ERROR) {
446446
dev_err(&hi->cl->device, "Control RX error detected\n");
447-
cs_hsi_control_read_error(hi, msg);
448447
spin_unlock(&hi->lock);
448+
cs_hsi_control_read_error(hi, msg);
449449
goto out;
450450
}
451451
dev_dbg(&hi->cl->device, "Read on control: %08X\n", cmd);
@@ -1275,7 +1275,7 @@ static int cs_char_mmap(struct file *file, struct vm_area_struct *vma)
12751275
if (vma->vm_end < vma->vm_start)
12761276
return -EINVAL;
12771277

1278-
if (((vma->vm_end - vma->vm_start) >> PAGE_SHIFT) != 1)
1278+
if (vma_pages(vma) != 1)
12791279
return -EINVAL;
12801280

12811281
vma->vm_flags |= VM_IO | VM_DONTDUMP | VM_DONTEXPAND;

drivers/hsi/clients/ssi_protocol.c

Lines changed: 65 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ void ssi_waketest(struct hsi_client *cl, unsigned int enable);
8888
#define SSIP_READY_CMD SSIP_CMD(SSIP_READY, 0)
8989
#define SSIP_SWBREAK_CMD SSIP_CMD(SSIP_SW_BREAK, 0)
9090

91+
#define SSIP_WAKETEST_FLAG 0
92+
9193
/* Main state machine states */
9294
enum {
9395
INIT,
@@ -116,7 +118,7 @@ enum {
116118
* @main_state: Main state machine
117119
* @send_state: TX state machine
118120
* @recv_state: RX state machine
119-
* @waketest: Flag to follow wake line test
121+
* @flags: Flags, currently only used to follow wake line test
120122
* @rxid: RX data id
121123
* @txid: TX data id
122124
* @txqueue_len: TX queue length
@@ -137,7 +139,7 @@ struct ssi_protocol {
137139
unsigned int main_state;
138140
unsigned int send_state;
139141
unsigned int recv_state;
140-
unsigned int waketest:1;
142+
unsigned long flags;
141143
u8 rxid;
142144
u8 txid;
143145
unsigned int txqueue_len;
@@ -148,6 +150,7 @@ struct ssi_protocol {
148150
struct net_device *netdev;
149151
struct list_head txqueue;
150152
struct list_head cmdqueue;
153+
struct work_struct work;
151154
struct hsi_client *cl;
152155
struct list_head link;
153156
atomic_t tx_usecnt;
@@ -405,15 +408,17 @@ static void ssip_reset(struct hsi_client *cl)
405408
spin_lock_bh(&ssi->lock);
406409
if (ssi->send_state != SEND_IDLE)
407410
hsi_stop_tx(cl);
408-
if (ssi->waketest)
409-
ssi_waketest(cl, 0);
411+
spin_unlock_bh(&ssi->lock);
412+
if (test_and_clear_bit(SSIP_WAKETEST_FLAG, &ssi->flags))
413+
ssi_waketest(cl, 0); /* FIXME: To be removed */
414+
spin_lock_bh(&ssi->lock);
410415
del_timer(&ssi->rx_wd);
411416
del_timer(&ssi->tx_wd);
412417
del_timer(&ssi->keep_alive);
413418
ssi->main_state = 0;
414419
ssi->send_state = 0;
415420
ssi->recv_state = 0;
416-
ssi->waketest = 0;
421+
ssi->flags = 0;
417422
ssi->rxid = 0;
418423
ssi->txid = 0;
419424
list_for_each_safe(head, tmp, &ssi->txqueue) {
@@ -437,7 +442,8 @@ static void ssip_dump_state(struct hsi_client *cl)
437442
dev_err(&cl->device, "Send state: %d\n", ssi->send_state);
438443
dev_err(&cl->device, "CMT %s\n", (ssi->main_state == ACTIVE) ?
439444
"Online" : "Offline");
440-
dev_err(&cl->device, "Wake test %d\n", ssi->waketest);
445+
dev_err(&cl->device, "Wake test %d\n",
446+
test_bit(SSIP_WAKETEST_FLAG, &ssi->flags));
441447
dev_err(&cl->device, "Data RX id: %d\n", ssi->rxid);
442448
dev_err(&cl->device, "Data TX id: %d\n", ssi->txid);
443449

@@ -515,17 +521,17 @@ static void ssip_start_rx(struct hsi_client *cl)
515521

516522
dev_dbg(&cl->device, "RX start M(%d) R(%d)\n", ssi->main_state,
517523
ssi->recv_state);
518-
spin_lock(&ssi->lock);
524+
spin_lock_bh(&ssi->lock);
519525
/*
520526
* We can have two UP events in a row due to a short low
521527
* high transition. Therefore we need to ignore the sencond UP event.
522528
*/
523529
if ((ssi->main_state != ACTIVE) || (ssi->recv_state == RECV_READY)) {
524-
spin_unlock(&ssi->lock);
530+
spin_unlock_bh(&ssi->lock);
525531
return;
526532
}
527533
ssip_set_rxstate(ssi, RECV_READY);
528-
spin_unlock(&ssi->lock);
534+
spin_unlock_bh(&ssi->lock);
529535

530536
msg = ssip_claim_cmd(ssi);
531537
ssip_set_cmd(msg, SSIP_READY_CMD);
@@ -539,10 +545,10 @@ static void ssip_stop_rx(struct hsi_client *cl)
539545
struct ssi_protocol *ssi = hsi_client_drvdata(cl);
540546

541547
dev_dbg(&cl->device, "RX stop M(%d)\n", ssi->main_state);
542-
spin_lock(&ssi->lock);
548+
spin_lock_bh(&ssi->lock);
543549
if (likely(ssi->main_state == ACTIVE))
544550
ssip_set_rxstate(ssi, RECV_IDLE);
545-
spin_unlock(&ssi->lock);
551+
spin_unlock_bh(&ssi->lock);
546552
}
547553

548554
static void ssip_free_strans(struct hsi_msg *msg)
@@ -559,9 +565,9 @@ static void ssip_strans_complete(struct hsi_msg *msg)
559565

560566
data = msg->context;
561567
ssip_release_cmd(msg);
562-
spin_lock(&ssi->lock);
568+
spin_lock_bh(&ssi->lock);
563569
ssip_set_txstate(ssi, SENDING);
564-
spin_unlock(&ssi->lock);
570+
spin_unlock_bh(&ssi->lock);
565571
hsi_async_write(cl, data);
566572
}
567573

@@ -666,15 +672,17 @@ static void ssip_rx_bootinforeq(struct hsi_client *cl, u32 cmd)
666672
/* Fall through */
667673
case INIT:
668674
case HANDSHAKE:
669-
spin_lock(&ssi->lock);
675+
spin_lock_bh(&ssi->lock);
670676
ssi->main_state = HANDSHAKE;
671-
if (!ssi->waketest) {
672-
ssi->waketest = 1;
677+
spin_unlock_bh(&ssi->lock);
678+
679+
if (!test_and_set_bit(SSIP_WAKETEST_FLAG, &ssi->flags))
673680
ssi_waketest(cl, 1); /* FIXME: To be removed */
674-
}
681+
682+
spin_lock_bh(&ssi->lock);
675683
/* Start boot handshake watchdog */
676684
mod_timer(&ssi->tx_wd, jiffies + msecs_to_jiffies(SSIP_WDTOUT));
677-
spin_unlock(&ssi->lock);
685+
spin_unlock_bh(&ssi->lock);
678686
dev_dbg(&cl->device, "Send BOOTINFO_RESP\n");
679687
if (SSIP_DATA_VERSION(cmd) != SSIP_LOCAL_VERID)
680688
dev_warn(&cl->device, "boot info req verid mismatch\n");
@@ -696,35 +704,37 @@ static void ssip_rx_bootinforesp(struct hsi_client *cl, u32 cmd)
696704
if (SSIP_DATA_VERSION(cmd) != SSIP_LOCAL_VERID)
697705
dev_warn(&cl->device, "boot info resp verid mismatch\n");
698706

699-
spin_lock(&ssi->lock);
707+
spin_lock_bh(&ssi->lock);
700708
if (ssi->main_state != ACTIVE)
701709
/* Use tx_wd as a boot watchdog in non ACTIVE state */
702710
mod_timer(&ssi->tx_wd, jiffies + msecs_to_jiffies(SSIP_WDTOUT));
703711
else
704712
dev_dbg(&cl->device, "boot info resp ignored M(%d)\n",
705713
ssi->main_state);
706-
spin_unlock(&ssi->lock);
714+
spin_unlock_bh(&ssi->lock);
707715
}
708716

709717
static void ssip_rx_waketest(struct hsi_client *cl, u32 cmd)
710718
{
711719
struct ssi_protocol *ssi = hsi_client_drvdata(cl);
712720
unsigned int wkres = SSIP_PAYLOAD(cmd);
713721

714-
spin_lock(&ssi->lock);
722+
spin_lock_bh(&ssi->lock);
715723
if (ssi->main_state != HANDSHAKE) {
716724
dev_dbg(&cl->device, "wake lines test ignored M(%d)\n",
717725
ssi->main_state);
718-
spin_unlock(&ssi->lock);
726+
spin_unlock_bh(&ssi->lock);
719727
return;
720728
}
721-
if (ssi->waketest) {
722-
ssi->waketest = 0;
729+
spin_unlock_bh(&ssi->lock);
730+
731+
if (test_and_clear_bit(SSIP_WAKETEST_FLAG, &ssi->flags))
723732
ssi_waketest(cl, 0); /* FIXME: To be removed */
724-
}
733+
734+
spin_lock_bh(&ssi->lock);
725735
ssi->main_state = ACTIVE;
726736
del_timer(&ssi->tx_wd); /* Stop boot handshake timer */
727-
spin_unlock(&ssi->lock);
737+
spin_unlock_bh(&ssi->lock);
728738

729739
dev_notice(&cl->device, "WAKELINES TEST %s\n",
730740
wkres & SSIP_WAKETEST_FAILED ? "FAILED" : "OK");
@@ -741,20 +751,20 @@ static void ssip_rx_ready(struct hsi_client *cl)
741751
{
742752
struct ssi_protocol *ssi = hsi_client_drvdata(cl);
743753

744-
spin_lock(&ssi->lock);
754+
spin_lock_bh(&ssi->lock);
745755
if (unlikely(ssi->main_state != ACTIVE)) {
746756
dev_dbg(&cl->device, "READY on wrong state: S(%d) M(%d)\n",
747757
ssi->send_state, ssi->main_state);
748-
spin_unlock(&ssi->lock);
758+
spin_unlock_bh(&ssi->lock);
749759
return;
750760
}
751761
if (ssi->send_state != WAIT4READY) {
752762
dev_dbg(&cl->device, "Ignore spurious READY command\n");
753-
spin_unlock(&ssi->lock);
763+
spin_unlock_bh(&ssi->lock);
754764
return;
755765
}
756766
ssip_set_txstate(ssi, SEND_READY);
757-
spin_unlock(&ssi->lock);
767+
spin_unlock_bh(&ssi->lock);
758768
ssip_xmit(cl);
759769
}
760770

@@ -766,22 +776,22 @@ static void ssip_rx_strans(struct hsi_client *cl, u32 cmd)
766776
int len = SSIP_PDU_LENGTH(cmd);
767777

768778
dev_dbg(&cl->device, "RX strans: %d frames\n", len);
769-
spin_lock(&ssi->lock);
779+
spin_lock_bh(&ssi->lock);
770780
if (unlikely(ssi->main_state != ACTIVE)) {
771781
dev_err(&cl->device, "START TRANS wrong state: S(%d) M(%d)\n",
772782
ssi->send_state, ssi->main_state);
773-
spin_unlock(&ssi->lock);
783+
spin_unlock_bh(&ssi->lock);
774784
return;
775785
}
776786
ssip_set_rxstate(ssi, RECEIVING);
777787
if (unlikely(SSIP_MSG_ID(cmd) != ssi->rxid)) {
778788
dev_err(&cl->device, "START TRANS id %d expected %d\n",
779789
SSIP_MSG_ID(cmd), ssi->rxid);
780-
spin_unlock(&ssi->lock);
790+
spin_unlock_bh(&ssi->lock);
781791
goto out1;
782792
}
783793
ssi->rxid++;
784-
spin_unlock(&ssi->lock);
794+
spin_unlock_bh(&ssi->lock);
785795
skb = netdev_alloc_skb(ssi->netdev, len * 4);
786796
if (unlikely(!skb)) {
787797
dev_err(&cl->device, "No memory for rx skb\n");
@@ -849,17 +859,17 @@ static void ssip_swbreak_complete(struct hsi_msg *msg)
849859
struct ssi_protocol *ssi = hsi_client_drvdata(cl);
850860

851861
ssip_release_cmd(msg);
852-
spin_lock(&ssi->lock);
862+
spin_lock_bh(&ssi->lock);
853863
if (list_empty(&ssi->txqueue)) {
854864
if (atomic_read(&ssi->tx_usecnt)) {
855865
ssip_set_txstate(ssi, SEND_READY);
856866
} else {
857867
ssip_set_txstate(ssi, SEND_IDLE);
858868
hsi_stop_tx(cl);
859869
}
860-
spin_unlock(&ssi->lock);
870+
spin_unlock_bh(&ssi->lock);
861871
} else {
862-
spin_unlock(&ssi->lock);
872+
spin_unlock_bh(&ssi->lock);
863873
ssip_xmit(cl);
864874
}
865875
netif_wake_queue(ssi->netdev);
@@ -876,17 +886,17 @@ static void ssip_tx_data_complete(struct hsi_msg *msg)
876886
ssip_error(cl);
877887
goto out;
878888
}
879-
spin_lock(&ssi->lock);
889+
spin_lock_bh(&ssi->lock);
880890
if (list_empty(&ssi->txqueue)) {
881891
ssip_set_txstate(ssi, SENDING_SWBREAK);
882-
spin_unlock(&ssi->lock);
892+
spin_unlock_bh(&ssi->lock);
883893
cmsg = ssip_claim_cmd(ssi);
884894
ssip_set_cmd(cmsg, SSIP_SWBREAK_CMD);
885895
cmsg->complete = ssip_swbreak_complete;
886896
dev_dbg(&cl->device, "Send SWBREAK\n");
887897
hsi_async_write(cl, cmsg);
888898
} else {
889-
spin_unlock(&ssi->lock);
899+
spin_unlock_bh(&ssi->lock);
890900
ssip_xmit(cl);
891901
}
892902
out:
@@ -926,11 +936,11 @@ static int ssip_pn_open(struct net_device *dev)
926936
}
927937
dev_dbg(&cl->device, "Configuring SSI port\n");
928938
hsi_setup(cl);
929-
spin_lock_bh(&ssi->lock);
930-
if (!ssi->waketest) {
931-
ssi->waketest = 1;
939+
940+
if (!test_and_set_bit(SSIP_WAKETEST_FLAG, &ssi->flags))
932941
ssi_waketest(cl, 1); /* FIXME: To be removed */
933-
}
942+
943+
spin_lock_bh(&ssi->lock);
934944
ssi->main_state = HANDSHAKE;
935945
spin_unlock_bh(&ssi->lock);
936946

@@ -959,6 +969,15 @@ static int ssip_pn_set_mtu(struct net_device *dev, int new_mtu)
959969
return 0;
960970
}
961971

972+
static void ssip_xmit_work(struct work_struct *work)
973+
{
974+
struct ssi_protocol *ssi =
975+
container_of(work, struct ssi_protocol, work);
976+
struct hsi_client *cl = ssi->cl;
977+
978+
ssip_xmit(cl);
979+
}
980+
962981
static int ssip_pn_xmit(struct sk_buff *skb, struct net_device *dev)
963982
{
964983
struct hsi_client *cl = to_hsi_client(dev->dev.parent);
@@ -1011,7 +1030,7 @@ static int ssip_pn_xmit(struct sk_buff *skb, struct net_device *dev)
10111030
dev_dbg(&cl->device, "Start TX on SEND READY qlen %d\n",
10121031
ssi->txqueue_len);
10131032
spin_unlock_bh(&ssi->lock);
1014-
ssip_xmit(cl);
1033+
schedule_work(&ssi->work);
10151034
} else {
10161035
spin_unlock_bh(&ssi->lock);
10171036
}
@@ -1088,6 +1107,7 @@ static int ssi_protocol_probe(struct device *dev)
10881107
atomic_set(&ssi->tx_usecnt, 0);
10891108
hsi_client_set_drvdata(cl, ssi);
10901109
ssi->cl = cl;
1110+
INIT_WORK(&ssi->work, ssip_xmit_work);
10911111

10921112
ssi->channel_id_cmd = hsi_get_channel_id_by_name(cl, "mcsaab-control");
10931113
if (ssi->channel_id_cmd < 0) {

0 commit comments

Comments
 (0)