Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6
[pandora-kernel.git] / drivers / media / dvb / siano / smscoreapi.c
index 6576fbb..7bd4d1d 100644 (file)
@@ -3,7 +3,7 @@
  *
  *  This file contains implementation for the interface to sms core component
  *
- *  author: Anatoly Greenblat
+ *  author: Uri Shkolnik
  *
  *  Copyright (c), 2005-2008 Siano Mobile Silicon, Inc.
  *
@@ -34,8 +34,8 @@
 #include "smscoreapi.h"
 #include "sms-cards.h"
 
-int sms_debug;
-module_param_named(debug, sms_debug, int, 0644);
+static int sms_dbg;
+module_param_named(debug, sms_dbg, int, 0644);
 MODULE_PARM_DESC(debug, "set debug level (info=1, adv=2 (or-able))");
 
 struct smscore_device_notifyee_t {
@@ -91,6 +91,7 @@ struct smscore_device_t {
        struct completion init_device_done, reload_start_done, resume_done;
 
        int board_id;
+       int led_state;
 };
 
 void smscore_set_board_id(struct smscore_device_t *core, int id)
@@ -98,10 +99,19 @@ void smscore_set_board_id(struct smscore_device_t *core, int id)
        core->board_id = id;
 }
 
+int smscore_led_state(struct smscore_device_t *core, int led)
+{
+       if (led >= 0)
+               core->led_state = led;
+       return core->led_state;
+}
+EXPORT_SYMBOL_GPL(smscore_set_board_id);
+
 int smscore_get_board_id(struct smscore_device_t *core)
 {
        return core->board_id;
 }
+EXPORT_SYMBOL_GPL(smscore_get_board_id);
 
 struct smscore_registry_entry_t {
        struct list_head entry;
@@ -162,6 +172,7 @@ int smscore_registry_getmode(char *devpath)
 
        return default_mode;
 }
+EXPORT_SYMBOL_GPL(smscore_registry_getmode);
 
 static enum sms_device_type_st smscore_registry_gettype(char *devpath)
 {
@@ -253,6 +264,7 @@ int smscore_register_hotplug(hotplug_t hotplug)
 
        return rc;
 }
+EXPORT_SYMBOL_GPL(smscore_register_hotplug);
 
 /**
  * unregister a client callback that called when device plugged in/unplugged
@@ -281,6 +293,7 @@ void smscore_unregister_hotplug(hotplug_t hotplug)
 
        kmutex_unlock(&g_smscore_deviceslock);
 }
+EXPORT_SYMBOL_GPL(smscore_unregister_hotplug);
 
 static void smscore_notify_clients(struct smscore_device_t *coredev)
 {
@@ -424,6 +437,7 @@ int smscore_register_device(struct smsdevice_params_t *params,
 
        return 0;
 }
+EXPORT_SYMBOL_GPL(smscore_register_device);
 
 /**
  * sets initial device mode and notifies client hotplugs that device is ready
@@ -452,6 +466,7 @@ int smscore_start_device(struct smscore_device_t *coredev)
 
        return rc;
 }
+EXPORT_SYMBOL_GPL(smscore_start_device);
 
 static int smscore_sendrequest_and_wait(struct smscore_device_t *coredev,
                                        void *buffer, size_t size,
@@ -680,6 +695,7 @@ void smscore_unregister_device(struct smscore_device_t *coredev)
 
        sms_info("device %p destroyed", coredev);
 }
+EXPORT_SYMBOL_GPL(smscore_unregister_device);
 
 static int smscore_detect_mode(struct smscore_device_t *coredev)
 {
@@ -724,7 +740,7 @@ static char *smscore_fw_lkup[][SMS_NUM_OF_DEVICE_TYPES] = {
        /*DVBH*/
        {"none", "dvb_nova_12mhz.inp", "dvb_nova_12mhz_b0.inp", "none"},
        /*TDMB*/
-       {"none", "tdmb_nova_12mhz.inp", "none", "none"},
+       {"none", "tdmb_nova_12mhz.inp", "tdmb_nova_12mhz_b0.inp", "none"},
        /*DABIP*/
        {"none", "none", "none", "none"},
        /*BDA*/
@@ -871,6 +887,7 @@ int smscore_get_device_mode(struct smscore_device_t *coredev)
 {
        return coredev->mode;
 }
