Merge branch 'staging-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 23 May 2011 19:49:28 +0000 (12:49 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 23 May 2011 19:49:28 +0000 (12:49 -0700)
* 'staging-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-2.6: (970 commits)
  staging: usbip: replace usbip_u{dbg,err,info} and printk with dev_ and pr_
  staging:iio: Trivial kconfig reorganization and uniformity improvements.
  staging:iio:documenation partial update.
  staging:iio: use pollfunc allocation helpers in remaining drivers.
  staging:iio:max1363 misc cleanups and use of for_each_bit_set to simplify event code spitting out.
  staging:iio: implement an iio_info structure to take some of the constant elements out of iio_dev.
  staging:iio:meter:ade7758: Use private data space from iio_allocate_device
  staging:iio:accel:lis3l02dq make write_reg_8 take value not a pointer to value.
  staging:iio: ring core cleanups + check if read_last available in lis3l02dq
  staging:iio:core cleanup: squash tiny wrappers and use dev_set_name to handle creation of event interface name.
  staging:iio: poll func allocation clean up.
  staging:iio:ad7780 trivial unused header cleanup.
  staging:iio:adc: AD7780: Use private data space from iio_allocate_device + trivial fixes
  staging:iio:adc:AD7780: Convert to new channel registration method
  staging:iio:adc: AD7606: Drop dev_data in favour of iio_priv()
  staging:iio:adc: AD7606: Consitently use indio_dev
  staging:iio: Rip out helper for software rings.
  staging:iio:adc:AD7298: Use private data space from iio_allocate_device
  staging:iio: rationalization of different buffer implementation hooks.
  staging:iio:imu:adis16400 avoid allocating rx, tx, and state separately from iio_dev.
  ...

Fix up trivial conflicts in
 - drivers/staging/intel_sst/intelmid.c: patches applied in both branches
 - drivers/staging/rt2860/common/cmm_data_{pci,usb}.c: removed vs spelling
 - drivers/staging/usbip/vhci_sysfs.c: trivial header file inclusion

1  2 
drivers/staging/intel_sst/intel_sst_drv_interface.c
drivers/staging/intel_sst/intelmid_v1_control.c
drivers/staging/intel_sst/intelmid_v2_control.c
drivers/staging/olpc_dcon/olpc_dcon_xo_1.c
drivers/staging/rts_pstor/ms.c
drivers/staging/rts_pstor/sd.c
drivers/staging/rts_pstor/xd.c
drivers/staging/usbip/vhci_hcd.c
drivers/staging/usbip/vhci_sysfs.c
kernel/module.c

index 971588ce26d3dd44ae5f726b427898e1676b3023,308d1c3ec40a3eb339914aa730a395d4163c0012..1021477f238db29b5c244f76f35d493aee3018d4
@@@ -105,21 -105,28 +105,28 @@@ void free_stream_context(unsigned int s
        if (!sst_validate_strid(str_id)) {
                /* str_id is valid, so stream is alloacted */
                stream = &sst_drv_ctx->streams[str_id];
+               if (sst_free_stream(str_id))
+                       sst_clean_stream(&sst_drv_ctx->streams[str_id]);
                if (stream->ops == STREAM_OPS_PLAYBACK ||
                                stream->ops == STREAM_OPS_PLAYBACK_DRM) {
                        sst_drv_ctx->pb_streams--;
-                       if (sst_drv_ctx->pb_streams == 0)
-                               sst_drv_ctx->scard_ops->power_down_pmic_pb();
+                       if (sst_drv_ctx->pci_id == SST_MFLD_PCI_ID)
+                               sst_drv_ctx->scard_ops->power_down_pmic_pb(
+                                               stream->device);
+                       else {
+                               if (sst_drv_ctx->pb_streams == 0)
+                                       sst_drv_ctx->scard_ops->
+                                       power_down_pmic_pb(stream->device);
+                       }
                } else if (stream->ops == STREAM_OPS_CAPTURE) {
                        sst_drv_ctx->cp_streams--;
                        if (sst_drv_ctx->cp_streams == 0)
-                               sst_drv_ctx->scard_ops->power_down_pmic_cp();
+                               sst_drv_ctx->scard_ops->power_down_pmic_cp(
+                                               stream->device);
                }
                if (sst_drv_ctx->pb_streams == 0
                                && sst_drv_ctx->cp_streams == 0)
                        sst_drv_ctx->scard_ops->power_down_pmic();
-               if (sst_free_stream(str_id))
-                       sst_clean_stream(&sst_drv_ctx->streams[str_id]);
        }
  }
  
@@@ -276,8 -283,8 +283,8 @@@ void sst_process_mad_ops(struct work_st
                retval = sst_resume_stream(mad_ops->stream_id);
                break;
        case SST_SND_DROP:
/*            retval = sst_drop_stream(mad_ops->stream_id);
*/            break;
              retval = sst_drop_stream(mad_ops->stream_id);
              break;
        case SST_SND_START:
                        pr_debug("SST Debug: start stream\n");
                retval = sst_start_stream(mad_ops->stream_id);
@@@ -508,6 -515,7 +515,6 @@@ int register_sst_card(struct intel_sst_
                        sst_drv_ctx->pmic_state = SND_MAD_INIT_DONE;
                        sst_drv_ctx->rx_time_slot_status = 0; /*default AMIC*/
                        card->pcm_control = sst_pmic_ops.pcm_control;
 -                      sst_drv_ctx->scard_ops->card_status = SND_CARD_UN_INIT;
                        return 0;
                } else {
                        pr_err("strcmp fail %s\n", card->module_name);
                pr_err("Repeat for registration..denied\n");
                return -EBADRQC;
        }
+       /* The ASoC code doesn't set scard_ops */
+       if (sst_drv_ctx->scard_ops)
+               sst_drv_ctx->scard_ops->card_status = SND_CARD_UN_INIT;
        return 0;
  }
  EXPORT_SYMBOL_GPL(register_sst_card);
index 1ea81421805940acca598367a5fe6d3bba43d945,05467ca3f443ea698d5145bccffaa4a28e53835d..9d00728d8deb7e5669ca82a759c1708c977bb87f
  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  
  #include <linux/pci.h>
 +#include <linux/delay.h>
  #include <linux/file.h>
  #include <asm/mrst.h>
  #include <sound/pcm.h>
- #include "jack.h"
  #include <sound/pcm_params.h>
  #include <sound/control.h>
  #include <sound/initval.h>
@@@ -212,7 -210,7 +211,7 @@@ static int mx_power_up_pb(unsigned int 
        return mx_enable_audiodac(UNMUTE);
  }
  
- static int mx_power_down_pb(void)
+ static int mx_power_down_pb(unsigned int device)
  {
        struct sc_reg_access sc_access[3];
        int retval = 0;
@@@ -255,7 -253,7 +254,7 @@@ static int mx_power_up_cp(unsigned int 
        return sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 2);
  }
  
