diff options
Diffstat (limited to 'drivers/media/common/siano/smsdvb-main.c')
-rw-r--r-- | drivers/media/common/siano/smsdvb-main.c | 58 |
1 files changed, 47 insertions, 11 deletions
diff --git a/drivers/media/common/siano/smsdvb-main.c b/drivers/media/common/siano/smsdvb-main.c index ae17407e477a..cd5bafe9a3ac 100644 --- a/drivers/media/common/siano/smsdvb-main.c +++ b/drivers/media/common/siano/smsdvb-main.c @@ -167,6 +167,34 @@ static inline int sms_to_mode(u32 mode) return TRANSMISSION_MODE_AUTO; } +static inline int sms_to_isdbt_mode(u32 mode) +{ + switch (mode) { + case 1: + return TRANSMISSION_MODE_2K; + case 2: + return TRANSMISSION_MODE_4K; + case 3: + return TRANSMISSION_MODE_8K; + } + return TRANSMISSION_MODE_AUTO; +} + +static inline int sms_to_isdbt_guard_interval(u32 interval) +{ + switch (interval) { + case 4: + return GUARD_INTERVAL_1_4; + case 8: + return GUARD_INTERVAL_1_8; + case 16: + return GUARD_INTERVAL_1_16; + case 32: + return GUARD_INTERVAL_1_32; + } + return GUARD_INTERVAL_AUTO; +} + static inline int sms_to_status(u32 is_demod_locked, u32 is_rf_locked) { if (is_demod_locked) @@ -345,8 +373,8 @@ static void smsdvb_update_isdbt_stats(struct smsdvb_client_t *client, /* Update ISDB-T transmission parameters */ c->frequency = p->frequency; c->bandwidth_hz = sms_to_bw(p->bandwidth); - c->transmission_mode = sms_to_mode(p->transmission_mode); - c->guard_interval = sms_to_guard_interval(p->guard_interval); + c->transmission_mode = sms_to_isdbt_mode(p->transmission_mode); + c->guard_interval = sms_to_isdbt_guard_interval(p->guard_interval); c->isdbt_partial_reception = p->partial_reception ? 1 : 0; n_layers = p->num_of_layers; if (n_layers < 1) @@ -391,6 +419,10 @@ static void smsdvb_update_isdbt_stats(struct smsdvb_client_t *client, continue; } c->layer[i].modulation = sms_to_modulation(lr->constellation); + c->layer[i].fec = sms_to_code_rate(lr->code_rate); + + /* Time interleaving */ + c->layer[i].interleaving = (u8)lr->ti_ldepth_i; /* TS PER */ c->block_error.stat[i + 1].scale = FE_SCALE_COUNTER; @@ -429,8 +461,8 @@ static void smsdvb_update_isdbt_stats_ex(struct smsdvb_client_t *client, c->frequency = p->frequency; client->fe_status = sms_to_status(p->is_demod_locked, 0); c->bandwidth_hz = sms_to_bw(p->bandwidth); - c->transmission_mode = sms_to_mode(p->transmission_mode); - c->guard_interval = sms_to_guard_interval(p->guard_interval); + c->transmission_mode = sms_to_isdbt_mode(p->transmission_mode); + c->guard_interval = sms_to_isdbt_guard_interval(p->guard_interval); c->isdbt_partial_reception = p->partial_reception ? 1 : 0; n_layers = p->num_of_layers; if (n_layers < 1) @@ -479,6 +511,10 @@ static void smsdvb_update_isdbt_stats_ex(struct smsdvb_client_t *client, continue; } c->layer[i].modulation = sms_to_modulation(lr->constellation); + c->layer[i].fec = sms_to_code_rate(lr->code_rate); + + /* Time interleaving */ + c->layer[i].interleaving = (u8)lr->ti_ldepth_i; /* TS PER */ c->block_error.stat[i + 1].scale = FE_SCALE_COUNTER; @@ -630,11 +666,11 @@ static void smsdvb_unregister_client(struct smsdvb_client_t *client) static void smsdvb_onremove(void *context) { - kmutex_lock(&g_smsdvb_clientslock); + mutex_lock(&g_smsdvb_clientslock); smsdvb_unregister_client((struct smsdvb_client_t *) context); - kmutex_unlock(&g_smsdvb_clientslock); + mutex_unlock(&g_smsdvb_clientslock); } static int smsdvb_start_feed(struct dvb_demux_feed *feed) @@ -1151,11 +1187,11 @@ static int smsdvb_hotplug(struct smscore_device_t *coredev, init_completion(&client->tune_done); init_completion(&client->stats_done); - kmutex_lock(&g_smsdvb_clientslock); + mutex_lock(&g_smsdvb_clientslock); list_add(&client->entry, &g_smsdvb_clients); - kmutex_unlock(&g_smsdvb_clientslock); + mutex_unlock(&g_smsdvb_clientslock); client->event_fe_state = -1; client->event_unc_state = -1; @@ -1201,7 +1237,7 @@ static int __init smsdvb_module_init(void) int rc; INIT_LIST_HEAD(&g_smsdvb_clients); - kmutex_init(&g_smsdvb_clientslock); + mutex_init(&g_smsdvb_clientslock); smsdvb_debugfs_register(); @@ -1216,14 +1252,14 @@ static void __exit smsdvb_module_exit(void) { smscore_unregister_hotplug(smsdvb_hotplug); - kmutex_lock(&g_smsdvb_clientslock); + mutex_lock(&g_smsdvb_clientslock); while (!list_empty(&g_smsdvb_clients)) smsdvb_unregister_client((struct smsdvb_client_t *)g_smsdvb_clients.next); smsdvb_debugfs_unregister(); - kmutex_unlock(&g_smsdvb_clientslock); + mutex_unlock(&g_smsdvb_clientslock); } module_init(smsdvb_module_init); |