radio-tavarua: Set the lower and upper band limits for all regions

Configure the lower and upper band limits for all regions.

Change-Id: Ie9ceced02be0d3f5b335fb7eb6594d5783823f91
CRs-Fixed: 326007, 325078
Signed-off-by: Anantha Krishnan <ananthk@codeaurora.org>
diff --git a/drivers/media/radio/radio-tavarua.c b/drivers/media/radio/radio-tavarua.c
index b73775c..393e30e 100644
--- a/drivers/media/radio/radio-tavarua.c
+++ b/drivers/media/radio/radio-tavarua.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2011, Code Aurora Forum. All rights reserved.
+/* Copyright (c) 2009-2012, Code Aurora Forum. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -1416,93 +1416,49 @@
 	adie_type_bahma = is_bahama();
 
 	/* Set freq band */
-	switch (region) {
-	case TAVARUA_REGION_US:
-	case TAVARUA_REGION_EU:
+	if (region == TAVARUA_REGION_JAPAN)
+		SET_REG_FIELD(radio->registers[RDCTRL], 1,
+			RDCTRL_BAND_OFFSET, RDCTRL_BAND_MASK);
+	else
 		SET_REG_FIELD(radio->registers[RDCTRL], 0,
 			RDCTRL_BAND_OFFSET, RDCTRL_BAND_MASK);
-		break;
-	case TAVARUA_REGION_JAPAN_WIDE:
-	case TAVARUA_REGION_JAPAN:
-	default:
-		retval = sync_read_xfr(radio, RADIO_CONFIG, xfr_buf);
-		if (retval < 0) {
-			FMDERR("failed to get RADIO_CONFIG\n");
-			return retval;
-		}
-		band_low = (radio->region_params.band_low -
-					low_band_limit) / spacing;
-		band_high = (radio->region_params.band_high -
-					low_band_limit) / spacing;
-		FMDBG("low_band: %x, high_band: %x\n", band_low, band_high);
-		xfr_buf[0] = band_low >> 8;
-		xfr_buf[1] = band_low & 0xFF;
-		xfr_buf[2] = band_high >> 8;
-		xfr_buf[3] = band_high & 0xFF;
-		retval = sync_write_xfr(radio, RADIO_CONFIG, xfr_buf);
-		if (retval < 0) {
-			FMDERR("Could not set regional settings\n");
-			return retval;
-		}
-		break;
-	}
 
 	/* Set De-emphasis and soft band range*/
-	switch (region) {
-	case TAVARUA_REGION_US:
-	case TAVARUA_REGION_JAPAN:
-	case TAVARUA_REGION_JAPAN_WIDE:
-		value = EMP_75;
-		break;
-	case TAVARUA_REGION_EU:
-		value = EMP_50;
-		break;
-	default:
-		value = radio->region_params.emphasis;
-	}
-
-	SET_REG_FIELD(radio->registers[RDCTRL], value,
+	SET_REG_FIELD(radio->registers[RDCTRL], radio->region_params.emphasis,
 		RDCTRL_DEEMPHASIS_OFFSET, RDCTRL_DEEMPHASIS_MASK);
 
 	/* set RDS standard */
-	switch (region) {
-	default:
-		value = radio->region_params.rds_std;
-		break;
-	case TAVARUA_REGION_US:
-		value = RBDS_STD;
-		break;
-	case TAVARUA_REGION_EU:
-		value = RDS_STD;
-		break;
-	}
-	SET_REG_FIELD(radio->registers[RDSCTRL], value,
+	SET_REG_FIELD(radio->registers[RDSCTRL], radio->region_params.rds_std,
 		RDSCTRL_STANDARD_OFFSET, RDSCTRL_STANDARD_MASK);
 
 	FMDBG("RDSCTRLL %x\n", radio->registers[RDSCTRL]);
 	retval = tavarua_write_register(radio, RDSCTRL,
 					radio->registers[RDSCTRL]);
-	if (retval < 0)
+	if (retval < 0) {
+		FMDERR("Failed to set RDS/RBDS standard\n");
 		return retval;
+	}
 
+	/* Set the lower and upper band limits*/
+	retval = sync_read_xfr(radio, RADIO_CONFIG, xfr_buf);
+	if (retval < 0) {
+		FMDERR("failed to get RADIO_CONFIG\n");
+		return retval;
+	}
 
-	/* setting soft band */
-	switch (region) {
-	case TAVARUA_REGION_US:
-	case TAVARUA_REGION_EU:
-		radio->region_params.band_low = 87.5 * FREQ_MUL;
-		radio->region_params.band_high = 108 * FREQ_MUL;
-		break;
-	case TAVARUA_REGION_JAPAN:
-		radio->region_params.band_low = 76 * FREQ_MUL;
-		radio->region_params.band_high = 90 * FREQ_MUL;
-		break;
-	case TAVARUA_REGION_JAPAN_WIDE:
-		radio->region_params.band_low = 90 * FREQ_MUL;
-		radio->region_params.band_high = 108 * FREQ_MUL;
-		break;
-	default:
-		break;
+	band_low = (radio->region_params.band_low -
+				low_band_limit) / spacing;
+	band_high = (radio->region_params.band_high -
+				low_band_limit) / spacing;
+
+	xfr_buf[0] = RSH_DATA(band_low, 8);
+	xfr_buf[1] = GET_ABS_VAL(band_low);
+	xfr_buf[2] = RSH_DATA(band_high, 8);
+	xfr_buf[3] = GET_ABS_VAL(band_high);
+	retval = sync_write_xfr(radio, RADIO_CONFIG, xfr_buf);
+	if (retval < 0) {
+		FMDERR("Could not set regional settings\n");
+		return retval;
 	}
 	radio->region_params.region = region;
 
@@ -1555,8 +1511,7 @@
 		}
 
 		/* Set channel spacing */
-		switch (region) {
-		case TAVARUA_REGION_US:
+		if (region == TAVARUA_REGION_US) {
 			if (adie_type_bahma) {
 				FMDBG("Adie type : Bahama\n");
 				/*
@@ -1569,23 +1524,13 @@
 				FMDBG("Adie type : Marimba\n");
 				value = FM_CH_SPACE_200KHZ;
 			}
-			break;
-		case TAVARUA_REGION_JAPAN:
-			value = FM_CH_SPACE_100KHZ;
-			break;
-		case TAVARUA_REGION_EU:
-		case TAVARUA_REGION_JAPAN_WIDE:
-			value = FM_CH_SPACE_50KHZ;
-			break;
-		default:
+		} else {
 			/*
 			Set the channel spacing as configured from
 			the upper layers.
 			*/
 			value = radio->region_params.spacing;
-			break;
 		}
-
 		SET_REG_FIELD(radio->registers[RDCTRL], value,
 			RDCTRL_CHSPACE_OFFSET, RDCTRL_CHSPACE_MASK);
 
diff --git a/include/media/tavarua.h b/include/media/tavarua.h
index b7380bc..bedfc7c 100644
--- a/include/media/tavarua.h
+++ b/include/media/tavarua.h
@@ -348,6 +348,8 @@
 #define SET_REG_FIELD(reg, val, offset, mask) \
 	(reg = (reg & ~mask) | (((val) << offset) & mask))
 #define GET_REG_FIELD(reg, offset, mask) ((reg & mask) >> offset)
+#define RSH_DATA(val, offset)    ((val) >> (offset))
+#define GET_ABS_VAL(val)        ((val) & (0xFF))
 
 enum radio_state_t {
 	FM_OFF,