- static int mx_power_down_cp(void)
+ static int mx_power_down_cp(unsigned int device)
  {
        struct sc_reg_access sc_access[] = {
                {ENABLE_OPDEV_CTRL, 0x00, MASK1|MASK0},
@@@ -832,6 -830,129 +831,129 @@@ static int mx_get_vol(int dev_id, int *
        return retval;
  }
  
+ static u8 mx_get_jack_status(void)
+ {
+       struct sc_reg_access sc_access_read = {0,};
+       sc_access_read.reg_addr = 0x201;
+       sst_sc_reg_access(&sc_access_read, PMIC_READ, 1);
+       pr_debug("value returned = 0x%x\n", sc_access_read.value);
+       return sc_access_read.value;
+ }
+ static void mx_pmic_irq_enable(void *data)
+ {
+       struct snd_intelmad *intelmaddata = data;
+       intelmaddata->jack_prev_state = 0xc0;
+       return;
+ }
+ static void mx_pmic_irq_cb(void *cb_data, u8 intsts)
+ {
+       u8 jack_cur_status, jack_prev_state = 0;
+       struct mad_jack *mjack = NULL;
+       unsigned int present = 0, jack_event_flag = 0, buttonpressflag = 0;
+       time_t  timediff;
+       struct snd_intelmad *intelmaddata = cb_data;
+       mjack = &intelmaddata->jack[0];
+       if (intsts & 0x2) {
+               jack_cur_status = mx_get_jack_status();
+               jack_prev_state = intelmaddata->jack_prev_state;
+               if ((jack_prev_state == 0xc0) && (jack_cur_status == 0x40)) {
+                       /*headset insert detected. */
+                       pr_debug("MAD headset inserted\n");
+                       present = 1;
+                       jack_event_flag = 1;
+                       mjack->jack_status = 1;
+                       mjack->jack.type = SND_JACK_HEADSET;
+               }
+               if ((jack_prev_state == 0xc0) && (jack_cur_status == 0x00)) {
+                       /* headphone insert detected. */
+                       pr_debug("MAD headphone inserted\n");
+                       present = 1;
+                       jack_event_flag = 1;
+                       mjack->jack.type = SND_JACK_HEADPHONE;
+               }
+               if ((jack_prev_state == 0x40) && (jack_cur_status == 0xc0)) {
+                       /* headset remove detected. */
+                       pr_debug("MAD headset removed\n");
+                       present = 0;
+                       jack_event_flag = 1;
+                       mjack->jack_status = 0;
+                       mjack->jack.type = SND_JACK_HEADSET;
+               }
+               if ((jack_prev_state == 0x00) && (jack_cur_status == 0xc0)) {
+                       /* headphone remove detected. */
+                       pr_debug("MAD headphone removed\n");
+                       present = 0;
+                       jack_event_flag = 1;
+                       mjack->jack.type = SND_JACK_HEADPHONE;
+               }
+               if ((jack_prev_state == 0x40) && (jack_cur_status == 0x00)) {
+                       /* button pressed */
+                       do_gettimeofday(&mjack->buttonpressed);
+                       pr_debug("MAD button press detected\n");
+               }
+               if ((jack_prev_state == 0x00) && (jack_cur_status == 0x40)) {
+                       if (mjack->jack_status) {
+                               /*button pressed */
+                               do_gettimeofday(
+                                       &mjack->buttonreleased);
+                               /*button pressed */
+                               pr_debug("MAD Button Released detected\n");
+                               timediff = mjack->buttonreleased.tv_sec -
+                                       mjack->buttonpressed.tv_sec;
+                               buttonpressflag = 1;
+                               if (timediff > 1) {
+                                       pr_debug("MAD long press dtd\n");
+                                       /* send headphone detect/undetect */
+                                       present = 1;
+                                       jack_event_flag = 1;
+                                       mjack->jack.type =
+                                                       MID_JACK_HS_LONG_PRESS;
+                               } else {
+                                       pr_debug("MAD short press dtd\n");
+                                       /* send headphone detect/undetect */
+                                       present = 1;
+                                       jack_event_flag = 1;
+                                       mjack->jack.type =
+                                               MID_JACK_HS_SHORT_PRESS;
+                               }
+                       } else {
+                               /***workaround for maxim
+                               hw issue,0x00 t 0x40 is not
+                               a valid transiton for Headset insertion */
+                               /*headset insert detected. */
+                               pr_debug("MAD headset inserted\n");
+                               present = 1;
+                               jack_event_flag = 1;
+                               mjack->jack_status = 1;
+                               mjack->jack.type = SND_JACK_HEADSET;
+                       }
+               }
+               intelmaddata->jack_prev_state  = jack_cur_status;
+               pr_debug("mx_pmic_irq_cb prv_state= 0x%x\n",
+                                       intelmaddata->jack_prev_state);
+       }
+       if (jack_event_flag)
+               sst_mad_send_jack_report(&mjack->jack,
+                                               buttonpressflag, present);
+ }
+ static int mx_jack_enable(void)
+ {
+       return 0;
+ }
  struct snd_pmic_ops snd_pmic_ops_mx = {
        .set_input_dev = mx_set_selected_input_dev,
        .set_output_dev = mx_set_selected_output_dev,
        .set_pcm_voice_params = mx_set_pcm_voice_params,
        .set_voice_port = mx_set_voice_port,
        .set_audio_port = mx_set_audio_port,
-       .power_up_pmic_pb = mx_power_up_pb,
-       .power_up_pmic_cp = mx_power_up_cp,
-       .power_down_pmic_pb = mx_power_down_pb,
-       .power_down_pmic_cp = mx_power_down_cp,
-       .power_down_pmic =  mx_power_down,
+       .power_up_pmic_pb =     mx_power_up_pb,
+       .power_up_pmic_cp =     mx_power_up_cp,
+       .power_down_pmic_pb =   mx_power_down_pb,
+       .power_down_pmic_cp =   mx_power_down_cp,
+       .power_down_pmic =      mx_power_down,
+       .pmic_irq_cb     =      mx_pmic_irq_cb,
+       .pmic_irq_enable =      mx_pmic_irq_enable,
+       .pmic_jack_enable =     mx_jack_enable,
  };
  
index 3c6b3abff3c3e3757fadc8b9a0f43b2895ff8bb6,401a1801ad190df45657847913c6023aa5f62c22..000378a35c1fbb2255842d6dbd6ec9aff9408e65
  
  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  
+ #include <linux/gpio.h>
  #include <linux/pci.h>
 +#include <linux/delay.h>
  #include <linux/file.h>
+ #include <sound/control.h>
  #include "intel_sst.h"
  #include "intelmid_snd_control.h"
+ #include "intelmid.h"
  
  enum reg_v3 {
        VAUDIOCNT = 0x51,
        HPLMIXSEL = 0x12b,
        HPRMIXSEL = 0x12c,
        LOANTIPOP = 0x12d,
+       AUXDBNC = 0x12f,
  };
  
+ static void nc_set_amp_power(int power)
+ {
+       if (snd_pmic_ops_nc.gpio_amp)
+               gpio_set_value(snd_pmic_ops_nc.gpio_amp, power);
+ }
  /****
   * nc_init_card - initialize the sound card
   *
@@@ -111,18 -120,20 +121,20 @@@ static int nc_init_card(void
                {VOICEVOL, 0x0e, 0},
                {HPLVOL, 0x06, 0},
                {HPRVOL, 0x06, 0},
-               {MICCTRL, 0x41, 0x00},
+               {MICCTRL, 0x51, 0x00},
                {ADCSAMPLERATE, 0x8B, 0x00},
                {MICSELVOL, 0x5B, 0x00},
                {LILSEL, 0x06, 0},
                {LIRSEL, 0x46, 0},
                {LOANTIPOP, 0x00, 0},
                {DMICCTRL1, 0x40, 0},
+               {AUXDBNC, 0xff, 0},
        };
        snd_pmic_ops_nc.card_status = SND_CARD_INIT_DONE;
        snd_pmic_ops_nc.master_mute = UNMUTE;
        snd_pmic_ops_nc.mute_status = UNMUTE;
-       sst_sc_reg_access(sc_access, PMIC_WRITE, 26);
+       sst_sc_reg_access(sc_access, PMIC_WRITE, 27);
+       mutex_init(&snd_pmic_ops_nc.lock);
        pr_debug("init complete!!\n");
        return 0;
  }
@@@ -169,6 -180,7 +181,7 @@@ static int nc_power_up_pb(unsigned int 
                return retval;
        if (port == 0xFF)
                return 0;
+       mutex_lock(&snd_pmic_ops_nc.lock);
        nc_enable_audiodac(MUTE);
        msleep(30);
  
  
        msleep(30);
  
-       return nc_enable_audiodac(UNMUTE);
+       snd_pmic_ops_nc.pb_on = 1;
+       /*
+        * There is a mismatch between Playback Sources and the enumerated
+        * values of output sources.  This mismatch causes ALSA upper to send
+        * Item 1 for Internal Speaker, but the expected enumeration is 2!  For
+        * now, treat MONO_EARPIECE and INTERNAL_SPKR identically and power up
+        * the needed resources
+        */
+       if (snd_pmic_ops_nc.output_dev_id == MONO_EARPIECE ||
+           snd_pmic_ops_nc.output_dev_id == INTERNAL_SPKR)
+               nc_set_amp_power(1);
+       nc_enable_audiodac(UNMUTE);
+       mutex_unlock(&snd_pmic_ops_nc.lock);
+       return 0;
  }
  
  static int nc_power_up_cp(unsigned int port)
@@@ -270,7 -295,6 +296,6 @@@ static int nc_power_down(void
        int retval = 0;
        struct sc_reg_access sc_access[5];
  
        if (snd_pmic_ops_nc.card_status == SND_CARD_UN_INIT)
                retval = nc_init_card();
        if (retval)
  
        pr_debug("powering dn nc_power_down ....\n");
  
+       if (snd_pmic_ops_nc.output_dev_id == MONO_EARPIECE ||
+           snd_pmic_ops_nc.output_dev_id == INTERNAL_SPKR)
+               nc_set_amp_power(0);
        msleep(30);
  
        sc_access[0].reg_addr = DRVPOWERCTRL;
        return nc_enable_audiodac(UNMUTE);
  }
  
- static int nc_power_down_pb(void)
+ static int nc_power_down_pb(unsigned int device)
  {
  
        int retval = 0;
                return retval;
  
        pr_debug("powering dn pb....\n");
+       mutex_lock(&snd_pmic_ops_nc.lock);
        nc_enable_audiodac(MUTE);
  
  
  
        msleep(30);
  
-       return nc_enable_audiodac(UNMUTE);
+       snd_pmic_ops_nc.pb_on = 0;
  
+       nc_enable_audiodac(UNMUTE);
+       mutex_unlock(&snd_pmic_ops_nc.lock);
+       return 0;
  }
  
- static int nc_power_down_cp(void)
+ static int nc_power_down_cp(unsigned int device)
  {
        struct sc_reg_access sc_access[] = {
                {POWERCTRL1, 0x00, 0xBE},
@@@ -498,11 -528,13 +529,13 @@@ static int nc_set_selected_output_dev(u
  {
        struct sc_reg_access sc_access_HP[] = {
                {LMUTE, 0x02, 0x06},
-               {RMUTE, 0x02, 0x06}
+               {RMUTE, 0x02, 0x06},
+               {DRVPOWERCTRL, 0x06, 0x06},
        };
        struct sc_reg_access sc_access_IS[] = {
                {LMUTE, 0x04, 0x06},
-               {RMUTE, 0x04, 0x06}
+               {RMUTE, 0x04, 0x06},
+               {DRVPOWERCTRL, 0x00, 0x06},
        };
        int retval = 0;
  
        if (retval)
                return retval;
        pr_debug("nc set selected output:%d\n", value);
+       mutex_lock(&snd_pmic_ops_nc.lock);
        switch (value) {
        case STEREO_HEADPHONE:
+               if (snd_pmic_ops_nc.pb_on)
+                       sst_sc_reg_access(sc_access_HP+2, PMIC_WRITE, 1);
                retval = sst_sc_reg_access(sc_access_HP, PMIC_WRITE, 2);
+               nc_set_amp_power(0);
                break;
+       case MONO_EARPIECE:
        case INTERNAL_SPKR:
-               retval = sst_sc_reg_access(sc_access_IS, PMIC_WRITE, 2);
+               retval = sst_sc_reg_access(sc_access_IS, PMIC_WRITE, 3);
+               if (snd_pmic_ops_nc.pb_on)
+                       nc_set_amp_power(1);
                break;
        default:
                pr_err("rcvd illegal request: %d\n", value);
+               mutex_unlock(&snd_pmic_ops_nc.lock);
                return -EINVAL;
        }
+       mutex_unlock(&snd_pmic_ops_nc.lock);
        return retval;
  }
  
@@@ -784,9 -825,8 +826,8 @@@ static int nc_set_vol(int dev_id, int v
        case PMIC_SND_LEFT_PB_VOL:
                pr_debug("PMIC_SND_LEFT_HP_VOL %d\n", value);
                sc_access[0].value = -value;
-               sc_access[0].reg_addr  = AUDIOLVOL;
-               sc_access[0].mask =
-                       (MASK0|MASK1|MASK2|MASK3|MASK4|MASK5|MASK6);
+               sc_access[0].reg_addr  = HPLVOL;
+               sc_access[0].mask = (MASK0|MASK1|MASK2|MASK3|MASK4);
                entries = 1;
                break;
  
                pr_debug("PMIC_SND_RIGHT_HP_VOL value %d\n", value);
                if (snd_pmic_ops_nc.num_channel == 1) {
                        sc_access[0].value = 0x04;
-                   sc_access[0].reg_addr = RMUTE;
+                       sc_access[0].reg_addr = RMUTE;
                        sc_access[0].mask = MASK2;
                } else {
+                       sc_access[0].value = -value;
+                       sc_access[0].reg_addr  = HPRVOL;
+                       sc_access[0].mask = (MASK0|MASK1|MASK2|MASK3|MASK4);
+               }
+               entries = 1;
+               break;
+       case PMIC_SND_LEFT_MASTER_VOL:
+               pr_debug("PMIC_SND_LEFT_MASTER_VOL value %d\n", value);
+               sc_access[0].value = -value;
+               sc_access[0].reg_addr = AUDIOLVOL;
+               sc_access[0].mask =
+                       (MASK0|MASK1|MASK2|MASK3|MASK4|MASK5|MASK6);
+               entries = 1;
+               break;
+       case PMIC_SND_RIGHT_MASTER_VOL:
+               pr_debug("PMIC_SND_RIGHT_MASTER_VOL value %d\n", value);
                sc_access[0].value = -value;
-               sc_access[0].reg_addr  = AUDIORVOL;
+               sc_access[0].reg_addr = AUDIORVOL;
                sc_access[0].mask =
                                (MASK0|MASK1|MASK2|MASK3|MASK4|MASK5|MASK6);
                entries = 1;
-               }
                break;
  
        default:
@@@ -831,7 -888,7 +889,7 @@@ static int nc_set_selected_input_dev(u
                pr_debug("Selecting AMIC\n");
                sc_access[0].reg_addr = 0x107;
                sc_access[0].value = 0x40;
-               sc_access[0].mask =  MASK6|MASK4|MASK3|MASK1|MASK0;
+               sc_access[0].mask =  MASK6|MASK3|MASK1|MASK0;
                sc_access[1].reg_addr = 0x10a;
                sc_access[1].value = 0x40;
                sc_access[1].mask = MASK6;
  
        case HS_MIC:
                pr_debug("Selecting HS_MIC\n");
-               sc_access[0].reg_addr = 0x107;
-               sc_access[0].mask =  MASK6|MASK4|MASK3|MASK1|MASK0;
-               sc_access[0].value = 0x10;
+               sc_access[0].reg_addr = MICCTRL;
+               sc_access[0].mask =  MASK6|MASK3|MASK1|MASK0;
+               sc_access[0].value = 0x00;
                sc_access[1].reg_addr = 0x109;
                sc_access[1].mask = MASK6;
                sc_access[1].value = 0x40;
                sc_access[3].reg_addr = 0x105;
                sc_access[3].value = 0x40;
                sc_access[3].mask = MASK6;
-               num_val = 4;
+               sc_access[4].reg_addr = ADCSAMPLERATE;
+               sc_access[4].mask = MASK7|MASK6|MASK5|MASK4|MASK3;
+               sc_access[4].value = 0xc8;
+               num_val = 5;
                break;
  
        case DMIC:
                pr_debug("DMIC\n");
-               sc_access[0].reg_addr = 0x107;
-               sc_access[0].mask = MASK6|MASK4|MASK3|MASK1|MASK0;
+               sc_access[0].reg_addr = MICCTRL;
+               sc_access[0].mask = MASK6|MASK3|MASK1|MASK0;
                sc_access[0].value = 0x0B;
                sc_access[1].reg_addr = 0x105;
                sc_access[1].value = 0x80;
                sc_access[2].reg_addr = 0x10a;
                sc_access[2].value = 0x40;
                sc_access[2].mask = MASK6;
-               sc_access[3].reg_addr = 0x109;
+               sc_access[3].reg_addr = LILSEL;
                sc_access[3].mask = MASK6;
                sc_access[3].value = 0x00;
-               sc_access[4].reg_addr = 0x104;
-               sc_access[4].value = 0x3C;
-               sc_access[4].mask = 0xff;
+               sc_access[4].reg_addr = ADCSAMPLERATE;
+               sc_access[4].mask =  MASK7|MASK6|MASK5|MASK4|MASK3;
+               sc_access[4].value = 0x33;
                num_val = 5;
                break;
        default:
@@@ -964,18 -1024,30 +1025,30 @@@ static int nc_get_vol(int dev_id, int *
                mask = (MASK0|MASK1|MASK2|MASK3|MASK4|MASK5);
                break;
  
-       case PMIC_SND_RIGHT_PB_VOL:
-               pr_debug("GET_VOLUME_PMIC_LEFT_HP_VOL\n");
+       case PMIC_SND_LEFT_MASTER_VOL:
+               pr_debug("GET_VOLUME_PMIC_LEFT_MASTER_VOL\n");
                sc_access.reg_addr = AUDIOLVOL;
                mask = (MASK0|MASK1|MASK2|MASK3|MASK4|MASK5|MASK6);
                break;
  
-       case PMIC_SND_LEFT_PB_VOL:
-               pr_debug("GET_VOLUME_PMIC_RIGHT_HP_VOL\n");
+       case PMIC_SND_RIGHT_MASTER_VOL:
+               pr_debug("GET_VOLUME_PMIC_RIGHT_MASTER_VOL\n");
                sc_access.reg_addr = AUDIORVOL;
                mask = (MASK0|MASK1|MASK2|MASK3|MASK4|MASK5|MASK6);
                break;
  
+       case PMIC_SND_RIGHT_PB_VOL:
+               pr_debug("GET_VOLUME_PMIC_RIGHT_HP_VOL\n");
+               sc_access.reg_addr = HPRVOL;
+               mask = (MASK0|MASK1|MASK2|MASK3|MASK4);
+               break;
+       case PMIC_SND_LEFT_PB_VOL:
+               pr_debug("GET_VOLUME_PMIC_LEFT_HP_VOL\n");
+               sc_access.reg_addr = HPLVOL;
+               mask = (MASK0|MASK1|MASK2|MASK3|MASK4);
+               break;
        default:
                return -EINVAL;
  
        return retval;
  }
  
+ static void hp_automute(enum snd_jack_types type, int present)
+ {
+       u8 in = DMIC;
+       u8 out = INTERNAL_SPKR;
+       if (present) {
+               if (type == SND_JACK_HEADSET)
+                       in = HS_MIC;
+               out = STEREO_HEADPHONE;
+       }
+       nc_set_selected_input_dev(in);
+       nc_set_selected_output_dev(out);
+ }
+ static void nc_pmic_irq_cb(void *cb_data, u8 intsts)
+ {
+       u8 value = 0;
+       struct mad_jack *mjack = NULL;
+       unsigned int present = 0, jack_event_flag = 0, buttonpressflag = 0;
+       struct snd_intelmad *intelmaddata = cb_data;
+       struct sc_reg_access sc_access_read = {0,};
+       sc_access_read.reg_addr = 0x132;
+       sst_sc_reg_access(&sc_access_read, PMIC_READ, 1);
+       value = (sc_access_read.value);
+       pr_debug("value returned = 0x%x\n", value);
+       mjack = &intelmaddata->jack[0];
+       if (intsts & 0x1) {
+               pr_debug("SST DBG:MAD headset detected\n");
+               /* send headset detect/undetect */
+               present = (value == 0x1) ? 1 : 0;
+               jack_event_flag = 1;
+               mjack->jack.type = SND_JACK_HEADSET;
+               hp_automute(SND_JACK_HEADSET, present);
+       }
+       if (intsts & 0x2) {
+               pr_debug(":MAD headphone detected\n");
+               /* send headphone detect/undetect */
+               present = (value == 0x2) ? 1 : 0;
+               jack_event_flag = 1;
+               mjack->jack.type = SND_JACK_HEADPHONE;
+               hp_automute(SND_JACK_HEADPHONE, present);
+       }
+       if (intsts & 0x4) {
+               pr_debug("MAD short push detected\n");
+               /* send short push */
+               present = 1;
+               jack_event_flag = 1;
+               buttonpressflag = 1;
+               mjack->jack.type = MID_JACK_HS_SHORT_PRESS;
+       }
+       if (intsts & 0x8) {
+               pr_debug(":MAD long push detected\n");
+               /* send long push */
+               present = 1;
+               jack_event_flag = 1;
+               buttonpressflag = 1;
+               mjack->jack.type = MID_JACK_HS_LONG_PRESS;
+       }
+       if (jack_event_flag)
+               sst_mad_send_jack_report(&mjack->jack,
+                                       buttonpressflag, present);
+ }
+ static int nc_jack_enable(void)
+ {
+       return 0;
+ }
  struct snd_pmic_ops snd_pmic_ops_nc = {
+       .input_dev_id   =       DMIC,
+       .output_dev_id  =       INTERNAL_SPKR,
        .set_input_dev  =       nc_set_selected_input_dev,
        .set_output_dev =       nc_set_selected_output_dev,
        .set_mute       =       nc_set_mute,
        .power_up_pmic_cp =     nc_power_up_cp,
        .power_down_pmic_pb =   nc_power_down_pb,
        .power_down_pmic_cp =   nc_power_down_cp,
-       .power_down_pmic =      nc_power_down,
+       .power_down_pmic        =       nc_power_down,
+       .pmic_irq_cb    =       nc_pmic_irq_cb,
+       .pmic_jack_enable =     nc_jack_enable,
  };
index 22c04eabed4116768959b10681c4c880c0940c7c,f4e974787ad6f8d61e308249e8b03b41d321bf7a..2245213df6078559b1a564f8b451b0ac732adf4c
@@@ -12,7 -12,6 +12,7 @@@
   */
  #include <linux/cs5535.h>
  #include <linux/gpio.h>
 +#include <linux/delay.h>
  #include <asm/olpc.h>
  
  #include "olpc_dcon.h"
@@@ -153,7 -152,7 +153,7 @@@ static void dcon_wiggle_xo_1(void
         * According to the cs5536 spec, to set GPIO14 to SMB_CLK we must
         * simultaneously set AUX1 IN/OUT to GPIO14; ditto for SMB_DATA and
         * GPIO15.
-        */
+        */
        cs5535_gpio_set(OLPC_GPIO_SMB_CLK, GPIO_OUTPUT_VAL);
        cs5535_gpio_set(OLPC_GPIO_SMB_DATA, GPIO_OUTPUT_VAL);
        cs5535_gpio_set(OLPC_GPIO_SMB_CLK, GPIO_OUTPUT_ENABLE);
index d89795c6a3ac2545be028198604443b3f37debe0,2fd2932432f5ffab067c610b83614c031dc417bc..2e8258754c96b0e3d03beee82b45b461bdc96e59
@@@ -23,7 -23,6 +23,7 @@@
  #include <linux/blkdev.h>
  #include <linux/kthread.h>
  #include <linux/sched.h>
 +#include <linux/vmalloc.h>
  
  #include "rtsx.h"
  #include "rtsx_transport.h"
@@@ -864,7 -863,7 +864,7 @@@ static int ms_read_attribute_info(struc
                TRACE_RET(chip, STATUS_FAIL);
        }
  
-       buf = (u8 *)rtsx_alloc_dma_buf(chip, 64 * 512, GFP_KERNEL);
+       buf = kmalloc(64 * 512, GFP_KERNEL);
        if (buf == NULL) {
                TRACE_RET(chip, STATUS_ERROR);
        }
                }
                retval = rtsx_read_register(chip, MS_TRANS_CFG, &val);
                if (retval != STATUS_SUCCESS) {
-                       rtsx_free_dma_buf(chip, buf);
+                       kfree(buf);
                        TRACE_RET(chip, STATUS_FAIL);
                }
                if (!(val & MS_INT_BREQ)) {
-                       rtsx_free_dma_buf(chip, buf);
+                       kfree(buf);
                        TRACE_RET(chip, STATUS_FAIL);
                }
                retval = ms_transfer_data(chip, MS_TM_AUTO_READ, PRO_READ_LONG_DATA,
                }
        }
        if (retval != STATUS_SUCCESS) {
-               rtsx_free_dma_buf(chip, buf);
+               kfree(buf);
                TRACE_RET(chip, STATUS_FAIL);
        }
  
        do {
                retval = rtsx_read_register(chip, MS_TRANS_CFG, &val);
                if (retval != STATUS_SUCCESS) {
-                       rtsx_free_dma_buf(chip, buf);
+                       kfree(buf);
                        TRACE_RET(chip, STATUS_FAIL);
                }
  
  
                retval = ms_transfer_tpc(chip, MS_TM_NORMAL_READ, PRO_READ_LONG_DATA, 0, WAIT_INT);
                if (retval != STATUS_SUCCESS) {
-                       rtsx_free_dma_buf(chip, buf);
+                       kfree(buf);
                        TRACE_RET(chip, STATUS_FAIL);
                }
  
        } while (i < 1024);
  
        if (retval != STATUS_SUCCESS) {
-               rtsx_free_dma_buf(chip, buf);
+               kfree(buf);
                TRACE_RET(chip, STATUS_FAIL);
        }
  
        if ((buf[0] != 0xa5) && (buf[1] != 0xc3)) {
                /* Signature code is wrong */
-               rtsx_free_dma_buf(chip, buf);
+               kfree(buf);
                TRACE_RET(chip, STATUS_FAIL);
        }
  
        if ((buf[4] < 1) || (buf[4] > 12)) {
-               rtsx_free_dma_buf(chip, buf);
+               kfree(buf);
                TRACE_RET(chip, STATUS_FAIL);
        }
  
                        RTSX_DEBUGP("sys_info_addr = 0x%x, sys_info_size = 0x%x\n",
                                        sys_info_addr, sys_info_size);
                        if (sys_info_size != 96)  {
-                               rtsx_free_dma_buf(chip, buf);
+                               kfree(buf);
                                TRACE_RET(chip, STATUS_FAIL);
                        }
                        if (sys_info_addr < 0x1A0) {
-                               rtsx_free_dma_buf(chip, buf);
+                               kfree(buf);
                                TRACE_RET(chip, STATUS_FAIL);
                        }
                        if ((sys_info_size + sys_info_addr) > 0x8000) {
-                               rtsx_free_dma_buf(chip, buf);
+                               kfree(buf);
                                TRACE_RET(chip, STATUS_FAIL);
                        }
  
                        RTSX_DEBUGP("model_name_addr = 0x%x, model_name_size = 0x%x\n",
                                        model_name_addr, model_name_size);
                        if (model_name_size != 48)  {
-                               rtsx_free_dma_buf(chip, buf);
+                               kfree(buf);
                                TRACE_RET(chip, STATUS_FAIL);
                        }
                        if (model_name_addr < 0x1A0) {
-                               rtsx_free_dma_buf(chip, buf);
+                               kfree(buf);
                                TRACE_RET(chip, STATUS_FAIL);
                        }
                        if ((model_name_size + model_name_addr) > 0x8000) {
-                               rtsx_free_dma_buf(chip, buf);
+                               kfree(buf);
                                TRACE_RET(chip, STATUS_FAIL);
                        }
  
        }
  
        if (i == buf[4]) {
-               rtsx_free_dma_buf(chip, buf);
+               kfree(buf);
                TRACE_RET(chip, STATUS_FAIL);
        }
  
        memcpy(ms_card->raw_model_name, buf + model_name_addr, 48);
  #endif
  
-       rtsx_free_dma_buf(chip, buf);
+       kfree(buf);
  
  #ifdef SUPPORT_MSXC
        if (CHK_MSXC(ms_card)) {
@@@ -3784,7 -3783,7 +3784,7 @@@ int mg_get_local_EKB(struct scsi_cmnd *
                TRACE_RET(chip, STATUS_FAIL);
        }
  
-       buf = (u8 *)rtsx_alloc_dma_buf(chip, 1540, GFP_KERNEL);
+       buf = kmalloc(1540, GFP_KERNEL);
        if (!buf) {
                TRACE_RET(chip, STATUS_ERROR);
        }
        rtsx_stor_set_xfer_buf(buf, bufflen, srb);
  
  GetEKBFinish:
-       if (buf) {
-               rtsx_free_dma_buf(chip, buf);
-       }
+       kfree(buf);
        return retval;
  }
  
@@@ -4022,7 -4019,7 +4020,7 @@@ int mg_get_ICV(struct scsi_cmnd *srb, s
                TRACE_RET(chip, STATUS_FAIL);
        }
  
-       buf = (u8 *)rtsx_alloc_dma_buf(chip, 1028, GFP_KERNEL);
+       buf = kmalloc(1028, GFP_KERNEL);
        if (!buf) {
                TRACE_RET(chip, STATUS_ERROR);
        }
        rtsx_stor_set_xfer_buf(buf, bufflen, srb);
  
  GetICVFinish:
-       if (buf) {
-               rtsx_free_dma_buf(chip, buf);
-       }
+       kfree(buf);
        return retval;
  }
  
@@@ -4081,7 -4076,7 +4077,7 @@@ int mg_set_ICV(struct scsi_cmnd *srb, s
                TRACE_RET(chip, STATUS_FAIL);
        }
  
-       buf = (u8 *)rtsx_alloc_dma_buf(chip, 1028, GFP_KERNEL);
+       buf = kmalloc(1028, GFP_KERNEL);
        if (!buf) {
                TRACE_RET(chip, STATUS_ERROR);
        }
  #endif
  
  SetICVFinish:
-       if (buf) {
-               rtsx_free_dma_buf(chip, buf);
-       }
+       kfree(buf);
        return retval;
  }
  
index b1277a6c7a8b857dd602ee610a764ab7810ec099,fbcc148d7b75d7b0ed3ab205e52b4a9710ff32b0..bddb0312b31eb2543f2baa75751c6a6e5d5c6109
@@@ -909,7 -909,7 +909,7 @@@ static int sd_change_phase(struct rtsx_
                RTSX_WRITE_REG(chip, SD_VPCLK0_CTL, PHASE_NOT_RESET, PHASE_NOT_RESET);
                RTSX_WRITE_REG(chip, CLK_CTL, CHANGE_CLK, 0);
        } else {
 -#if CONFIG_RTS_PSTOR_DEBUG
 +#ifdef CONFIG_RTS_PSTOR_DEBUG
                rtsx_read_register(chip, SD_VP_CTL, &val);
                RTSX_DEBUGP("SD_VP_CTL: 0x%x\n", val);
                rtsx_read_register(chip, SD_DCMPS_CTL, &val);
        return STATUS_SUCCESS;
  
  Fail:
 -#if CONFIG_RTS_PSTOR_DEBUG
 +#ifdef CONFIG_RTS_PSTOR_DEBUG
        rtsx_read_register(chip, SD_VP_CTL, &val);
        RTSX_DEBUGP("SD_VP_CTL: 0x%x\n", val);
        rtsx_read_register(chip, SD_DCMPS_CTL, &val);
@@@ -2227,6 -2227,7 +2227,7 @@@ static int sd_read_lba0(struct rtsx_chi
        retval = sd_read_data(chip, SD_TM_NORMAL_READ, cmd,
                5, 512, 1, bus_width, NULL, 0, 100);
        if (retval != STATUS_SUCCESS) {
+               rtsx_clear_sd_error(chip);
                TRACE_RET(chip, STATUS_FAIL);
        }
  
index 9f3add1e8f59d885564703688df6d76554d228c6,a58a689fe9b5397473ac3cef7a4f782f00f713ab..9bba5b11a824855fe7b3ed321edc203973d56673
@@@ -23,7 -23,6 +23,7 @@@
  #include <linux/blkdev.h>
  #include <linux/kthread.h>
  #include <linux/sched.h>
 +#include <linux/vmalloc.h>
  
  #include "rtsx.h"
  #include "rtsx_transport.h"
@@@ -380,7 -379,7 +380,7 @@@ static void xd_clear_dma_buffer(struct 
  
                RTSX_DEBUGP("xD ECC error, dummy write!\n");
  
-               buf = (u8 *)rtsx_alloc_dma_buf(chip, 512, GFP_KERNEL);
+               buf = kmalloc(512, GFP_KERNEL);
                if (!buf)
                        return;
  
                        rtsx_write_register(chip, CARD_STOP, SD_STOP | SD_CLR_ERR, SD_STOP | SD_CLR_ERR);
                }
  
-               rtsx_free_dma_buf(chip, buf);
+               kfree(buf);
  
                if (chip->asic_code) {
                        rtsx_write_register(chip, CARD_PULL_CTL2, 0xFF, 0x55);
index 4f4f13321f403866c579dfda8a10451b443ea73c,598f31180e96e2ce2fa888c75ddc121f6051c5d5..a76e8fa69b6e3b3685e4cdd6ceab849b2afeccd5
   * USA.
   */
  
- #include <linux/slab.h>
+ #include <linux/init.h>
+ #include <linux/kernel.h>
  #include <linux/kthread.h>
+ #include <linux/module.h>
+ #include <linux/platform_device.h>
+ #include <linux/slab.h>
  
  #include "usbip_common.h"
  #include "vhci.h"
  
- #define DRIVER_VERSION "1.0"
  #define DRIVER_AUTHOR "Takahiro Hirofuchi"
- #define DRIVER_DESC "Virtual Host Controller Interface Driver for USB/IP"
- #define DRIVER_LICENCE "GPL"
- MODULE_AUTHOR(DRIVER_AUTHOR);
- MODULE_DESCRIPTION(DRIVER_DESC);
- MODULE_LICENSE(DRIVER_LICENCE);
+ #define DRIVER_DESC "USB/IP 'Virtual' Host Controller (VHCI) Driver"
  
  /*
   * TODO
   *    - clean up everything
   */
  
  /* See usb gadget dummy hcd */
  
  static int vhci_hub_status(struct usb_hcd *hcd, char *buff);
  static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
-               u16 wIndex, char *buff, u16 wLength);
+                           u16 wIndex, char *buff, u16 wLength);
  static int vhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
-                                                       gfp_t mem_flags);
+                           gfp_t mem_flags);
  static int vhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status);
  static int vhci_start(struct usb_hcd *vhci_hcd);
  static void vhci_stop(struct usb_hcd *hcd);