+EXPORT_SYMBOL_GPL(smscore_get_device_mode);
 
 /**
  * find client by response id & type within the clients list.
@@ -998,6 +1015,7 @@ void smscore_onresponse(struct smscore_device_t *coredev,
                smscore_putbuffer(coredev, cb);
        }
 }
+EXPORT_SYMBOL_GPL(smscore_onresponse);
 
 /**
  * return pointer to next free buffer descriptor from core pool
@@ -1023,6 +1041,7 @@ struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev)
 
        return cb;
 }
+EXPORT_SYMBOL_GPL(smscore_getbuffer);
 
 /**
  * return buffer descriptor to a pool
@@ -1037,6 +1056,7 @@ void smscore_putbuffer(struct smscore_device_t *coredev,
 {
        list_add_locked(&cb->entry, &coredev->buffers, &coredev->bufferslock);
 }
+EXPORT_SYMBOL_GPL(smscore_putbuffer);
 
 static int smscore_validate_client(struct smscore_device_t *coredev,
                                   struct smscore_client_t *client,
@@ -1116,6 +1136,7 @@ int smscore_register_client(struct smscore_device_t *coredev,
 
        return 0;
 }
+EXPORT_SYMBOL_GPL(smscore_register_client);
 
 /**
  * frees smsclient object and all subclients associated with it
@@ -1146,6 +1167,7 @@ void smscore_unregister_client(struct smscore_client_t *client)
 
        spin_unlock_irqrestore(&coredev->clientslock, flags);
 }
+EXPORT_SYMBOL_GPL(smscore_unregister_client);
 
 /**
  * verifies that source id is not taken by another client,
@@ -1185,7 +1207,78 @@ int smsclient_sendrequest(struct smscore_client_t *client,
 
        return coredev->sendrequest_handler(coredev->context, buffer, size);
 }
+EXPORT_SYMBOL_GPL(smsclient_sendrequest);
+
+
+int smscore_configure_gpio(struct smscore_device_t *coredev, u32 pin,
+                          struct smscore_gpio_config *pinconfig)
+{
+       struct {
+               struct SmsMsgHdr_ST hdr;
+               u32 data[6];
+       } msg;
+
+       if (coredev->device_flags & SMS_DEVICE_FAMILY2) {
+               msg.hdr.msgSrcId = DVBT_BDA_CONTROL_MSG_ID;
+               msg.hdr.msgDstId = HIF_TASK;
+               msg.hdr.msgFlags = 0;
+               msg.hdr.msgType  = MSG_SMS_GPIO_CONFIG_EX_REQ;
+               msg.hdr.msgLength = sizeof(msg);
+
+               msg.data[0] = pin;
+               msg.data[1] = pinconfig->pullupdown;
+
+               /* Convert slew rate for Nova: Fast(0) = 3 / Slow(1) = 0; */
+               msg.data[2] = pinconfig->outputslewrate == 0 ? 3 : 0;
+
+               switch (pinconfig->outputdriving) {
+               case SMS_GPIO_OUTPUTDRIVING_16mA:
+                       msg.data[3] = 7; /* Nova - 16mA */
+                       break;
+               case SMS_GPIO_OUTPUTDRIVING_12mA:
+                       msg.data[3] = 5; /* Nova - 11mA */
+                       break;
+               case SMS_GPIO_OUTPUTDRIVING_8mA:
+                       msg.data[3] = 3; /* Nova - 7mA */
+                       break;
+               case SMS_GPIO_OUTPUTDRIVING_4mA:
+               default:
+                       msg.data[3] = 2; /* Nova - 4mA */
+                       break;
+               }
+
+               msg.data[4] = pinconfig->direction;
+               msg.data[5] = 0;
+       } else /* TODO: SMS_DEVICE_FAMILY1 */
+               return -EINVAL;
+
+       return coredev->sendrequest_handler(coredev->context,
+                                           &msg, sizeof(msg));
+}
+
+int smscore_set_gpio(struct smscore_device_t *coredev, u32 pin, int level)
+{
+       struct {
+               struct SmsMsgHdr_ST hdr;
+               u32 data[3];
+       } msg;
+
+       if (pin > MAX_GPIO_PIN_NUMBER)
+               return -EINVAL;
+
+       msg.hdr.msgSrcId = DVBT_BDA_CONTROL_MSG_ID;
+       msg.hdr.msgDstId = HIF_TASK;
+       msg.hdr.msgFlags = 0;
+       msg.hdr.msgType  = MSG_SMS_GPIO_SET_LEVEL_REQ;
+       msg.hdr.msgLength = sizeof(msg);
 
+       msg.data[0] = pin;
+       msg.data[1] = level ? 1 : 0;
+       msg.data[2] = 0;
+
+       return coredev->sendrequest_handler(coredev->context,
+                                           &msg, sizeof(msg));
+}
 
 static int __init smscore_module_init(void)
 {
@@ -1198,12 +1291,12 @@ static int __init smscore_module_init(void)
        INIT_LIST_HEAD(&g_smscore_registry);
        kmutex_init(&g_smscore_registrylock);
 
-       /* USB Register */
-       rc = smsusb_register();
 
-       /* DVB Register */
-       rc = smsdvb_register();
 
+
+
+
+       return rc;
        sms_debug("rc %d", rc);
 
        return rc;
@@ -1212,6 +1305,10 @@ static int __init smscore_module_init(void)
 static void __exit smscore_module_exit(void)
 {
 
+
+
+
+
        kmutex_lock(&g_smscore_deviceslock);
        while (!list_empty(&g_smscore_notifyees)) {
                struct smscore_device_notifyee_t *notifyee =
@@ -1234,18 +1331,12 @@ static void __exit smscore_module_exit(void)
        }
        kmutex_unlock(&g_smscore_registrylock);
 
-       /* DVB UnRegister */
-       smsdvb_unregister();
-
-       /* Unregister USB */
-       smsusb_unregister();
-
        sms_debug("");
 }
 
 module_init(smscore_module_init);
 module_exit(smscore_module_exit);
 
-MODULE_DESCRIPTION("Driver for the Siano SMS1XXX USB dongle");
-MODULE_AUTHOR("Siano Mobile Silicon,,, (doronc@siano-ms.com)");
+MODULE_DESCRIPTION("Siano MDTV Core module");
+MODULE_AUTHOR("Siano Mobile Silicon, Inc. (uris@siano-ms.com)");
 MODULE_LICENSE("GPL");