Re: [PATCH 1/2] mn88473: calculate the IF register values

2015-01-13 Thread Antti Palosaari

On 01/13/2015 01:23 AM, Benjamin Larsson wrote:

Add xtal as a configuration parameter so it can be used
in the IF register value calculation. If not set in the
configuration then use a default value.

Signed-off-by: Benjamin Larsson benja...@southpole.se


Reviewed-by: Antti Palosaari cr...@iki.fi

Antti


---
  drivers/media/dvb-frontends/mn88473.h|  6 ++
  drivers/staging/media/mn88473/mn88473.c  | 26 +++---
  drivers/staging/media/mn88473/mn88473_priv.h |  1 +
  3 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/drivers/media/dvb-frontends/mn88473.h 
b/drivers/media/dvb-frontends/mn88473.h
index a373ec9..c717ebed 100644
--- a/drivers/media/dvb-frontends/mn88473.h
+++ b/drivers/media/dvb-frontends/mn88473.h
@@ -33,6 +33,12 @@ struct mn88473_config {
 * DVB frontend.
 */
struct dvb_frontend **fe;
+
+   /*
+* Xtal frequency.
+* Hz
+*/
+   u32 xtal;
  };

  #endif
diff --git a/drivers/staging/media/mn88473/mn88473.c 
b/drivers/staging/media/mn88473/mn88473.c
index 1659335..b65e519 100644
--- a/drivers/staging/media/mn88473/mn88473.c
+++ b/drivers/staging/media/mn88473/mn88473.c
@@ -30,6 +30,7 @@ static int mn88473_set_frontend(struct dvb_frontend *fe)
struct dtv_frontend_properties *c = fe-dtv_property_cache;
int ret, i;
u32 if_frequency;
+   u64 tmp;
u8 delivery_system_val, if_val[3], bw_val[7];