@@@ -62,57 -57,53 +57,53 @@@ static const char driver_desc[] = "USB/
  
  struct vhci_hcd *the_controller;
  
- static const char *bit_desc[] = {
+ static const char * const bit_desc[] = {
        "CONNECTION",           /*0*/
        "ENABLE",               /*1*/
        "SUSPEND",              /*2*/
        "OVER_CURRENT",         /*3*/
        "RESET",                /*4*/
-       "R5",           /*5*/
-       "R6",           /*6*/
-       "R7",           /*7*/
+       "R5",                   /*5*/
+       "R6",                   /*6*/
+       "R7",                   /*7*/
        "POWER",                /*8*/
        "LOWSPEED",             /*9*/
        "HIGHSPEED",            /*10*/
        "PORT_TEST",            /*11*/
        "INDICATOR",            /*12*/
-       "R13",          /*13*/
-       "R14",          /*14*/
-       "R15",          /*15*/
+       "R13",                  /*13*/
+       "R14",                  /*14*/
+       "R15",                  /*15*/
        "C_CONNECTION",         /*16*/
        "C_ENABLE",             /*17*/
        "C_SUSPEND",            /*18*/
        "C_OVER_CURRENT",       /*19*/
        "C_RESET",              /*20*/
-       "R21",          /*21*/
-       "R22",          /*22*/
-       "R23",          /*23*/
-       "R24",          /*24*/
-       "R25",          /*25*/
-       "R26",          /*26*/
-       "R27",          /*27*/
-       "R28",          /*28*/
-       "R29",          /*29*/
-       "R30",          /*30*/
-       "R31",          /*31*/
+       "R21",                  /*21*/
+       "R22",                  /*22*/
+       "R23",                  /*23*/
+       "R24",                  /*24*/
+       "R25",                  /*25*/
+       "R26",                  /*26*/
+       "R27",                  /*27*/
+       "R28",                  /*28*/
+       "R29",                  /*29*/
+       "R30",                  /*30*/
+       "R31",                  /*31*/
  };
  
  static void dump_port_status(u32 status)
  {
        int i = 0;
  
-       printk(KERN_DEBUG "status %08x:", status);
+       pr_debug("status %08x:", status);
        for (i = 0; i < 32; i++) {
                if (status & (1 << i))
-                       printk(" %s", bit_desc[i]);
+                       pr_debug(" %s", bit_desc[i]);
        }
-       printk("\n");
+       pr_debug("\n");
  }
  
  void rh_port_connect(int rhport, enum usb_device_speed speed)
  {
        unsigned long   flags;
@@@ -156,26 -147,20 +147,20 @@@ void rh_port_disconnect(int rhport
        the_controller->port_status[rhport] |=
                                        (1 << USB_PORT_FEAT_C_CONNECTION);
  
        /* not yet complete the disconnection
         * spin_lock(&vdev->ud.lock);
         * vdev->ud.status = VHC_ST_DISCONNECT;
         * spin_unlock(&vdev->ud.lock); */
  
        spin_unlock_irqrestore(&the_controller->lock, flags);
        usb_hcd_poll_rh_status(vhci_to_hcd(the_controller));
  }
  
- /*----------------------------------------------------------------------*/
- #define PORT_C_MASK \
-       ((USB_PORT_STAT_C_CONNECTION \
-         | USB_PORT_STAT_C_ENABLE \
-         | USB_PORT_STAT_C_SUSPEND \
-         | USB_PORT_STAT_C_OVERCURRENT \
+ #define PORT_C_MASK                           \
+       ((USB_PORT_STAT_C_CONNECTION            \
+         | USB_PORT_STAT_C_ENABLE              \
+         | USB_PORT_STAT_C_SUSPEND             \
+         | USB_PORT_STAT_C_OVERCURRENT         \
          | USB_PORT_STAT_C_RESET) << 16)
  
  /*
@@@ -210,7 -195,6 +195,6 @@@ static int vhci_hub_status(struct usb_h
        int             rhport;
        int             changed = 0;
  
        *event_bits = 0;
  
        vhci = hcd_to_vhci(hcd);
                }
        }
  
-       usbip_uinfo("changed %d\n", changed);
+       pr_info("changed %d\n", changed);
  
        if (hcd->state == HC_STATE_SUSPENDED)
                usb_hcd_resume_root_hub(hcd);
@@@ -278,10 -262,9 +262,9 @@@ static int vhci_hub_control(struct usb_
         * wIndex shows the port number and begins from 1.
         */
        usbip_dbg_vhci_rh("typeReq %x wValue %x wIndex %x\n", typeReq, wValue,
-                                                               wIndex);
+                         wIndex);
        if (wIndex > VHCI_NPORTS)
-               printk(KERN_ERR "%s: invalid port number %d\n", __func__,
-                                                               wIndex);
+               pr_err("invalid port number %d\n", wIndex);
        rhport = ((__u8)(wIndex & 0x00ff)) - 1;
  
        dum = hcd_to_vhci(hcd);
                        break;
                case USB_PORT_FEAT_POWER:
                        usbip_dbg_vhci_rh(" ClearPortFeature: "
-                                               "USB_PORT_FEAT_POWER\n");
+                                         "USB_PORT_FEAT_POWER\n");
                        dum->port_status[rhport] = 0;
                        /* dum->address = 0; */
                        /* dum->hdev = 0; */
                        break;
                case USB_PORT_FEAT_C_RESET:
                        usbip_dbg_vhci_rh(" ClearPortFeature: "
-                                               "USB_PORT_FEAT_C_RESET\n");
+                                         "USB_PORT_FEAT_C_RESET\n");
                        switch (dum->vdev[rhport].speed) {
                        case USB_SPEED_HIGH:
                                dum->port_status[rhport] |=
-                                               USB_PORT_STAT_HIGH_SPEED;
+                                       USB_PORT_STAT_HIGH_SPEED;
                                break;
                        case USB_SPEED_LOW:
                                dum->port_status[rhport] |=
-                                               USB_PORT_STAT_LOW_SPEED;
+                                       USB_PORT_STAT_LOW_SPEED;
                                break;
                        default:
                                break;
                        }
                default:
                        usbip_dbg_vhci_rh(" ClearPortFeature: default %x\n",
-                                                               wValue);
+                                         wValue);
                        dum->port_status[rhport] &= ~(1 << wValue);
