Copyright (C) 2005 Steven Toth <stoth@hauppauge.com>
 
+    Support for KWorld DVB-S 100 by Vadim Catana <skystar@moldova.cc>
+
     This program 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
                state->config->pll_init(fe);
 
        /* Configure the LNB for 14V */
-       cx24123_writelnbreg(state, 0x0, 0x2a);
+       if (state->config->use_isl6421)
+               cx24123_writelnbreg(state, 0x0, 0x2a);
 
        return 0;
 }
        struct cx24123_state *state = fe->demodulator_priv;
        u8 val;
 
-       val = cx24123_readlnbreg(state, 0x0);
+       switch (state->config->use_isl6421) {
 
-       switch (voltage) {
-       case SEC_VOLTAGE_13:
-               return cx24123_writelnbreg(state, 0x0, val & 0x32); /* V 13v */
-       case SEC_VOLTAGE_18:
-               return cx24123_writelnbreg(state, 0x0, val | 0x04); /* H 18v */
-       case SEC_VOLTAGE_OFF:
-               return cx24123_writelnbreg(state, 0x0, val & 0x30);
-       default:
-               return -EINVAL;
-       };
+       case 1:
+
+               val = cx24123_readlnbreg(state, 0x0);
+
+               switch (voltage) {
+               case SEC_VOLTAGE_13:
+                       return cx24123_writelnbreg(state, 0x0, val & 0x32); /* V 13v */
+               case SEC_VOLTAGE_18:
+                       return cx24123_writelnbreg(state, 0x0, val | 0x04); /* H 18v */
+               case SEC_VOLTAGE_OFF:
+                       return cx24123_writelnbreg(state, 0x0, val & 0x30);
+               default:
+                       return -EINVAL;
+               };
+
+       case 0:
+
+               val = cx24123_readreg(state, 0x29);
+
+               switch (voltage) {
+               case SEC_VOLTAGE_13:
+                       dprintk("%s: setting voltage 13V\n", __FUNCTION__);
+                       if (state->config->enable_lnb_voltage)
+                               state->config->enable_lnb_voltage(fe, 1);
+                       return cx24123_writereg(state, 0x29, val | 0x80);
+               case SEC_VOLTAGE_18:
+                       dprintk("%s: setting voltage 18V\n", __FUNCTION__);
+                       if (state->config->enable_lnb_voltage)
+                               state->config->enable_lnb_voltage(fe, 1);
+                       return cx24123_writereg(state, 0x29, val & 0x7f);
+               case SEC_VOLTAGE_OFF:
+                       dprintk("%s: setting voltage off\n", __FUNCTION__);
+                       if (state->config->enable_lnb_voltage)
+                               state->config->enable_lnb_voltage(fe, 0);
+                       return 0;
+               default:
+                       return -EINVAL;
+               };
+       }
+
+       return 0;
 }
 
 static int cx24123_send_diseqc_msg(struct dvb_frontend* fe,
        struct cx24123_state *state = fe->demodulator_priv;
        u8 val;
 
-       val = cx24123_readlnbreg(state, 0x0);
+       switch (state->config->use_isl6421) {
+       case 1:
+
+               val = cx24123_readlnbreg(state, 0x0);
 
-       switch (tone) {
-       case SEC_TONE_ON:
-               return cx24123_writelnbreg(state, 0x0, val | 0x10);
-       case SEC_TONE_OFF:
-               return cx24123_writelnbreg(state, 0x0, val & 0x2f);
-       default:
-               printk("%s: CASE reached default with tone=%d\n", __FUNCTION__, tone);
-               return -EINVAL;
+               switch (tone) {
+               case SEC_TONE_ON:
+                       return cx24123_writelnbreg(state, 0x0, val | 0x10);
+               case SEC_TONE_OFF:
+                       return cx24123_writelnbreg(state, 0x0, val & 0x2f);
+               default:
+                       printk("%s: CASE reached default with tone=%d\n", __FUNCTION__, tone);
+                       return -EINVAL;
+               }
+
+       case 0:
+
+               val = cx24123_readreg(state, 0x29);
+
+               switch (tone) {
+               case SEC_TONE_ON:
+                       dprintk("%s: setting tone on\n", __FUNCTION__);
+                       return cx24123_writereg(state, 0x29, val | 0x10);
+               case SEC_TONE_OFF:
+                       dprintk("%s: setting tone off\n",__FUNCTION__);
+                       return cx24123_writereg(state, 0x29, val & 0xef);
+               default:
+                       printk("%s: CASE reached default with tone=%d\n", __FUNCTION__, tone);
+                       return -EINVAL;
+               }
        }
+
+       return 0;
 }
 
 static void cx24123_release(struct dvb_frontend* fe)