aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/mach-msm/Kconfig24
-rw-r--r--arch/arm/mach-msm/smd.c44
-rw-r--r--arch/arm/mach-msm/smd_private.h58
3 files changed, 78 insertions, 48 deletions
diff --git a/arch/arm/mach-msm/Kconfig b/arch/arm/mach-msm/Kconfig
index 7cee7913f6f7..e73e9d17ca2e 100644
--- a/arch/arm/mach-msm/Kconfig
+++ b/arch/arm/mach-msm/Kconfig
@@ -1,5 +1,21 @@
1if ARCH_MSM 1if ARCH_MSM
2 2
3choice
4 prompt "Qualcomm MSM SoC Type"
5 default ARCH_MSM7X00A
6
7config ARCH_MSM7X00A
8 bool "MSM7x00A / MSM7x01A"
9 select ARCH_MSM_ARM11
10 select MSM_SMD_PKG3
11 select CPU_V6
12
13endchoice
14
15config ARCH_MSM_ARM11
16 bool
17
18
3comment "MSM Board Type" 19comment "MSM Board Type"
4 depends on ARCH_MSM 20 depends on ARCH_MSM
5 21
@@ -28,20 +44,22 @@ choice
28endchoice 44endchoice
29 45
30config MACH_HALIBUT 46config MACH_HALIBUT
31 depends on ARCH_MSM 47 depends on ARCH_MSM7X00A
32 select CPU_V6
33 default y 48 default y
34 bool "Halibut Board (QCT SURF7201A)" 49 bool "Halibut Board (QCT SURF7201A)"
35 help 50 help
36 Support for the Qualcomm SURF7201A eval board. 51 Support for the Qualcomm SURF7201A eval board.
37 52
38config MACH_TROUT 53config MACH_TROUT
39 select CPU_V6 54 depends on ARCH_MSM7X00A
40 default y 55 default y
41 bool "HTC Dream (aka trout)" 56 bool "HTC Dream (aka trout)"
42 help 57 help
43 Support for the HTC Dream, T-Mobile G1, Android ADP1 devices. 58 Support for the HTC Dream, T-Mobile G1, Android ADP1 devices.
44 59
60config MSM_SMD_PKG3
61 bool
62
45config MSM_SMD 63config MSM_SMD
46 default y 64 default y
47 bool "MSM Shared Memory Driver (SMD)" 65 bool "MSM Shared Memory Driver (SMD)"
diff --git a/arch/arm/mach-msm/smd.c b/arch/arm/mach-msm/smd.c
index b864592cbe05..130b7a72bea1 100644
--- a/arch/arm/mach-msm/smd.c
+++ b/arch/arm/mach-msm/smd.c
@@ -605,48 +605,6 @@ static int smd_packet_read(smd_channel_t *ch, void *data, int len)
605 return r; 605 return r;
606} 606}
607 607
608static int smd_alloc_v2(struct smd_channel *ch)
609{
610 struct smd_shared_v2 *shared2;
611 void *buffer;
612 unsigned buffer_sz;
613
614 shared2 = smem_alloc(SMEM_SMD_BASE_ID + ch->n, sizeof(*shared2));
615 buffer = smem_item(SMEM_SMD_FIFO_BASE_ID + ch->n, &buffer_sz);
616
617 if (!buffer)
618 return -1;
619
620 /* buffer must be a power-of-two size */
621 if (buffer_sz & (buffer_sz - 1))
622 return -1;
623
624 buffer_sz /= 2;
625 ch->send = &shared2->ch0;
626 ch->recv = &shared2->ch1;
627 ch->send_data = buffer;
628 ch->recv_data = buffer + buffer_sz;
629 ch->fifo_size = buffer_sz;
630 return 0;
631}
632
633static int smd_alloc_v1(struct smd_channel *ch)
634{
635 struct smd_shared_v1 *shared1;
636 shared1 = smem_alloc(ID_SMD_CHANNELS + ch->n, sizeof(*shared1));
637 if (!shared1) {
638 pr_err("smd_alloc_channel() cid %d does not exist\n", ch->n);
639 return -1;
640 }
641 ch->send = &shared1->ch0;
642 ch->recv = &shared1->ch1;
643 ch->send_data = shared1->data0;
644 ch->recv_data = shared1->data1;
645 ch->fifo_size = SMD_BUF_SIZE;
646 return 0;
647}
648
649
650static int smd_alloc_channel(const char *name, uint32_t cid, uint32_t type) 608static int smd_alloc_channel(const char *name, uint32_t cid, uint32_t type)
651{ 609{
652 struct smd_channel *ch; 610 struct smd_channel *ch;
@@ -658,7 +616,7 @@ static int smd_alloc_channel(const char *name, uint32_t cid, uint32_t type)
658 } 616 }
659 ch->n = cid; 617 ch->n = cid;
660 618
661 if (smd_alloc_v2(ch) && smd_alloc_v1(ch)) { 619 if (_smd_alloc_channel(ch)) {
662 kfree(ch); 620 kfree(ch);
663 return -1; 621 return -1;
664 } 622 }
diff --git a/arch/arm/mach-msm/smd_private.h b/arch/arm/mach-msm/smd_private.h
index 33a33f1b01f8..3d337ce35a61 100644
--- a/arch/arm/mach-msm/smd_private.h
+++ b/arch/arm/mach-msm/smd_private.h
@@ -61,7 +61,7 @@ struct smem_shared {
61#define SMSM_V1_SIZE (sizeof(unsigned) * 8) 61#define SMSM_V1_SIZE (sizeof(unsigned) * 8)
62#define SMSM_V2_SIZE (sizeof(unsigned) * 4) 62#define SMSM_V2_SIZE (sizeof(unsigned) * 4)
63 63
64#ifndef CONFIG_ARCH_MSM_SCORPION 64#ifdef CONFIG_MSM_SMD_PKG3
65struct smsm_interrupt_info { 65struct smsm_interrupt_info {
66 uint32_t interrupt_mask; 66 uint32_t interrupt_mask;
67 uint32_t pending_interrupts; 67 uint32_t pending_interrupts;
@@ -123,7 +123,7 @@ struct msm_dem_slave_data {
123#define SMSM_WKUP_REASON_ALARM 0x00000010 123#define SMSM_WKUP_REASON_ALARM 0x00000010
124#define SMSM_WKUP_REASON_RESET 0x00000020 124#define SMSM_WKUP_REASON_RESET 0x00000020
125 125
126#ifndef CONFIG_ARCH_MSM_SCORPION 126#ifdef CONFIG_ARCH_MSM7X00A
127enum smsm_state_item { 127enum smsm_state_item {
128 SMSM_STATE_APPS = 1, 128 SMSM_STATE_APPS = 1,
129 SMSM_STATE_MODEM = 3, 129 SMSM_STATE_MODEM = 3,
@@ -265,6 +265,7 @@ struct smd_half_channel {
265 unsigned head; 265 unsigned head;
266} __attribute__(( aligned(4), packed )); 266} __attribute__(( aligned(4), packed ));
267 267
268/* Only used on SMD package v3 on msm7201a */
268struct smd_shared_v1 { 269struct smd_shared_v1 {
269 struct smd_half_channel ch0; 270 struct smd_half_channel ch0;
270 unsigned char data0[SMD_BUF_SIZE]; 271 unsigned char data0[SMD_BUF_SIZE];
@@ -272,6 +273,7 @@ struct smd_shared_v1 {
272 unsigned char data1[SMD_BUF_SIZE]; 273 unsigned char data1[SMD_BUF_SIZE];
273}; 274};
274 275
276/* Used on SMD package v4 */
275struct smd_shared_v2 { 277struct smd_shared_v2 {
276 struct smd_half_channel ch0; 278 struct smd_half_channel ch0;
277 struct smd_half_channel ch1; 279 struct smd_half_channel ch1;
@@ -330,4 +332,56 @@ uint32_t raw_smsm_get_state(enum smsm_state_item item);
330 332
331extern void msm_init_last_radio_log(struct module *); 333extern void msm_init_last_radio_log(struct module *);
332 334
335#ifdef CONFIG_MSM_SMD_PKG3
336/*
337 * This allocator assumes an SMD Package v3 which only exists on
338 * MSM7x00 SoC's.
339 */
340static inline int _smd_alloc_channel(struct smd_channel *ch)
341{
342 struct smd_shared_v1 *shared1;
343
344 shared1 = smem_alloc(ID_SMD_CHANNELS + ch->n, sizeof(*shared1));
345 if (!shared1) {
346 pr_err("smd_alloc_channel() cid %d does not exist\n", ch->n);
347 return -1;
348 }
349 ch->send = &shared1->ch0;
350 ch->recv = &shared1->ch1;
351 ch->send_data = shared1->data0;
352 ch->recv_data = shared1->data1;
353 ch->fifo_size = SMD_BUF_SIZE;
354 return 0;
355}
356#else
357/*
358 * This allocator assumes an SMD Package v4, the most common
359 * and the default.
360 */
361static inline int _smd_alloc_channel(struct smd_channel *ch)
362{
363 struct smd_shared_v2 *shared2;
364 void *buffer;
365 unsigned buffer_sz;
366
367 shared2 = smem_alloc(SMEM_SMD_BASE_ID + ch->n, sizeof(*shared2));
368 buffer = smem_item(SMEM_SMD_FIFO_BASE_ID + ch->n, &buffer_sz);
369
370 if (!buffer)
371 return -1;
372
373 /* buffer must be a power-of-two size */
374 if (buffer_sz & (buffer_sz - 1))
375 return -1;
376
377 buffer_sz /= 2;
378 ch->send = &shared2->ch0;
379 ch->recv = &shared2->ch1;
380 ch->send_data = buffer;
381 ch->recv_data = buffer + buffer_sz;
382 ch->fifo_size = buffer_sz;
383 return 0;
384}
385#endif /* CONFIG_MSM_SMD_PKG3 */
386
333#endif 387#endif