+                       break;
                }
                break;
        case GetHubDescriptor:
        case GetPortStatus:
                usbip_dbg_vhci_rh(" GetPortStatus port %x\n", wIndex);
                if (wIndex > VHCI_NPORTS || wIndex < 1) {
-                       printk(KERN_ERR "%s: invalid port number %d\n",
-                              __func__, wIndex);
+                       pr_err("invalid port number %d\n", wIndex);
                        retval = -EPIPE;
                }
  
                 * complete it!!
                 *                                   */
                if (dum->resuming && time_after(jiffies, dum->re_timeout)) {
-                       printk(KERN_ERR "%s: not yet\n", __func__);
                        dum->port_status[rhport] |=
                                        (1 << USB_PORT_FEAT_C_SUSPEND);
                        dum->port_status[rhport] &=
                }
  
                if ((dum->port_status[rhport] & (1 << USB_PORT_FEAT_RESET)) !=
-                               0 && time_after(jiffies, dum->re_timeout)) {
+                   0 && time_after(jiffies, dum->re_timeout)) {
                        dum->port_status[rhport] |=
-                                               (1 << USB_PORT_FEAT_C_RESET);
+                               (1 << USB_PORT_FEAT_C_RESET);
                        dum->port_status[rhport] &=
-                                               ~(1 << USB_PORT_FEAT_RESET);
+                               ~(1 << USB_PORT_FEAT_RESET);
                        dum->re_timeout = 0;
  
                        if (dum->vdev[rhport].ud.status ==
-                                                       VDEV_ST_NOTASSIGNED) {
+                           VDEV_ST_NOTASSIGNED) {
                                usbip_dbg_vhci_rh(" enable rhport %d "
-                                               "(status %u)\n",
-                                               rhport,
-                                               dum->vdev[rhport].ud.status);
+                                                 "(status %u)\n",
+                                                 rhport,
+                                                 dum->vdev[rhport].ud.status);
                                dum->port_status[rhport] |=
-                                                       USB_PORT_STAT_ENABLE;
+                                       USB_PORT_STAT_ENABLE;
                        }
  #if 0
                        if (dum->driver) {
                                dum->port_status[rhport] |=
-                                                       USB_PORT_STAT_ENABLE;
+                                       USB_PORT_STAT_ENABLE;
                                /* give it the best speed we agree on */
                                dum->gadget.speed = dum->driver->speed;
                                dum->gadget.ep0->maxpacket = 64;
                                switch (dum->gadget.speed) {
                                case USB_SPEED_HIGH:
                                        dum->port_status[rhport] |=
-                                       USB_PORT_STAT_HIGH_SPEED;
+                                               USB_PORT_STAT_HIGH_SPEED;
                                        break;
                                case USB_SPEED_LOW:
                                        dum->gadget.ep0->maxpacket = 8;
                                        dum->port_status[rhport] |=
-                                       USB_PORT_STAT_LOW_SPEED;
+                                               USB_PORT_STAT_LOW_SPEED;
                                        break;
                                default:
                                        dum->gadget.speed = USB_SPEED_FULL;
                                }
                        }
  #endif
                }
                ((u16 *) buf)[0] = cpu_to_le16(dum->port_status[rhport]);
