2 * Copyright (C) ST-Ericsson AB 2010
3 * Contact: Sjur Brendeland / sjur.brandeland@stericsson.com
4 * Author: Amarnath Revanna / amarnath.bangalore.revanna@stericsson.com
5 * License terms: GNU General Public License (GPL) version 2
8 #define pr_fmt(fmt) KBUILD_MODNAME ":" fmt
10 #include <linux/init.h>
11 #include <linux/module.h>
12 #include <linux/netdevice.h>
13 #include <mach/mbox-db5500.h>
14 #include <net/caif/caif_shm.h>
16 MODULE_LICENSE("GPL");
17 MODULE_DESCRIPTION("CAIF Shared Memory protocol driver");
19 #define MAX_SHM_INSTANCES 1
27 static struct shmdev_layer shmdev_lyr
[MAX_SHM_INSTANCES
];
29 static unsigned int shm_start
;
30 static unsigned int shm_size
;
32 module_param(shm_size
, uint
, 0440);
33 MODULE_PARM_DESC(shm_total_size
, "Start of SHM shared memory");
35 module_param(shm_start
, uint
, 0440);
36 MODULE_PARM_DESC(shm_total_start
, "Total Size of SHM shared memory");
38 static int shmdev_send_msg(u32 dev_id
, u32 mbx_msg
)
40 /* Always block until msg is written successfully */
41 mbox_send(shmdev_lyr
[dev_id
].hmbx
, mbx_msg
, true);
45 static int shmdev_mbx_setup(void *pshmdrv_cb
, struct shmdev_layer
*pshm_dev
,
49 * For UX5500, we have only 1 SHM instance which uses MBX0
50 * for communication with the peer modem
52 pshm_dev
->hmbx
= mbox_setup(MBX_ACC0
, pshmdrv_cb
, pshm_drv
);
60 static int __init
caif_shmdev_init(void)
64 /* Loop is currently overkill, there is only one instance */
65 for (i
= 0; i
< MAX_SHM_INSTANCES
; i
++) {
67 shmdev_lyr
[i
].shm_base_addr
= shm_start
;
68 shmdev_lyr
[i
].shm_total_sz
= shm_size
;
70 if (((char *)shmdev_lyr
[i
].shm_base_addr
== NULL
)
71 || (shmdev_lyr
[i
].shm_total_sz
<= 0)) {
73 "Shared memory Address and/or Size incorrect"
74 ", Bailing out ...\n");
79 pr_info("SHM AREA (instance %d) STARTS"
80 " AT %p\n", i
, (char *)shmdev_lyr
[i
].shm_base_addr
);
82 shmdev_lyr
[i
].shm_id
= i
;
83 shmdev_lyr
[i
].pshmdev_mbxsend
= shmdev_send_msg
;
84 shmdev_lyr
[i
].pshmdev_mbxsetup
= shmdev_mbx_setup
;
87 * Finally, CAIF core module is called with details in place:
92 result
= caif_shmcore_probe(&shmdev_lyr
[i
]);
95 "Could not probe SHM core (instance %d)"
96 " Bailing out ...\n", result
, i
);
105 * For now, we assume that even if one instance of SHM fails, we bail
106 * out of the driver support completely. For this, we need to release
107 * any memory allocated and unregister any instance of SHM net device.
109 for (i
= 0; i
< MAX_SHM_INSTANCES
; i
++) {
110 if (shmdev_lyr
[i
].pshm_netdev
)
111 unregister_netdev(shmdev_lyr
[i
].pshm_netdev
);
116 static void __exit
caif_shmdev_exit(void)
120 for (i
= 0; i
< MAX_SHM_INSTANCES
; i
++) {
121 caif_shmcore_remove(shmdev_lyr
[i
].pshm_netdev
);
122 kfree((void *)shmdev_lyr
[i
].shm_base_addr
);
127 module_init(caif_shmdev_init
);
128 module_exit(caif_shmdev_exit
);