/* * This file is part of libsamsung-ipc. * * Copyright (C) 2012 Alexander Tarasikov * Copyright (C) 2013-2014 Paul Kocialkowski * * 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 . */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include int xmm626_kernel_samsung_smdk4412_modem_power(int device_fd, int power) { int rc; if (device_fd < 0) return -1; rc = ioctl(device_fd, power ? IOCTL_MODEM_ON : IOCTL_MODEM_OFF, 0); if (rc < 0) return -1; return 0; } int xmm626_kernel_samsung_smdk4412_modem_boot_power(int device_fd, int power) { int rc; if (device_fd < 0) return -1; rc = ioctl(device_fd, power ? IOCTL_MODEM_BOOT_ON : IOCTL_MODEM_BOOT_OFF, 0); if (rc < 0) return -1; return 0; } int xmm626_kernel_samsung_smdk4412_modem_hci_power(int power) { int ehci_rc, ohci_rc; ehci_rc = sysfs_value_write(XMM626_KERNEL_SAMSUNG_SMDK4412_EHCI_POWER_SYSFS, !!power); if (ehci_rc >= 0) usleep(50000); ohci_rc = sysfs_value_write(XMM626_KERNEL_SAMSUNG_SMDK4412_OHCI_POWER_SYSFS, !!power); if (ohci_rc >= 0) usleep(50000); if (ehci_rc < 0 && ohci_rc < 0) return -1; return 0; } int xmm626_kernel_samsung_smdk4412_modem_link_control_enable(int device_fd, int enable) { int rc; if (device_fd < 0) return -1; rc = ioctl(device_fd, IOCTL_LINK_CONTROL_ENABLE, &enable); if (rc < 0) return -1; return 0; } int xmm626_kernel_samsung_smdk4412_modem_link_control_active(int device_fd, int active) { int rc; if (device_fd < 0) return -1; rc = ioctl(device_fd, IOCTL_LINK_CONTROL_ACTIVE, &active); if (rc < 0) return -1; return 0; } int xmm626_kernel_samsung_smdk4412_modem_link_connected_wait(int device_fd) { int status; int i; if (device_fd < 0) return -1; i = 0; for (i = 0; i < 100; i++) { status = ioctl(device_fd, IOCTL_LINK_CONNECTED, 0); if (status) return 0; usleep(50000); } return -1; } int xmm626_kernel_samsung_smdk4412_modem_link_get_hostwake_wait(int device_fd) { int status; int i; if (device_fd < 0) return -1; i = 0; for (i = 0; i < 10; i++) { status = ioctl(device_fd, IOCTL_LINK_GET_HOSTWAKE, 0); if (status) return 0; usleep(50000); } return -1; } int xmm626_kernel_samsung_smdk4412_modem_open(int type) { int fd; switch (type) { case IPC_CLIENT_TYPE_FMT: fd = open(XMM626_KERNEL_SAMSUNG_SMDK4412_IPC0_DEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK); break; case IPC_CLIENT_TYPE_RFS: fd = open(XMM626_KERNEL_SAMSUNG_SMDK4412_RFS0_DEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK); break; default: return -1; } return fd; } int xmm626_kernel_samsung_smdk4412_modem_read(int fd, void *buffer, size_t length) { int status; int rc; if (fd < 0 || buffer == NULL || length <= 0) return -1; status = ioctl(fd, IOCTL_MODEM_STATUS, 0); if (status != STATE_ONLINE && status != STATE_BOOTING) return -1; rc = read(fd, buffer, length); return rc; } int xmm626_kernel_samsung_smdk4412_modem_write(int fd, const void *buffer, size_t length) { int status; int rc; if (fd < 0 || buffer == NULL || length <= 0) return -1; status = ioctl(fd, IOCTL_MODEM_STATUS, 0); if (status != STATE_ONLINE && status != STATE_BOOTING) return -1; rc = write(fd, buffer, length); return rc; } char *xmm626_kernel_samsung_smdk4412_modem_gprs_get_iface(unsigned int cid) { char *iface = NULL; if (cid > XMM626_SEC_MODEM_GPRS_IFACE_COUNT) return NULL; asprintf(&iface, "%s%d", XMM626_SEC_MODEM_GPRS_IFACE_PREFIX, cid - 1); return iface; } int xmm626_kernel_samsung_smdk4412_modem_gprs_get_capabilities(struct ipc_client_gprs_capabilities *capabilities) { if (capabilities == NULL) return -1; capabilities->cid_count = XMM626_SEC_MODEM_GPRS_IFACE_COUNT; return 0; } // vim:ts=4:sw=4:expandtab