-               ((u16 *) buf)[1] =
-                               cpu_to_le16(dum->port_status[rhport] >> 16);
+               ((u16 *) buf)[1] = cpu_to_le16(dum->port_status[rhport] >> 16);
  
                usbip_dbg_vhci_rh(" GetPortStatus bye %x %x\n", ((u16 *)buf)[0],
-                                                       ((u16 *)buf)[1]);
+                                 ((u16 *)buf)[1]);
                break;
        case SetHubFeature:
                usbip_dbg_vhci_rh(" SetHubFeature\n");
                switch (wValue) {
                case USB_PORT_FEAT_SUSPEND:
                        usbip_dbg_vhci_rh(" SetPortFeature: "
-                                       "USB_PORT_FEAT_SUSPEND\n");
-                       printk(KERN_ERR "%s: not yet\n", __func__);
+                                         "USB_PORT_FEAT_SUSPEND\n");
  #if 0
                        dum->port_status[rhport] |=
-                                               (1 << USB_PORT_FEAT_SUSPEND);
+                               (1 << USB_PORT_FEAT_SUSPEND);
                        if (dum->driver->suspend) {
                                spin_unlock(&dum->lock);
                                dum->driver->suspend(&dum->gadget);
                        break;
                case USB_PORT_FEAT_RESET:
                        usbip_dbg_vhci_rh(" SetPortFeature: "
-                                               "USB_PORT_FEAT_RESET\n");
+                                         "USB_PORT_FEAT_RESET\n");
                        /* if it's already running, disconnect first */
                        if (dum->port_status[rhport] & USB_PORT_STAT_ENABLE) {
                                dum->port_status[rhport] &=
-                                               ~(USB_PORT_STAT_ENABLE |
-                                                 USB_PORT_STAT_LOW_SPEED |
-                                                 USB_PORT_STAT_HIGH_SPEED);
+                                       ~(USB_PORT_STAT_ENABLE |
+                                         USB_PORT_STAT_LOW_SPEED |
+                                         USB_PORT_STAT_HIGH_SPEED);
  #if 0
                                if (dum->driver) {
                                        dev_dbg(hardware, "disconnect\n");
                        /* FALLTHROUGH */
                default:
                        usbip_dbg_vhci_rh(" SetPortFeature: default %d\n",
-                                                               wValue);
+                                         wValue);
                        dum->port_status[rhport] |= (1 << wValue);
+                       break;
                }
                break;
  
        default:
