aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>2020-02-21 05:24:36 +0100
committerDenis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>2020-07-16 06:15:54 +0200
commit0fbf8eb1dd1c68569d19c4e6333ba049c8a420a8 (patch)
treee4a2aebf78e4ce9243eda5cf7c499902c7c11755
parent97321a09aa9b0de128d306e994f7129a57f5bf91 (diff)
downloadhardware_replicant_libsamsung-ipc-patches-todo/modem-abstraction-wip-rebase-3.tar.gz
hardware_replicant_libsamsung-ipc-patches-todo/modem-abstraction-wip-rebase-3.tar.bz2
hardware_replicant_libsamsung-ipc-patches-todo/modem-abstraction-wip-rebase-3.zip
Some xmm626_kernel_smdk4412 functions are present for all devices: - open|close|read|write|poll - fmt/rfs - gprs - power Thses are not +----------+ | galaxys2 | | hci_power | link_control_enable | link_control_active | link_connected_wait | link_get_hostwake_wait | | | i9300 | | hci_power | link_control_enable | link_control_active | link_connected_wait | link_get_hostwake_wait | | | maguro | boot_power | | | | | | status_online_wait | | n5100 | | hci_power | link_control_enable | link_control_active | link_connected_wait | link_get_hostwake_wait | | | n7100 | | hci_power | link_control_enable | link_control_active | link_connected_wait | link_get_hostwake_wait | | | piranha | | | | | | | | +----------+ TODO: - don't add the python script to this commit or clean it up - cleanup style - Verify if we need to convert all boards in this commit - Look if i9300 changes should go in this commit Signed-off-by: Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
-rw-r--r--Android.mk1
-rw-r--r--samsung-ipc/Makefile.am12
-rw-r--r--samsung-ipc/devices/galaxys2/galaxys2.c2
-rw-r--r--samsung-ipc/devices/i9300/i9300.c2
-rw-r--r--samsung-ipc/devices/ipc_devices.h1
-rw-r--r--samsung-ipc/devices/maguro/maguro.c2
-rw-r--r--samsung-ipc/devices/n5100/n5100.c2
-rw-r--r--samsung-ipc/devices/n7100/n7100.c2
-rw-r--r--samsung-ipc/devices/piranha/piranha.c2
-rw-r--r--samsung-ipc/ipc.c1
-rw-r--r--samsung-ipc/ipc.h44
-rw-r--r--samsung-ipc/modems/modem.c194
-rw-r--r--samsung-ipc/modems/modem.h35
-rw-r--r--samsung-ipc/modems/xmm626/hsic/hsic.c (renamed from samsung-ipc/modems/xmm626/xmm626_hsic.c)42
-rw-r--r--samsung-ipc/modems/xmm626/hsic/hsic.h (renamed from samsung-ipc/modems/xmm626/xmm626_hsic.h)3
-rw-r--r--samsung-ipc/modems/xmm626/hsic/xmm626_modem_link_device_hsic.h (renamed from samsung-ipc/modems/xmm626/xmm626_modem_link_device_hsic.h)0
-rw-r--r--samsung-ipc/modems/xmm626/kernel_smdk4412.c (renamed from samsung-ipc/modems/xmm626/xmm626_kernel_smdk4412.c)3
-rw-r--r--samsung-ipc/modems/xmm626/mipi/mipi.c (renamed from samsung-ipc/modems/xmm626/xmm626_mipi.c)40
-rw-r--r--samsung-ipc/modems/xmm626/mipi/xmm626_mipi.h (renamed from samsung-ipc/modems/xmm626/xmm626_mipi.h)2
-rwxr-xr-xscripts/smdk4412_func_usage.py85
20 files changed, 452 insertions, 23 deletions
diff --git a/Android.mk b/Android.mk
index 63207e4..bb20dfa 100644
--- a/Android.mk
+++ b/Android.mk
@@ -52,6 +52,7 @@ endif
libsamsung_ipc_local_src_files := \
samsung-ipc/ipc.c \
samsung-ipc/ipc_utils.c \
+ samsung-ipc/modems/modem.c \
samsung-ipc/modems/xmm616/xmm616.c \
samsung-ipc/modems/xmm626/xmm626.c \
samsung-ipc/modems/xmm626/xmm626_hsic.c \
diff --git a/samsung-ipc/Makefile.am b/samsung-ipc/Makefile.am
index f71e396..2b89bc0 100644
--- a/samsung-ipc/Makefile.am
+++ b/samsung-ipc/Makefile.am
@@ -18,16 +18,18 @@ libsamsung_ipc_la_SOURCES = \
ipc.c \
ipc.h \
ipc_utils.c \
+ modems/modem.c \
+ modems/modem.h \
modems/xmm616/xmm616.c \
modems/xmm616/xmm616.h \
modems/xmm626/xmm626.c \
modems/xmm626/xmm626.h \
- modems/xmm626/xmm626_hsic.c \
- modems/xmm626/xmm626_hsic.h \
- modems/xmm626/xmm626_kernel_smdk4412.c \
+ modems/xmm626/hsic/hsic.c \
+ modems/xmm626/hsic/xmm626_hsic.h \
+ modems/xmm626/kernel_smdk4412.c \
modems/xmm626/xmm626_kernel_smdk4412.h \
- modems/xmm626/xmm626_mipi.c \
- modems/xmm626/xmm626_mipi.h \
+ modems/xmm626/mipi/mipi.c \
+ modems/xmm626/mipi/xmm626_mipi.h \
modems/xmm626/xmm626_modem.h \
modems/xmm626/xmm626_modem_link_device_hsic.h \
modems/xmm626/xmm626_modem_prj.h \
diff --git a/samsung-ipc/devices/galaxys2/galaxys2.c b/samsung-ipc/devices/galaxys2/galaxys2.c
index cdfe20c..296feac 100644
--- a/samsung-ipc/devices/galaxys2/galaxys2.c
+++ b/samsung-ipc/devices/galaxys2/galaxys2.c
@@ -28,7 +28,7 @@
#include "ipc.h"
#include "devices/galaxys2/galaxys2.h"
#include "modems/xmm626/xmm626.h"
-#include "modems/xmm626/xmm626_hsic.h"
+#include "modems/xmm626/hsic/hsic.h"
#include "modems/xmm626/xmm626_kernel_smdk4412.h"
int galaxys2_boot(struct ipc_client *client)
diff --git a/samsung-ipc/devices/i9300/i9300.c b/samsung-ipc/devices/i9300/i9300.c
index 85709a8..355ff62 100644
--- a/samsung-ipc/devices/i9300/i9300.c
+++ b/samsung-ipc/devices/i9300/i9300.c
@@ -28,7 +28,7 @@
#include "ipc.h"
#include "devices/i9300/i9300.h"
#include "modems/xmm626/xmm626.h"
-#include "modems/xmm626/xmm626_hsic.h"
+#include "modems/xmm626/hsic/hsic.h"
#include "modems/xmm626/xmm626_kernel_smdk4412.h"
int i9300_boot(struct ipc_client *client)
diff --git a/samsung-ipc/devices/ipc_devices.h b/samsung-ipc/devices/ipc_devices.h
index 176607c..17a40b8 100644
--- a/samsung-ipc/devices/ipc_devices.h
+++ b/samsung-ipc/devices/ipc_devices.h
@@ -42,6 +42,7 @@ struct ipc_device_desc {
struct ipc_client_handlers *handlers;
struct ipc_client_gprs_specs *gprs_specs;
struct ipc_client_nv_data_specs *nv_data_specs;
+ struct ipc_client_modem_driver_ops *modem_driver_ops;
};
extern struct ipc_device_desc ipc_devices[];
diff --git a/samsung-ipc/devices/maguro/maguro.c b/samsung-ipc/devices/maguro/maguro.c
index a2db5fc..e6cd191 100644
--- a/samsung-ipc/devices/maguro/maguro.c
+++ b/samsung-ipc/devices/maguro/maguro.c
@@ -30,7 +30,7 @@
#include "devices/maguro/maguro.h"
#include "modems/xmm626/xmm626.h"
#include "modems/xmm626/xmm626_kernel_smdk4412.h"
-#include "modems/xmm626/xmm626_mipi.h"
+#include "modems/xmm626/mipi/xmm626_mipi.h"
int maguro_boot(struct ipc_client *client)
{
diff --git a/samsung-ipc/devices/n5100/n5100.c b/samsung-ipc/devices/n5100/n5100.c
index 0abe896..5489fb6 100644
--- a/samsung-ipc/devices/n5100/n5100.c
+++ b/samsung-ipc/devices/n5100/n5100.c
@@ -29,7 +29,7 @@
#include "ipc.h"
#include "devices/n5100/n5100.h"
#include "modems/xmm626/xmm626.h"
-#include "modems/xmm626/xmm626_hsic.h"
+#include "modems/xmm626/hsic/hsic.h"
#include "modems/xmm626/xmm626_kernel_smdk4412.h"
int n5100_boot(struct ipc_client *client)
diff --git a/samsung-ipc/devices/n7100/n7100.c b/samsung-ipc/devices/n7100/n7100.c
index d5091a2..4713e00 100644
--- a/samsung-ipc/devices/n7100/n7100.c
+++ b/samsung-ipc/devices/n7100/n7100.c
@@ -28,7 +28,7 @@
#include "ipc.h"
#include "devices/n7100/n7100.h"
#include "modems/xmm626/xmm626.h"
-#include "modems/xmm626/xmm626_hsic.h"
+#include "modems/xmm626/hsic/hsic.h"
#include "modems/xmm626/xmm626_kernel_smdk4412.h"
int n7100_boot(struct ipc_client *client)
diff --git a/samsung-ipc/devices/piranha/piranha.c b/samsung-ipc/devices/piranha/piranha.c
index 839b3ce..a98e1cb 100644
--- a/samsung-ipc/devices/piranha/piranha.c
+++ b/samsung-ipc/devices/piranha/piranha.c
@@ -29,7 +29,7 @@
#include "devices/piranha/piranha.h"
#include "modems/xmm626/xmm626.h"
#include "modems/xmm626/xmm626_kernel_smdk4412.h"
-#include "modems/xmm626/xmm626_mipi.h"
+#include "modems/xmm626/mipi/xmm626_mipi.h"
int piranha_boot(struct ipc_client *client)
{
diff --git a/samsung-ipc/ipc.c b/samsung-ipc/ipc.c
index c116fbb..efdd5d2 100644
--- a/samsung-ipc/ipc.c
+++ b/samsung-ipc/ipc.c
@@ -214,6 +214,7 @@ static struct ipc_client *ipc_transport_client_create(int type)
client->gprs_specs = ipc_devices[device_index].gprs_specs;
client->nv_data_specs = ipc_devices[device_index].nv_data_specs;
+ client->modem_driver_ops = ipc_devices[device_index].modem_driver_ops;
/* Handlers can be modified */
client->handlers = (struct ipc_client_handlers *) calloc(
diff --git a/samsung-ipc/ipc.h b/samsung-ipc/ipc.h
index 1cfa757..dfeea11 100644
--- a/samsung-ipc/ipc.h
+++ b/samsung-ipc/ipc.h
@@ -78,6 +78,49 @@ struct ipc_client_gprs_specs {
struct ipc_client_gprs_capabilities *capabilities);
};
+struct ipc_client_modem_driver_ops {
+ int (*power)(struct ipc_client *client, int device_fd, int power);
+ int (*download_enable)(struct ipc_client *client, int device_fd,
+ int enable);
+ int (*bus_power)(struct ipc_client *client, int power);
+ int (*link_control_enable)(struct ipc_client *client, int device_fd,
+ int enable);
+ int (*link_control_active)(struct ipc_client *client, int device_fd,
+ int active);
+ int (*link_connected_wait)(struct ipc_client *client, int device_fd);
+ int (*link_get_hostwake_wait)(struct ipc_client *client, int device_fd);
+ int (*wait_status_online)(
+ __attribute__((unused)) struct ipc_client *client,
+ int device_fd);
+ int (*open)(struct ipc_client *client, int type);
+ int (*close)(struct ipc_client *client, int fd);
+ int (*read)(struct ipc_client *client, int fd, void *buffer,
+ size_t length);
+ int (*write)(struct ipc_client *client, int fd, const void *buffer,
+ size_t length);
+ int (*poll)(struct ipc_client *client, int fd, struct ipc_poll_fds *fds,
+ struct timeval *timeout);
+
+ int (*fmt_send)(struct ipc_client *client, struct ipc_message *message);
+ int (*fmt_recv)(struct ipc_client *client, struct ipc_message *message);
+ int (*rfs_send)(struct ipc_client *client, struct ipc_message *message);
+ int (*rfs_recv)(struct ipc_client *client, struct ipc_message *message);
+ //TODO: find a better name not to conflict with fmt/rfs send
+ // like block-data send (used for firmware)
+ // what about firmware->MAIN
+ // and data_send firmware_send
+ // or send_partition
+ // or send_block
+ int (*data_send)(struct ipc_client *client, int device_fd, const void *data,
+ size_t size, int address);
+
+ char * (*gprs_get_iface)(struct ipc_client *client, unsigned int cid);
+ int (*gprs_get_capabilities)(
+ struct ipc_client *client,
+ struct ipc_client_gprs_capabilities *capabilities);
+};
+
+
struct ipc_client_nv_data_specs {
char *nv_data_path;
char *nv_data_md5_path;
@@ -98,6 +141,7 @@ struct ipc_client {
struct ipc_client_handlers *handlers;
struct ipc_client_gprs_specs *gprs_specs;
struct ipc_client_nv_data_specs *nv_data_specs;
+ struct ipc_client_modem_driver_ops *modem_driver_ops;
};
/*
diff --git a/samsung-ipc/modems/modem.c b/samsung-ipc/modems/modem.c
new file mode 100644
index 0000000..82a6ca7
--- /dev/null
+++ b/samsung-ipc/modems/modem.c
@@ -0,0 +1,194 @@
+/*
+ * This file is part of libsamsung-ipc.
+ *
+ * Copyright (C) 2020 Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
+ *
+ * libsamsung-ipc is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * libsamsung-ipc is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with libsamsung-ipc. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <ipc.h>
+
+/* Set the modem into download mode */
+int modem_download_enable(struct ipc_client *client, int device_fd, int enable)
+{
+ return client->modem_driver_ops->download_enable(client, device_fd,
+ enable);
+}
+
+/* Power on/off the modem */
+int modem_power(struct ipc_client *client, int device_fd, int power)
+{
+ return client->modem_driver_ops->power(client, device_fd, power);
+}
+
+/* Power on/off the modem bus (HSIC, MIPI, etc) */
+int modem_bus_power(struct ipc_client *client, int power)
+{
+ return client->modem_driver_ops->bus_power(client, power);
+}
+
+// TODO
+int modem_link_control_enable(struct ipc_client *client, int device_fd,
+ int enable)
+{
+ return client->modem_driver_ops->link_control_enable(client, device_fd,
+ enable);
+}
+
+//TODO
+//0: HSIC is low power
+//1: HSIC is back
+int modem_link_control_active(struct ipc_client *client, int device_fd,
+ int active)
+{
+ return client->modem_driver_ops->link_control_active(client, device_fd,
+ active);
+}
+
+//TODO:
+int modem_link_connected_wait(struct ipc_client *client, int device_fd)
+{
+ return client->modem_driver_ops->link_connected_wait(client, device_fd);
+}
+
+// TODO
+int modem_link_get_hostwake_wait(struct ipc_client *client, int device_fd)
+{
+ return client->modem_driver_ops->link_get_hostwake_wait(client,
+ device_fd);
+}
+
+/* Wait for the modem driver to report the ONLINE status */
+int modem_wait_status_online(__attribute__((unused)) struct ipc_client *client,
+ int device_fd)
+{
+ return client->modem_driver_ops->wait_status_online(client, device_fd);
+}
+
+int modem_open(struct ipc_client *client, int type)
+{
+ return client->modem_driver_ops->open(client, type);
+}
+
+int modem_close(struct ipc_client *client, int fd)
+{
+ return client->modem_driver_ops->close(client, fd);
+}
+
+int modem_read(struct ipc_client *client, int fd, void *buffer, size_t length)
+{
+ return client->modem_driver_ops->read(client, fd, buffer, length);
+}
+
+int modem_write(struct ipc_client *client, int fd, const void *buffer,
+ size_t length)
+{
+ return client->modem_driver_ops->write(client, fd, buffer, length);
+}
+
+int modem_poll(struct ipc_client *client, int fd, struct ipc_poll_fds *fds,
+ struct timeval *timeout)
+{
+ return client->modem_driver_ops->poll(client, fd, fds, timeout);
+}
+
+int modem_fmt_send(struct ipc_client *client, struct ipc_message *message)
+{
+ return client->modem_driver_ops->fmt_send(client, message);
+}
+
+int modem_fmt_recv(struct ipc_client *client, struct ipc_message *message)
+{
+ return client->modem_driver_ops->fmt_recv(client, message);
+}
+
+int modem_rfs_send(struct ipc_client *client, struct ipc_message *message)
+{
+ return client->modem_driver_ops->rfs_send(client, message);
+}
+
+int modem_rfs_recv(struct ipc_client *client, struct ipc_message *message)
+{
+ return client->modem_driver_ops->rfs_recv(client, message);
+}
+
+// TODO
+char *modem_gprs_get_iface(struct ipc_client *client, unsigned int cid)
+{
+ return client->modem_driver_ops->gprs_get_iface(client, cid);
+}
+
+// TODO
+int modem_gprs_get_capabilities(struct ipc_client *client,
+ struct ipc_client_gprs_capabilities *capabilities)
+{
+ return client->modem_driver_ops->gprs_get_capabilities(client,
+ capabilities);
+}
+
+// TODO: make it more generic:
+// - get rid of device_fd
+// - we have many <modem>_<firmware_partition>_send
+// functions for partitions:
+// | Function | Partition |
+// | psi | PSIRAM |
+// | ebl | EBL |
+// | firmware | MAIN |
+// | sec_start | SECPACK |
+// | device specific | NV |
+
+// int modem_psi_send(struct ipc_client *client, int serial_fd,
+// const void *psi_data, unsigned short psi_size);
+// {
+// /* TODO: get rid of serial_fd */
+// return client->modem_driver_ops->psi_send(client, serial_fd, psi_data,
+// psi_size);
+// }
+//
+// int modem_firmware_send(struct ipc_client *client, int device_fd,
+// void *device_address, const void *firmware_data,
+// size_t firmware_size)
+// {
+// /* TODO: get rid of device_fd */
+// return client->modem_driver_ops->firmware_send(client, device_fd,
+// device_address,
+// firmware_data,
+// firmware_size);
+// }
+//
+// int modem_nv_data_send(struct ipc_client *client, int device_fd,
+// void *device_address)
+// {
+// /* TODO: get rid of device_fd */
+// return client->modem_driver_ops->firmware_send(client, device_fd,
+// device_address);
+// }
+//
+//
+// int modem_psi_send(struct ipc_client *client, int serial_fd,
+// const void *psi_data, unsigned short psi_size);
+// {
+// /* TODO: get rid of serial_fd */
+// return client->modem_driver_ops->psi_send(client, serial_fd, psi_data,
+// psi_size);
+// }
+//
+
+// TODO: find a better name like block data (used for fimrware partitions)
+int modem_data_send(struct ipc_client *client, int device_fd, const void *data,
+ size_t size, int address)
+{
+ return client->modem_driver_ops->data_send(client, device_fd, data,
+ size, address);
+}
diff --git a/samsung-ipc/modems/modem.h b/samsung-ipc/modems/modem.h
new file mode 100644
index 0000000..9935df6
--- /dev/null
+++ b/samsung-ipc/modems/modem.h
@@ -0,0 +1,35 @@
+#ifndef __SAMSUNG_IPC_MODEM_H__
+#define __SAMSUNG_IPC_MODEM_H__
+int modem_download_enable(__attribute__((unused)) struct ipc_client *client,
+ int device_fd, int enable);
+int modem_power(struct ipc_client *client, int device_fd, int power);
+int modem_bus_power(struct ipc_client *client, int power);
+int modem_link_control_enable(struct ipc_client *client, int device_fd,
+ int enable);
+int modem_link_control_active(struct ipc_client *client, int device_fd,
+ int active);
+int modem_link_connected_wait(struct ipc_client *client, int device_fd);
+int modem_link_get_hostwake_wait(struct ipc_client *client, int device_fd);
+int modem_wait_status(_attribute__((unused)) struct ipc_client *client,
+ int device_fd);
+int modem_open(struct ipc_client *client, int type);
+int modem_close(struct ipc_client *client, int fd);
+int modem_read(struct ipc_client *client, int fd, void *buffer, size_t length);
+int modem_write(struct ipc_client *client, int fd, const void *buffer,
+ size_t length);
+int modem_poll(struct ipc_client *client, int fd, struct ipc_poll_fds *fds,
+ struct timeval *timeout);
+
+int modem_fmt_send(struct ipc_client *client, struct ipc_message *message);
+int modem_fmt_recv(struct ipc_client *client, struct ipc_message *message);
+int modem_rfs_send(struct ipc_client *client, struct ipc_message *message);
+int modem_rfs_recv(struct ipc_client *client, struct ipc_message *message);
+// TODO: find a better name like block data (used for fimrware partitions)
+int modem_data_send(struct ipc_client *client, int device_fd, const void *data,
+ size_t size, int address);
+
+char *modem_gprs_get_iface(struct ipc_client *client, unsigned int cid);
+int modem_gprs_get_capabilities(struct ipc_client *client,
+ struct ipc_client_gprs_capabilities *capabilities);
+
+#endif /* __SAMSUNG_IPC_MODEM_H__ */
diff --git a/samsung-ipc/modems/xmm626/xmm626_hsic.c b/samsung-ipc/modems/xmm626/hsic/hsic.c
index 6e7126c..e1e2883 100644
--- a/samsung-ipc/modems/xmm626/xmm626_hsic.c
+++ b/samsung-ipc/modems/xmm626/hsic/hsic.c
@@ -29,8 +29,10 @@
#include <samsung-ipc.h>
+#include "ipc.h"
+#include "modems/xmm626/xmm626_kernel_smdk4412.h"
#include "modems/xmm626/xmm626.h"
-#include "modems/xmm626/xmm626_hsic.h"
+#include "modems/xmm626/hsic/hsic.h"
int xmm626_hsic_ack_read(int device_fd, unsigned short ack)
{
@@ -391,8 +393,8 @@ complete:
return rc;
}
-int xmm626_hsic_modem_data_send(int device_fd, const void *data, size_t size,
- int address)
+int xmm626_hsic_modem_data_send(struct ipc_client *client, int device_fd,
+ const void *data, size_t size, int address)
{
size_t chunk;
size_t count;
@@ -543,7 +545,7 @@ int xmm626_hsic_firmware_send(struct ipc_client *client, int device_fd,
return -1;
}
- rc = xmm626_hsic_modem_data_send(device_fd, firmware_data,
+ rc = xmm626_hsic_modem_data_send(client, device_fd, firmware_data,
firmware_size,
XMM626_FIRMWARE_ADDRESS);
if (rc < 0)
@@ -572,7 +574,7 @@ int xmm626_hsic_nv_data_send(struct ipc_client *client, int device_fd)
}
ipc_client_log(client, "Loaded nv_data");
- rc = xmm626_hsic_modem_data_send(device_fd, nv_data, nv_size,
+ rc = xmm626_hsic_modem_data_send(client, device_fd, nv_data, nv_size,
XMM626_NV_DATA_ADDRESS);
if (rc < 0)
goto error;
@@ -610,3 +612,33 @@ int xmm626_hsic_hw_reset_send(struct ipc_client *client, int device_fd)
return 0;
}
+
+struct ipc_client_modem_driver_ops smdk4412_xmm626_hsic_modem_driver_ops = {
+ .download_enable = xmm626_kernel_smdk4412_boot_power,
+ .power = xmm626_kernel_smdk4412_power,
+ .bus_power = xmm626_kernel_smdk4412_hci_power,
+ .link_control_enable = xmm626_kernel_smdk4412_link_control_enable,
+ .link_control_active = xmm626_kernel_smdk4412_link_control_active,
+ .link_connected_wait = xmm626_kernel_smdk4412_link_connected_wait,
+ .link_get_hostwake_wait = xmm626_kernel_smdk4412_link_get_hostwake_wait,
+ .wait_status_online = xmm626_kernel_smdk4412_status_online_wait,
+
+ .open = xmm626_kernel_smdk4412_open,
+ .close = xmm626_kernel_smdk4412_close,
+ .read = xmm626_kernel_smdk4412_read,
+ .write = xmm626_kernel_smdk4412_write,
+ .poll = xmm626_kernel_smdk4412_poll,
+
+ .fmt_send = xmm626_kernel_smdk4412_fmt_send,
+ .fmt_recv = xmm626_kernel_smdk4412_fmt_recv,
+ .rfs_send = xmm626_kernel_smdk4412_rfs_send,
+ .rfs_recv = xmm626_kernel_smdk4412_rfs_recv,
+
+ // TODO: find a better name for data_send
+ .data_send = xmm626_hsic_modem_data_send,
+
+ // TODO
+ // .gprs_get_iface = xmm626_kernel_smdk4412_gprs_get_iface,
+ // .modem_gprs_get_capabilities = xmm626_kernel_smdk4412_modem_gprs_get_capabilities,
+};
+
diff --git a/samsung-ipc/modems/xmm626/xmm626_hsic.h b/samsung-ipc/modems/xmm626/hsic/hsic.h
index 6385cdc..fc172d5 100644
--- a/samsung-ipc/modems/xmm626/xmm626_hsic.h
+++ b/samsung-ipc/modems/xmm626/hsic/hsic.h
@@ -63,5 +63,8 @@ int xmm626_hsic_firmware_send(struct ipc_client *client, int device_fd,
const void *firmware_data, size_t firmware_size);
int xmm626_hsic_nv_data_send(struct ipc_client *client, int device_fd);
int xmm626_hsic_hw_reset_send(struct ipc_client *client, int device_fd);
+int xmm626_hsic_modem_data_send(struct ipc_client *client, int device_fd,
+ const void *data, size_t size, int address);
+
#endif /* __XMM626_HSIC_H__ */
diff --git a/samsung-ipc/modems/xmm626/xmm626_modem_link_device_hsic.h b/samsung-ipc/modems/xmm626/hsic/xmm626_modem_link_device_hsic.h
index f2421e0..f2421e0 100644
--- a/samsung-ipc/modems/xmm626/xmm626_modem_link_device_hsic.h
+++ b/samsung-ipc/modems/xmm626/hsic/xmm626_modem_link_device_hsic.h
diff --git a/samsung-ipc/modems/xmm626/xmm626_kernel_smdk4412.c b/samsung-ipc/modems/xmm626/kernel_smdk4412.c
index c6b1578..d9c7620 100644
--- a/samsung-ipc/modems/xmm626/xmm626_kernel_smdk4412.c
+++ b/samsung-ipc/modems/xmm626/kernel_smdk4412.c
@@ -32,7 +32,7 @@
#include "ipc.h"
#include "modems/xmm626/xmm626.h"
#include "modems/xmm626/xmm626_kernel_smdk4412.h"
-#include "modems/xmm626/xmm626_modem_link_device_hsic.h"
+#include "modems/xmm626/hsic/xmm626_modem_link_device_hsic.h"
#include "modems/xmm626/xmm626_modem_prj.h"
int xmm626_kernel_smdk4412_power(
@@ -602,3 +602,4 @@ int xmm626_kernel_smdk4412_gprs_get_capabilities(
return 0;
}
+
diff --git a/samsung-ipc/modems/xmm626/xmm626_mipi.c b/samsung-ipc/modems/xmm626/mipi/mipi.c
index 375ded0..e95d2a1 100644
--- a/samsung-ipc/modems/xmm626/xmm626_mipi.c
+++ b/samsung-ipc/modems/xmm626/mipi/mipi.c
@@ -29,8 +29,10 @@
#include <samsung-ipc.h>
+#include "ipc.h"
#include "modems/xmm626/xmm626.h"
-#include "modems/xmm626/xmm626_mipi.h"
+#include "modems/xmm626/xmm626_kernel_smdk4412.h"
+#include "modems/xmm626/mipi/xmm626_mipi.h"
int xmm626_mipi_crc_calculate(const void *data, size_t size)
{
@@ -419,8 +421,8 @@ complete:
return rc;
}
-int xmm626_mipi_modem_data_send(int device_fd, const void *data, size_t size,
- int address)
+int xmm626_mipi_modem_data_send(struct ipc_client *client, int device_fd,
+ const void *data, size_t size, int address)
{
size_t chunk;
size_t count;
@@ -588,7 +590,7 @@ int xmm626_mipi_firmware_send(struct ipc_client *client, int device_fd,
return -1;
}
- rc = xmm626_mipi_modem_data_send(device_fd, firmware_data,
+ rc = xmm626_mipi_modem_data_send(client, device_fd, firmware_data,
firmware_size,
XMM626_FIRMWARE_ADDRESS);
if (rc < 0)
@@ -617,7 +619,7 @@ int xmm626_mipi_nv_data_send(struct ipc_client *client, int device_fd)
}
ipc_client_log(client, "Loaded nv_data");
- rc = xmm626_mipi_modem_data_send(device_fd, nv_data, nv_size,
+ rc = xmm626_mipi_modem_data_send(client, device_fd, nv_data, nv_size,
XMM626_NV_DATA_ADDRESS);
if (rc < 0)
goto error;
@@ -645,7 +647,7 @@ int xmm626_mipi_mps_data_send(struct ipc_client *client, int device_fd,
return -1;
}
- rc = xmm626_mipi_modem_data_send(device_fd, mps_data, mps_size,
+ rc = xmm626_mipi_modem_data_send(client, device_fd, mps_data, mps_size,
XMM626_MPS_DATA_ADDRESS);
if (rc < 0)
return -1;
@@ -672,3 +674,29 @@ int xmm626_mipi_hw_reset_send(struct ipc_client *client, int device_fd)
return 0;
}
+
+struct ipc_client_modem_driver_ops smdk4412_xmm626_mipi_modem_driver_ops = {
+ .download_enable = xmm626_kernel_smdk4412_boot_power, //TODO
+ .power = xmm626_kernel_smdk4412_power, //TODO
+ .bus_power = xmm626_kernel_smdk4412_hci_power, //TODO
+ .link_control_enable = xmm626_kernel_smdk4412_link_control_enable, //TODO
+ .link_control_active = xmm626_kernel_smdk4412_link_control_active, //TODO
+ .link_connected_wait = xmm626_kernel_smdk4412_link_connected_wait, //TODO
+ .link_get_hostwake_wait = xmm626_kernel_smdk4412_link_get_hostwake_wait, //TODO
+ .wait_status_online = xmm626_kernel_smdk4412_status_online_wait, //TODO
+
+ .open = xmm626_kernel_smdk4412_open, //TODO
+ .close = xmm626_kernel_smdk4412_close, //TODO
+ .read = xmm626_kernel_smdk4412_read, //TODO
+ .write = xmm626_kernel_smdk4412_write, //TODO
+ .poll = xmm626_kernel_smdk4412_poll, //TODO
+
+ .fmt_send = xmm626_kernel_smdk4412_fmt_send, //TODO
+ .fmt_recv = xmm626_kernel_smdk4412_fmt_recv, //TODO
+ .rfs_send = xmm626_kernel_smdk4412_rfs_send, //TODO
+ .rfs_recv = xmm626_kernel_smdk4412_rfs_recv, //TODO
+ .data_send = xmm626_mipi_modem_data_send,
+
+ // .gprs_get_iface = xmm626_kernel_smdk4412_gprs_get_iface,
+ // .modem_gprs_get_capabilities = xmm626_kernel_smdk4412_modem_gprs_get_capabilities,
+};
diff --git a/samsung-ipc/modems/xmm626/xmm626_mipi.h b/samsung-ipc/modems/xmm626/mipi/xmm626_mipi.h
index 1545a3e..67b35ba 100644
--- a/samsung-ipc/modems/xmm626/xmm626_mipi.h
+++ b/samsung-ipc/modems/xmm626/mipi/xmm626_mipi.h
@@ -67,5 +67,7 @@ int xmm626_mipi_nv_data_send(struct ipc_client *client, int device_fd);
int xmm626_mipi_mps_data_send(struct ipc_client *client, int device_fd,
const void *mps_data, size_t mps_size);
int xmm626_mipi_hw_reset_send(struct ipc_client *client, int device_fd);
+int xmm626_mipi_modem_data_send(struct ipc_client *client, int device_fd,
+ const void *data, size_t size, int address);
#endif /* __XMM626_MIPI_H__ */
diff --git a/scripts/smdk4412_func_usage.py b/scripts/smdk4412_func_usage.py
new file mode 100755
index 0000000..fe54f66
--- /dev/null
+++ b/scripts/smdk4412_func_usage.py
@@ -0,0 +1,85 @@
+#!/bin/env python
+
+import os
+import re
+from sh import git
+
+funcs = [
+ 'xmm626_kernel_smdk4412_power',
+ 'xmm626_kernel_smdk4412_boot_power',
+ 'xmm626_kernel_smdk4412_hci_power',
+ 'xmm626_kernel_smdk4412_link_control_enable',
+ 'xmm626_kernel_smdk4412_link_control_active',
+ 'xmm626_kernel_smdk4412_link_connected_wait',
+ 'xmm626_kernel_smdk4412_link_get_hostwake_wait',
+ 'xmm626_kernel_smdk4412_status_online_wait',
+ 'xmm626_kernel_smdk4412_open',
+ 'xmm626_kernel_smdk4412_close',
+ 'xmm626_kernel_smdk4412_read',
+ 'xmm626_kernel_smdk4412_write',
+ 'xmm626_kernel_smdk4412_poll',
+ 'xmm626_kernel_smdk4412_fmt_send',
+ 'xmm626_kernel_smdk4412_fmt_recv',
+ 'xmm626_kernel_smdk4412_rfs_send',
+ 'xmm626_kernel_smdk4412_rfs_recv',
+ 'xmm626_kernel_smdk4412_gprs_get_iface',
+ 'xmm626_kernel_smdk4412_gprs_get_capabilities',
+]
+
+results = {}
+
+def func_usage(func):
+ output = ""
+ try:
+ output = git('--no-pager', 'grep', '--color=never', func)
+ except:
+ pass
+
+ for line in output:
+ filepath = line.split(":")[0]
+ content = line.split(":")[1]
+
+ device = None
+ if re.match('samsung-ipc/devices/.*/*\.c$', filepath):
+ device = re.sub('\.c', '', os.path.basename(filepath))
+ if device not in results:
+ results[device] = {}
+ results[device][func] = True
+
+def print_func_group(device, device_data, device_maxlen, funcs, regex):
+ print ("| {}{} |".format(device, " " * (device_maxlen - len(device))),
+ end='')
+ for func in funcs:
+ if re.search(regex, func):
+ func_name = re.sub('xmm626_kernel_smdk4412_','', func)
+ if func in device_data:
+ print (" {} |".format(func_name), end='')
+ else:
+ print (" {} |".format(" " * len(func_name)), end='')
+ print()
+
+def report_results(results):
+ device_maxlen = 0
+ for key in results.keys():
+ if len(key) > device_maxlen:
+ device_maxlen = len(key)
+
+
+ print ("+{}+".format("-" * (device_maxlen + 2)))
+ for device, device_data in results.items():
+ # All:
+ # print_func_group(device, device_data, device_maxlen, funcs,
+ # "open|close|read|write|poll")
+ # print_func_group(device, device_data, device_maxlen, funcs, "fmt|rfs")
+ # print_func_group(device, device_data, device_maxlen, funcs, "gprs")
+
+
+ print_func_group(device, device_data, device_maxlen, funcs,
+ "power|link|status")
+
+ print ("+{}+".format("-" * (device_maxlen + 2)))
+
+for func in funcs:
+ func_usage(func)
+
+report_results(results)