dev_dbg(client-dev,
@@ -63,15 +64,12 @@ static int mn88473_set_frontend(struct dvb_frontend *fe)
case SYS_DVBT2:
if (c-bandwidth_hz = 600) {
/* IF 357 Hz, BW 600 Hz */
-   memcpy(if_val, \x24\x8e\x8a, 3);
memcpy(bw_val, \xe9\x55\x55\x1c\x29\x1c\x29, 7);
} else if (c-bandwidth_hz = 700) {
/* IF 457 Hz, BW 700 Hz */
-   memcpy(if_val, \x2e\xcb\xfb, 3);
memcpy(bw_val, \xc8\x00\x00\x17\x0a\x17\x0a, 7);
} else if (c-bandwidth_hz = 800) {
/* IF 457 Hz, BW 800 Hz */
-   memcpy(if_val, \x2e\xcb\xfb, 3);
memcpy(bw_val, \xaf\x00\x00\x11\xec\x11\xec, 7);
} else {
ret = -EINVAL;
@@ -80,7 +78,6 @@ static int mn88473_set_frontend(struct dvb_frontend *fe)
break;
case SYS_DVBC_ANNEX_A:
/* IF 507 Hz, BW 800 Hz */
-   memcpy(if_val, \x33\xea\xb3, 3);
memcpy(bw_val, \xaf\x00\x00\x11\xec\x11\xec, 7);
break;
default:
@@ -105,17 +102,12 @@ static int mn88473_set_frontend(struct dvb_frontend *fe)
if_frequency = 0;
}

-   switch (if_frequency) {
-   case 357:
-   case 457:
-   case 507:
-   break;
-   default:
-   dev_err(client-dev, IF frequency %d not supported\n,
-   if_frequency);
-   ret = -EINVAL;
-   goto err;
-   }
+   /* Calculate IF registers ( (124)*IF / Xtal ) */
+   tmp =  div_u64(if_frequency * (u64)(124) + (dev-xtal / 2),
+  dev-xtal);
+   if_val[0] = ((tmp  16)  0xff);
+   if_val[1] = ((tmp   8)  0xff);
+   if_val[2] = ((tmp   0)  0xff);

ret = regmap_write(dev-regmap[2], 0x05, 0x00);
ret = regmap_write(dev-regmap[2], 0xfb, 0x13);
@@ -352,6 +344,10 @@ static int mn88473_probe(struct i2c_client *client,
}

dev-i2c_wr_max = config-i2c_wr_max;
+   if (!config-xtal)
+   dev-xtal = 2500;
+   else
+   dev-xtal = config-xtal;
dev-client[0] = client;
dev-regmap[0] = regmap_init_i2c(dev-client[0], regmap_config);
if (IS_ERR(dev-regmap[0])) {
diff --git a/drivers/staging/media/mn88473/mn88473_priv.h 
b/drivers/staging/media/mn88473/mn88473_priv.h
index 78af112..ef6f013 100644
--- a/drivers/staging/media/mn88473/mn88473_priv.h
+++ b/drivers/staging/media/mn88473/mn88473_priv.h
@@ -31,6 +31,7 @@ struct mn88473_dev {
u16 i2c_wr_max;
fe_delivery_system_t delivery_system;
bool warm; /* FW running */
+   u32 xtal;
  };

  #endif



--
http://palosaari.fi/
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 1/2] mn88473: calculate the IF register values

2015-01-12 Thread Benjamin Larsson
Add xtal as a configuration parameter so it can be used
in the IF register value calculation. If not set in the
configuration then use a default value.

Signed-off-by: Benjamin Larsson benja...@southpole.se
---
 drivers/media/dvb-frontends/mn88473.h|  6 ++
 drivers/staging/media/mn88473/mn88473.c  | 26 +++---
 drivers/staging/media/mn88473/mn88473_priv.h |  1 +
 3 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/drivers/media/dvb-frontends/mn88473.h 
b/drivers/media/dvb-frontends/mn88473.h
index a373ec9..c717ebed 100644
--- a/drivers/media/dvb-frontends/mn88473.h
+++ b/drivers/media/dvb-frontends/mn88473.h
@@ -33,6 +33,12 @@ struct mn88473_config {
 * DVB frontend.
 */
struct dvb_frontend **fe;
+
+   /*
+* Xtal frequency.
+* Hz
+*/
+   u32 xtal;
 };
 
 #endif
diff --git a/drivers/staging/media/mn88473/mn88473.c 
b/drivers/staging/media/mn88473/mn88473.c
index 1659335..b65e519 100644
--- a/drivers/staging/media/mn88473/mn88473.c
+++ b/drivers/staging/media/mn88473/mn88473.c
@@ -30,6 +30,7 @@ static int mn88473_set_frontend(struct dvb_frontend *fe)
struct dtv_frontend_properties *c = fe-dtv_property_cache;
int ret, i;
u32 if_frequency;
+   u64 tmp;
u8 delivery_system_val, if_val[3], bw_val[7];
 
dev_dbg(client-dev,
@@ -63,15 +64,12 @@ static int mn88473_set_frontend(struct dvb_frontend *fe)
case SYS_DVBT2:
if (c-bandwidth_hz = 600) {
/* IF 357 Hz, BW 600 Hz */
-   memcpy(if_val, \x24\x8e\x8a, 3);
memcpy(bw_val, \xe9\x55\x55\x1c\x29\x1c\x29, 7);
} else if (c-bandwidth_hz = 700) {
/* IF 457 Hz, BW 700 Hz */
-   memcpy(if_val, \x2e\xcb\xfb, 3);
memcpy(bw_val, \xc8\x00\x00\x17\x0a\x17\x0a, 7);
} else if (c-bandwidth_hz = 800) {
/* IF 457 Hz, BW 800 Hz */
-   memcpy(if_val, \x2e\xcb\xfb, 3);
memcpy(bw_val, \xaf\x00\x00\x11\xec\x11\xec, 7);
} else {
ret = -EINVAL;
@@ -80,7 +78,6 @@ static int mn88473_set_frontend(struct dvb_frontend *fe)
break;
case SYS_DVBC_ANNEX_A:
/* IF 507 Hz, BW 800 Hz */
-   memcpy(if_val, \x33\xea\xb3, 3);
memcpy(bw_val, \xaf\x00\x00\x11\xec\x11\xec, 7);
break;
default:
@@ -105,17 +102,12 @@ static int mn88473_set_frontend(struct dvb_frontend *fe)
if_frequency = 0;
}
 
-   switch (if_frequency) {
-   case 357:
-   case 457:
-   case 507:
-   break;
-   default:
-   dev_err(client-dev, IF frequency %d not supported\n,
-   if_frequency);
-   ret = -EINVAL;
-   goto err;
-   }
+   /* Calculate IF registers ( (124)*IF / Xtal ) */
+   tmp =  div_u64(if_frequency * (u64)(124) + (dev-xtal / 2),
+  dev-xtal);
+   if_val[0] = ((tmp  16)  0xff);
+   if_val[1] = ((tmp   8)  0xff);
+   if_val[2] = ((tmp   0)  0xff);
 
ret = regmap_write(dev-regmap[2], 0x05, 0x00);
ret = regmap_write(dev-regmap[2], 0xfb, 0x13);
@@ -352,6 +344,10 @@ static int mn88473_probe(struct i2c_client *client,
}
 
dev-i2c_wr_max = config-i2c_wr_max;
+   if (!config-xtal)
+   dev-xtal = 2500;
+   else
+   dev-xtal = config-xtal;
dev-client[0] = client;
dev-regmap[0] = regmap_init_i2c(dev-client[0], regmap_config);
if (IS_ERR(dev-regmap[0])) {
diff --git a/drivers/staging/media/mn88473/mn88473_priv.h 
b/drivers/staging/media/mn88473/mn88473_priv.h
index 78af112..ef6f013 100644
--- a/drivers/staging/media/mn88473/mn88473_priv.h
+++ b/drivers/staging/media/mn88473/mn88473_priv.h
@@ -31,6 +31,7 @@ struct mn88473_dev {
u16 i2c_wr_max;
fe_delivery_system_t delivery_system;
bool warm; /* FW running */
+   u32 xtal;
 };
 
 #endif
-- 
2.1.0

--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html