-               printk(KERN_ERR "%s: default: no such request\n", __func__);
+               pr_err("default: no such request\n");
                /* dev_dbg (hardware,
                 *              "hub control req%04x v%04x i%04x l%d\n",
                 *              typeReq, wValue, wIndex, wLength); */
        }
  
        if (usbip_dbg_flag_vhci_rh) {
-               printk(KERN_DEBUG "port %d\n", rhport);
+               pr_debug("port %d\n", rhport);
                dump_port_status(prev_port_status[rhport]);
                dump_port_status(dum->port_status[rhport]);
        }
        return retval;
  }
  
- /*----------------------------------------------------------------------*/
  static struct vhci_device *get_vdev(struct usb_device *udev)
  {
        int i;
@@@ -520,7 -495,7 +495,7 @@@ static void vhci_tx_urb(struct urb *urb
        unsigned long flag;
  
        if (!vdev) {
-               err("could not get virtual device");
+               pr_err("could not get virtual device");
                /* BUG(); */
                return;
        }
  
        priv->seqnum = atomic_inc_return(&the_controller->seqnum);
        if (priv->seqnum == 0xffff)
-               usbip_uinfo("seqnum max\n");
+               dev_info(&urb->dev->dev, "seqnum max\n");
  
        priv->vdev = vdev;
        priv->urb = urb;
  
        urb->hcpriv = (void *) priv;
  
        list_add_tail(&priv->list, &vdev->priv_tx);
  
        wake_up(&vdev->waitq_tx);
@@@ -561,7 -535,7 +535,7 @@@ static int vhci_urb_enqueue(struct usb_
        struct vhci_device *vdev;
  
        usbip_dbg_vhci_hc("enter, usb_hcd %p urb %p mem_flags %d\n",
-                   hcd, urb, mem_flags);
+                         hcd, urb, mem_flags);
  
        /* patch to usb_sg_init() is in 2.5.60 */
        BUG_ON(!urb->transfer_buffer && urb->transfer_buffer_length);
  
        /* refuse enqueue for dead connection */
        spin_lock(&vdev->ud.lock);
-       if (vdev->ud.status == VDEV_ST_NULL || vdev->ud.status == VDEV_ST_ERROR) {
-               usbip_uerr("enqueue for inactive port %d\n", vdev->rhport);
+       if (vdev->ud.status == VDEV_ST_NULL ||
+           vdev->ud.status == VDEV_ST_ERROR) {
+               dev_err(dev, "enqueue for inactive port %d\n", vdev->rhport);
                spin_unlock(&vdev->ud.lock);
                spin_unlock_irqrestore(&the_controller->lock, flags);
                return -ENODEV;
         *  2. Set_Address request to DevAddr(0) EndPoint(0)
         *
         */
        if (usb_pipedevice(urb->pipe) == 0) {
                __u8 type = usb_pipetype(urb->pipe);
                struct usb_ctrlrequest *ctrlreq =
-                               (struct usb_ctrlrequest *) urb->setup_packet;
+                       (struct usb_ctrlrequest *) urb->setup_packet;
  
                if (type != PIPE_CONTROL || !ctrlreq) {
                        dev_err(dev, "invalid request to devnum 0\n");
                case USB_REQ_GET_DESCRIPTOR:
                        if (ctrlreq->wValue == (USB_DT_DEVICE << 8))
                                usbip_dbg_vhci_hc("Not yet?: "
-                                               "Get_Descriptor to device 0 "
-                                               "(get max pipe size)\n");
+                                                 "Get_Descriptor to device 0 "
+                                                 "(get max pipe size)\n");
  
                        if (vdev->udev)
                                usb_put_dev(vdev->udev);
  
  out:
        vhci_tx_urb(urb);
        spin_unlock_irqrestore(&the_controller->lock, flags);
  
        return 0;
@@@ -724,8 -697,7 +697,7 @@@ static int vhci_urb_dequeue(struct usb_
        struct vhci_priv *priv;
        struct vhci_device *vdev;
  
-       usbip_uinfo("vhci_hcd: dequeue a urb %p\n", urb);
+       pr_info("dequeue a urb %p\n", urb);
  
        spin_lock_irqsave(&the_controller->lock, flags);
  
  
                spin_lock_irqsave(&vdev->priv_lock, flags2);
  
-               usbip_uinfo("vhci_hcd: device %p seems to be disconnected\n",
-                                                                       vdev);
+               pr_info("device %p seems to be disconnected\n", vdev);
                list_del(&priv->list);
                kfree(priv);
                urb->hcpriv = NULL;
                 * vhci_rx will receive RET_UNLINK and give back the URB.
                 * Otherwise, we give back it here.
                 */
-               usbip_uinfo("vhci_hcd: vhci_urb_dequeue() gives back urb %p\n",
-                                                                       urb);
+               pr_info("gives back urb %p\n", urb);
  
                usb_hcd_unlink_urb_from_ep(hcd, urb);
  
                spin_unlock_irqrestore(&the_controller->lock, flags);
                usb_hcd_giveback_urb(vhci_to_hcd(the_controller), urb,
-                                                               urb->status);
+                                    urb->status);
                spin_lock_irqsave(&the_controller->lock, flags);
  
        } else {
                /* setup CMD_UNLINK pdu */
                unlink = kzalloc(sizeof(struct vhci_unlink), GFP_ATOMIC);
                if (!unlink) {
-                       usbip_uerr("malloc vhci_unlink\n");
+                       pr_err("malloc vhci_unlink\n");
                        spin_unlock_irqrestore(&vdev->priv_lock, flags2);
                        spin_unlock_irqrestore(&the_controller->lock, flags);
                        usbip_event_add(&vdev->ud, VDEV_EVENT_ERROR_MALLOC);
  
                unlink->seqnum = atomic_inc_return(&the_controller->seqnum);
                if (unlink->seqnum == 0xffff)
-                       usbip_uinfo("seqnum max\n");
+                       pr_info("seqnum max\n");
  
                unlink->unlink_seqnum = priv->seqnum;
  
-               usbip_uinfo("vhci_hcd: device %p seems to be still connected\n",
-                                                                       vdev);
+               pr_info("device %p seems to be still connected\n", vdev);
  
                /* send cmd_unlink and try to cancel the pending URB in the
                 * peer */
@@@ -825,7 -794,7 +794,7 @@@ static void vhci_device_unlink_cleanup(
        spin_lock(&vdev->priv_lock);
  
        list_for_each_entry_safe(unlink, tmp, &vdev->unlink_tx, list) {
-               usbip_uinfo("unlink cleanup tx %lu\n", unlink->unlink_seqnum);
+               pr_info("unlink cleanup tx %lu\n", unlink->unlink_seqnum);
                list_del(&unlink->list);
                kfree(unlink);
        }
                struct urb *urb;
  
                /* give back URB of unanswered unlink request */
-               usbip_uinfo("unlink cleanup rx %lu\n", unlink->unlink_seqnum);
+               pr_info("unlink cleanup rx %lu\n", unlink->unlink_seqnum);
  
                urb = pickup_urb_and_free_priv(vdev, unlink->unlink_seqnum);
                if (!urb) {
-                       usbip_uinfo("the urb (seqnum %lu) was already given back\n",
-                                                       unlink->unlink_seqnum);
+                       pr_info("the urb (seqnum %lu) was already given back\n",
+                               unlink->unlink_seqnum);
                        list_del(&unlink->list);
                        kfree(unlink);
                        continue;
                usb_hcd_unlink_urb_from_ep(vhci_to_hcd(the_controller), urb);
                spin_unlock(&the_controller->lock);
  
-               usb_hcd_giveback_urb(vhci_to_hcd(the_controller), urb, urb->status);
+               usb_hcd_giveback_urb(vhci_to_hcd(the_controller), urb,
+                                    urb->status);
  
                list_del(&unlink->list);
                kfree(unlink);
@@@ -871,24 -841,22 +841,24 @@@ static void vhci_shutdown_connection(st
  
        /* need this? see stub_dev.c */
        if (ud->tcp_socket) {
-               usbip_udbg("shutdown tcp_socket %p\n", ud->tcp_socket);
+               pr_debug("shutdown tcp_socket %p\n", ud->tcp_socket);
                kernel_sock_shutdown(ud->tcp_socket, SHUT_RDWR);
        }
  
        /* kill threads related to this sdev, if v.c. exists */
 -      kthread_stop(vdev->ud.tcp_rx);
 -      kthread_stop(vdev->ud.tcp_tx);
 +      if (vdev->ud.tcp_rx)
 +              kthread_stop(vdev->ud.tcp_rx);
 +      if (vdev->ud.tcp_tx)
 +              kthread_stop(vdev->ud.tcp_tx);
  
-       usbip_uinfo("stop threads\n");
+       pr_info("stop threads\n");
  
        /* active connection is closed */
        if (vdev->ud.tcp_socket != NULL) {
                sock_release(vdev->ud.tcp_socket);
                vdev->ud.tcp_socket = NULL;
        }
-       usbip_uinfo("release socket\n");
+       pr_info("release socket\n");
  
        vhci_device_unlink_cleanup(vdev);
  
         */
        rh_port_disconnect(vdev->rhport);
  
-       usbip_uinfo("disconnect device\n");
+       pr_info("disconnect device\n");
  }
  
  
@@@ -932,7 -900,6 +902,6 @@@ static void vhci_device_reset(struct us
        vdev->udev = NULL;
  
        ud->tcp_socket = NULL;
        ud->status = VDEV_ST_NULL;
  
        spin_unlock(&ud->lock);
  static void vhci_device_unusable(struct usbip_device *ud)
  {
        spin_lock(&ud->lock);
        ud->status = VDEV_ST_ERROR;
        spin_unlock(&ud->lock);
  }
  
@@@ -951,6 -916,9 +918,6 @@@ static void vhci_device_init(struct vhc
  {
        memset(vdev, 0, sizeof(*vdev));
  
 -      vdev->ud.tcp_rx = kthread_create(vhci_rx_loop, &vdev->ud, "vhci_rx");
 -      vdev->ud.tcp_tx = kthread_create(vhci_tx_loop, &vdev->ud, "vhci_tx");
 -
        vdev->ud.side   = USBIP_VHCI;
        vdev->ud.status = VDEV_ST_NULL;
        /* vdev->ud.lock   = SPIN_LOCK_UNLOCKED; */
        usbip_start_eh(&vdev->ud);
  }
  
- /*----------------------------------------------------------------------*/
  static int vhci_start(struct usb_hcd *hcd)
  {
        struct vhci_hcd *vhci = hcd_to_vhci(hcd);
  
        usbip_dbg_vhci_hc("enter vhci_start\n");
  
        /* initialize private data of usb_hcd */
  
        for (rhport = 0; rhport < VHCI_NPORTS; rhport++) {
        atomic_set(&vhci->seqnum, 0);
        spin_lock_init(&vhci->lock);
  
        hcd->power_budget = 0; /* no limit */
        hcd->state  = HC_STATE_RUNNING;
        hcd->uses_new_polling = 1;
  
        /* vhci_hcd is now ready to be controlled through sysfs */
        err = sysfs_create_group(&vhci_dev(vhci)->kobj, &dev_attr_group);
        if (err) {
-               usbip_uerr("create sysfs files\n");
+               pr_err("create sysfs files\n");
                return err;
        }
  
@@@ -1019,7 -980,6 +979,6 @@@ static void vhci_stop(struct usb_hcd *h
  
        usbip_dbg_vhci_hc("stop VHCI controller\n");
  
        /* 1. remove the userland interface of vhci_hcd */
        sysfs_remove_group(&vhci_dev(vhci)->kobj, &dev_attr_group);
  
                usbip_event_add(&vdev->ud, VDEV_EVENT_REMOVED);
                usbip_stop_eh(&vdev->ud);
        }
-       usbip_uinfo("vhci_stop done\n");
  }
  
- /*----------------------------------------------------------------------*/
  static int vhci_get_frame_number(struct usb_hcd *hcd)
  {
-       usbip_uerr("Not yet implemented\n");
+       pr_err("Not yet implemented\n");
        return 0;
  }
  
  #ifdef CONFIG_PM
  
  /* FIXME: suspend/resume */
@@@ -1091,8 -1045,6 +1044,6 @@@ static int vhci_bus_resume(struct usb_h
  #define vhci_bus_resume       NULL
  #endif
  
  static struct hc_driver vhci_hc_driver = {
        .description    = driver_name,
        .product_desc   = driver_desc,
@@@ -1119,8 -1071,6 +1070,6 @@@ static int vhci_hcd_probe(struct platfo
        struct usb_hcd          *hcd;
        int                     ret;
  
-       usbip_uinfo("proving...\n");
        usbip_dbg_vhci_hc("name %s id %d\n", pdev->name, pdev->id);
  
        /* will be removed */
         */
        hcd = usb_create_hcd(&vhci_hc_driver, &pdev->dev, dev_name(&pdev->dev));
        if (!hcd) {
-               usbip_uerr("create hcd failed\n");
+               pr_err("create hcd failed\n");
                return -ENOMEM;
        }
 -
 +      hcd->has_tt = 1;
  
        /* this is private data for vhci_hcd */
        the_controller = hcd_to_vhci(hcd);
         */
        ret = usb_add_hcd(hcd, 0, 0);
        if (ret != 0) {
-               usbip_uerr("usb_add_hcd failed %d\n", ret);
+               pr_err("usb_add_hcd failed %d\n", ret);
                usb_put_hcd(hcd);
                the_controller = NULL;
                return ret;
        }
  
        usbip_dbg_vhci_hc("bye\n");
        return 0;
  }
  
  static int vhci_hcd_remove(struct platform_device *pdev)
  {
        struct usb_hcd  *hcd;
        usb_put_hcd(hcd);
        the_controller = NULL;
  
        return 0;
  }
  
  #ifdef CONFIG_PM
  
  /* what should happen for USB/IP under suspend/resume? */
@@@ -1194,25 -1139,23 +1138,23 @@@ static int vhci_hcd_suspend(struct plat
        int connected = 0;
        int ret = 0;
  
-       dev_dbg(&pdev->dev, "%s\n", __func__);
        hcd = platform_get_drvdata(pdev);
  
        spin_lock(&the_controller->lock);
  
        for (rhport = 0; rhport < VHCI_NPORTS; rhport++)
                if (the_controller->port_status[rhport] &
-                                               USB_PORT_STAT_CONNECTION)
+                   USB_PORT_STAT_CONNECTION)
                        connected += 1;
  
        spin_unlock(&the_controller->lock);
  
        if (connected > 0) {
-               usbip_uinfo("We have %d active connection%s. Do not suspend.\n",
-                               connected, (connected == 1 ? "" : "s"));
+               dev_info(&pdev->dev, "We have %d active connection%s. Do not "
+                        "suspend.\n", connected, (connected == 1 ? "" : "s"));
                ret =  -EBUSY;
        } else {
-               usbip_uinfo("suspend vhci_hcd");
+               dev_info(&pdev->dev, "suspend vhci_hcd");
                clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
        }
  
@@@ -1239,7 -1182,6 +1181,6 @@@ static int vhci_hcd_resume(struct platf
  
  #endif
  
  static struct platform_driver vhci_driver = {
        .probe  = vhci_hcd_probe,
        .remove = __devexit_p(vhci_hcd_remove),
        },
  };
  
- /*----------------------------------------------------------------------*/
  /*
   * The VHCI 'device' is 'virtual'; not a real plug&play hardware.
   * We need to add this virtual device as a platform device arbitrarily:
@@@ -1277,13 -1217,9 +1216,9 @@@ static int __init vhci_init(void
  {
        int ret;
  
-       usbip_dbg_vhci_hc("enter\n");
        if (usb_disabled())
                return -ENODEV;
  
-       printk(KERN_INFO KBUILD_MODNAME ": %s, %s\n", driver_name,
-              DRIVER_VERSION);
        ret = platform_driver_register(&vhci_driver);
        if (ret < 0)
                goto err_driver_register;
        if (ret < 0)
                goto err_platform_device_register;
  
-       usbip_dbg_vhci_hc("bye\n");
+       pr_info(DRIVER_DESC " v" USBIP_VERSION "\n");
        return ret;
  
-       /* error occurred */
  err_platform_device_register:
        platform_driver_unregister(&vhci_driver);
  err_driver_register:
-       usbip_dbg_vhci_hc("bye\n");
        return ret;
  }
- module_init(vhci_init);
  
  static void __exit vhci_cleanup(void)
  {
-       usbip_dbg_vhci_hc("enter\n");
        platform_device_unregister(&the_pdev);
        platform_driver_unregister(&vhci_driver);
-       usbip_dbg_vhci_hc("bye\n");
  }
+ module_init(vhci_init);
  module_exit(vhci_cleanup);
+ MODULE_AUTHOR(DRIVER_AUTHOR);
+ MODULE_DESCRIPTION(DRIVER_DESC);
+ MODULE_LICENSE("GPL");
+ MODULE_VERSION(USBIP_VERSION);
index e2dadbd5ef1e2707956faa774f3c42ec44c039d4,68c7f0aae6e75af2bb6db61266934e5c71991554..d9736f9c4028bc38b04850ee3d002c131d888a71
   * USA.
   */
  
+ #include <linux/kthread.h>
+ #include <linux/net.h>
  #include "usbip_common.h"
  #include "vhci.h"
  
- #include <linux/in.h>
- #include <linux/kthread.h>
  /* TODO: refine locking ?*/
  
  /* Sysfs entry to show port status */
@@@ -53,20 -53,19 +53,19 @@@ static ssize_t show_status(struct devic
                struct vhci_device *vdev = port_to_vdev(i);
  
                spin_lock(&vdev->ud.lock);
                out += sprintf(out, "%03u %03u ", i, vdev->ud.status);
  
                if (vdev->ud.status == VDEV_ST_USED) {
                        out += sprintf(out, "%03u %08x ",
-                                       vdev->speed, vdev->devid);
+                                      vdev->speed, vdev->devid);
                        out += sprintf(out, "%16p ", vdev->ud.tcp_socket);
                        out += sprintf(out, "%s", dev_name(&vdev->udev->dev));
  
-               } else
+               } else {
                        out += sprintf(out, "000 000 000 0000000000000000 0-0");
+               }
  
                out += sprintf(out, "\n");
                spin_unlock(&vdev->ud.lock);
        }
  
@@@ -90,7 -89,7 +89,7 @@@ static int vhci_port_disconnect(__u32 r
  
        spin_lock(&vdev->ud.lock);
        if (vdev->ud.status == VDEV_ST_NULL) {
-               usbip_uerr("not connected %d\n", vdev->ud.status);
+               pr_err("not connected %d\n", vdev->ud.status);
  
                /* unlock */
                spin_unlock(&vdev->ud.lock);
@@@ -118,7 -117,7 +117,7 @@@ static ssize_t store_detach(struct devi
  
        /* check rhport */
        if (rhport >= VHCI_NPORTS) {
-               usbip_uerr("invalid port %u\n", rhport);
+               dev_err(dev, "invalid port %u\n", rhport);
                return -EINVAL;
        }
  
                return -EINVAL;
  
        usbip_dbg_vhci_sysfs("Leave\n");
        return count;
  }
  static DEVICE_ATTR(detach, S_IWUSR, NULL, store_detach);
@@@ -136,7 -136,7 +136,7 @@@ static int valid_args(__u32 rhport, enu
  {
        /* check rhport */
        if ((rhport < 0) || (rhport >= VHCI_NPORTS)) {
-               usbip_uerr("port %u\n", rhport);
+               pr_err("port %u\n", rhport);
                return -EINVAL;
        }
  
        case USB_SPEED_WIRELESS:
                break;
        default:
-               usbip_uerr("speed %d\n", speed);
+               pr_err("speed %d\n", speed);
                return -EINVAL;
        }
  
@@@ -183,8 -183,7 +183,7 @@@ static ssize_t store_attach(struct devi
        sscanf(buf, "%u %u %u %u", &rhport, &sockfd, &devid, &speed);
  
        usbip_dbg_vhci_sysfs("rhport(%u) sockfd(%u) devid(%u) speed(%u)\n",
-                               rhport, sockfd, devid, speed);
+                            rhport, sockfd, devid, speed);
  
        /* check received parameters */
        if (valid_args(rhport, speed) < 0)
  
        /* begin a lock */
        spin_lock(&the_controller->lock);
        vdev = port_to_vdev(rhport);
        spin_lock(&vdev->ud.lock);
  
        if (vdev->ud.status != VDEV_ST_NULL) {
                spin_unlock(&vdev->ud.lock);
                spin_unlock(&the_controller->lock);
  
-               usbip_uerr("port %d already used\n", rhport);
+               dev_err(dev, "port %d already used\n", rhport);
                return -EINVAL;
        }
  
-       usbip_uinfo("rhport(%u) sockfd(%d) devid(%u) speed(%u)\n",
-                               rhport, sockfd, devid, speed);
+       dev_info(dev, "rhport(%u) sockfd(%d) devid(%u) speed(%u)\n",
+                rhport, sockfd, devid, speed);
  
        vdev->devid         = devid;
        vdev->speed         = speed;
        vdev->ud.tcp_socket = socket;
        vdev->ud.status     = VDEV_ST_NOTASSIGNED;
  
 -      wake_up_process(vdev->ud.tcp_rx);
 -      wake_up_process(vdev->ud.tcp_tx);
 -
        spin_unlock(&vdev->ud.lock);
        spin_unlock(&the_controller->lock);
        /* end the lock */
  
 +      vdev->ud.tcp_rx = kthread_run(vhci_rx_loop, &vdev->ud, "vhci_rx");
 +      vdev->ud.tcp_tx = kthread_run(vhci_tx_loop, &vdev->ud, "vhci_tx");
 +
        rh_port_connect(rhport, speed);
  
        return count;
diff --combined kernel/module.c
index 22879725678dfcd53324698504500dc97decdea6,4d5c16aae7459306f68c9b08720abe38820b4552..795bdc7f5c3f270301abcb56e2f787550f36c6b9
@@@ -57,7 -57,6 +57,7 @@@
  #include <linux/kmemleak.h>
  #include <linux/jump_label.h>
  #include <linux/pfn.h>
 +#include <linux/bsearch.h>
  
  #define CREATE_TRACE_POINTS
  #include <trace/events/module.h>
@@@ -241,24 -240,23 +241,24 @@@ static bool each_symbol_in_section(cons
                                   struct module *owner,
                                   bool (*fn)(const struct symsearch *syms,
                                              struct module *owner,
 -                                            unsigned int symnum, void *data),
 +                                            void *data),
                                   void *data)
  {
 -      unsigned int i, j;
 +      unsigned int j;
  
        for (j = 0; j < arrsize; j++) {
 -              for (i = 0; i < arr[j].stop - arr[j].start; i++)
 -                      if (fn(&arr[j], owner, i, data))
 -                              return true;
 +              if (fn(&arr[j], owner, data))
 +                      return true;
        }
  
        return false;
  }
  
  /* Returns true as soon as fn returns true, otherwise false. */
 -bool each_symbol(bool (*fn)(const struct symsearch *arr, struct module *owner,
 -                          unsigned int symnum, void *data), void *data)
 +bool each_symbol_section(bool (*fn)(const struct symsearch *arr,
 +                                  struct module *owner,
 +                                  void *data),
 +                       void *data)
  {
        struct module *mod;
        static const struct symsearch arr[] = {
        }
        return false;
  }
 -EXPORT_SYMBOL_GPL(each_symbol);
 +EXPORT_SYMBOL_GPL(each_symbol_section);
  
  struct find_symbol_arg {
        /* Input */
        const struct kernel_symbol *sym;
  };
  
 -static bool find_symbol_in_section(const struct symsearch *syms,
 -                                 struct module *owner,
 -                                 unsigned int symnum, void *data)
 +static bool check_symbol(const struct symsearch *syms,
 +                               struct module *owner,
 +                               unsigned int symnum, void *data)
  {
        struct find_symbol_arg *fsa = data;
  
 -      if (strcmp(syms->start[symnum].name, fsa->name) != 0)
 -              return false;
 -
        if (!fsa->gplok) {
                if (syms->licence == GPL_ONLY)
                        return false;
        return true;
  }
  
 +static int cmp_name(const void *va, const void *vb)
 +{
 +      const char *a;
 +      const struct kernel_symbol *b;
 +      a = va; b = vb;
 +      return strcmp(a, b->name);
 +}
 +
 +static bool find_symbol_in_section(const struct symsearch *syms,
 +                                 struct module *owner,
 +                                 void *data)
 +{
 +      struct find_symbol_arg *fsa = data;
 +      struct kernel_symbol *sym;
 +
 +      sym = bsearch(fsa->name, syms->start, syms->stop - syms->start,
 +                      sizeof(struct kernel_symbol), cmp_name);
 +
 +      if (sym != NULL && check_symbol(syms, owner, sym - syms->start, data))
 +              return true;
 +
 +      return false;
 +}
 +
  /* Find a symbol and return it, along with, (optional) crc and
   * (optional) module which owns it.  Needs preempt disabled or module_mutex. */
  const struct kernel_symbol *find_symbol(const char *name,
        fsa.gplok = gplok;
        fsa.warn = warn;
  
 -      if (each_symbol(find_symbol_in_section, &fsa)) {
 +      if (each_symbol_section(find_symbol_in_section, &fsa)) {
                if (owner)
                        *owner = fsa.owner;
                if (crc)
@@@ -1630,28 -1607,27 +1630,28 @@@ static void set_section_ro_nx(void *bas
        }
  }
  
 -/* Setting memory back to RW+NX before releasing it */
 -void unset_section_ro_nx(struct module *mod, void *module_region)
 +static void unset_module_core_ro_nx(struct module *mod)
  {
 -      unsigned long total_pages;
 -
 -      if (mod->module_core == module_region) {
 -              /* Set core as NX+RW */
 -              total_pages = MOD_NUMBER_OF_PAGES(mod->module_core, mod->core_size);
 -              set_memory_nx((unsigned long)mod->module_core, total_pages);
 -              set_memory_rw((unsigned long)mod->module_core, total_pages);
 +      set_page_attributes(mod->module_core + mod->core_text_size,
 +              mod->module_core + mod->core_size,
 +              set_memory_x);
 +      set_page_attributes(mod->module_core,
 +              mod->module_core + mod->core_ro_size,
 +              set_memory_rw);
 +}
  
 -      } else if (mod->module_init == module_region) {
 -              /* Set init as NX+RW */
 -              total_pages = MOD_NUMBER_OF_PAGES(mod->module_init, mod->init_size);
 -              set_memory_nx((unsigned long)mod->module_init, total_pages);
 -              set_memory_rw((unsigned long)mod->module_init, total_pages);
 -      }
 +static void unset_module_init_ro_nx(struct module *mod)
 +{
 +      set_page_attributes(mod->module_init + mod->init_text_size,
 +              mod->module_init + mod->init_size,
 +              set_memory_x);
 +      set_page_attributes(mod->module_init,
 +              mod->module_init + mod->init_ro_size,
 +              set_memory_rw);
  }
  
  /* Iterate through all modules and set each module's text as RW */
 -void set_all_modules_text_rw()
 +void set_all_modules_text_rw(void)
  {
        struct module *mod;
  
  }
  
  /* Iterate through all modules and set each module's text as RO */
 -void set_all_modules_text_ro()
 +void set_all_modules_text_ro(void)
  {
        struct module *mod;
  
  }
  #else
  static inline void set_section_ro_nx(void *base, unsigned long text_size, unsigned long ro_size, unsigned long total_size) { }
 -static inline void unset_section_ro_nx(struct module *mod, void *module_region) { }
 +static void unset_module_core_ro_nx(struct module *mod) { }
 +static void unset_module_init_ro_nx(struct module *mod) { }
  #endif
  
  /* Free a module, remove from lists, etc. */
@@@ -1721,7 -1696,7 +1721,7 @@@ static void free_module(struct module *
        destroy_params(mod->kp, mod->num_kp);
  
        /* This may be NULL, but that's OK */
 -      unset_section_ro_nx(mod, mod->module_init);
 +      unset_module_init_ro_nx(mod);
        module_free(mod, mod->module_init);
        kfree(mod->args);
        percpu_modfree(mod);
        lockdep_free_key_range(mod->module_core, mod->core_size);
  
        /* Finally, free the core (containing the module structure) */
 -      unset_section_ro_nx(mod, mod->module_core);
 +      unset_module_core_ro_nx(mod);
        module_free(mod, mod->module_core);
  
  #ifdef CONFIG_MPU
@@@ -2055,8 -2030,11 +2055,8 @@@ static const struct kernel_symbol *look
        const struct kernel_symbol *start,
        const struct kernel_symbol *stop)
  {
 -      const struct kernel_symbol *ks = start;
 -      for (; ks < stop; ks++)
 -              if (strcmp(ks->name, name) == 0)
 -                      return ks;
 -      return NULL;
 +      return bsearch(name, start, stop - start,
 +                      sizeof(struct kernel_symbol), cmp_name);
  }
  
  static int is_exported(const char *name, unsigned long value,
@@@ -2812,7 -2790,7 +2812,7 @@@ static struct module *load_module(void 
        }
  
        /* This has to be done once we're sure module name is unique. */
-       if (!mod->taints)
+       if (!mod->taints || mod->taints == (1U<<TAINT_CRAP))
                dynamic_debug_setup(info.debug, info.num_debug);
  
        /* Find duplicate symbols */
        module_bug_cleanup(mod);
  
   ddebug:
-       if (!mod->taints)
+       if (!mod->taints || mod->taints == (1U<<TAINT_CRAP))
                dynamic_debug_remove(info.debug);
   unlock:
        mutex_unlock(&module_mutex);
@@@ -2953,11 -2931,10 +2953,11 @@@ SYSCALL_DEFINE3(init_module, void __use
        mod->symtab = mod->core_symtab;
        mod->strtab = mod->core_strtab;
  #endif
 -      unset_section_ro_nx(mod, mod->module_init);
 +      unset_module_init_ro_nx(mod);
        module_free(mod, mod->module_init);
        mod->module_init = NULL;
        mod->init_size = 0;
 +      mod->init_ro_size = 0;
        mod->init_text_size = 0;
        mutex_unlock(&module_mutex);