aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/mach-omap2/board-rx51-peripherals.c7
-rw-r--r--drivers/media/radio/si4713/si4713.c52
-rw-r--r--drivers/media/radio/si4713/si4713.h3
-rw-r--r--include/media/si4713.h2
4 files changed, 37 insertions, 27 deletions
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c
index f093af17f5e6..8760bbe3baab 100644
--- a/arch/arm/mach-omap2/board-rx51-peripherals.c
+++ b/arch/arm/mach-omap2/board-rx51-peripherals.c
@@ -760,7 +760,14 @@ static struct regulator_init_data rx51_vintdig = {
760 }, 760 },
761}; 761};
762 762
763static const char * const si4713_supply_names[] = {
764 "vio",
765 "vdd",
766};
767
763static struct si4713_platform_data rx51_si4713_i2c_data __initdata_or_module = { 768static struct si4713_platform_data rx51_si4713_i2c_data __initdata_or_module = {
769 .supplies = ARRAY_SIZE(si4713_supply_names),
770 .supply_names = si4713_supply_names,
764 .gpio_reset = RX51_FMTX_RESET_GPIO, 771 .gpio_reset = RX51_FMTX_RESET_GPIO,
765}; 772};
766 773
diff --git a/drivers/media/radio/si4713/si4713.c b/drivers/media/radio/si4713/si4713.c
index 4931325111c2..097d4e09b491 100644
--- a/drivers/media/radio/si4713/si4713.c
+++ b/drivers/media/radio/si4713/si4713.c
@@ -44,11 +44,6 @@ MODULE_AUTHOR("Eduardo Valentin <eduardo.valentin@nokia.com>");
44MODULE_DESCRIPTION("I2C driver for Si4713 FM Radio Transmitter"); 44MODULE_DESCRIPTION("I2C driver for Si4713 FM Radio Transmitter");
45MODULE_VERSION("0.0.1"); 45MODULE_VERSION("0.0.1");
46 46
47static const char *si4713_supply_names[SI4713_NUM_SUPPLIES] = {
48 "vio",
49 "vdd",
50};
51
52#define DEFAULT_RDS_PI 0x00 47#define DEFAULT_RDS_PI 0x00
53#define DEFAULT_RDS_PTY 0x00 48#define DEFAULT_RDS_PTY 0x00
54#define DEFAULT_RDS_DEVIATION 0x00C8 49#define DEFAULT_RDS_DEVIATION 0x00C8
@@ -368,11 +363,12 @@ static int si4713_powerup(struct si4713_device *sdev)
368 if (sdev->power_state) 363 if (sdev->power_state)
369 return 0; 364 return 0;
370 365
371 err = regulator_bulk_enable(ARRAY_SIZE(sdev->supplies), 366 if (sdev->supplies) {
372 sdev->supplies); 367 err = regulator_bulk_enable(sdev->supplies, sdev->supply_data);
373 if (err) { 368 if (err) {
374 v4l2_err(&sdev->sd, "Failed to enable supplies: %d\n", err); 369 v4l2_err(&sdev->sd, "Failed to enable supplies: %d\n", err);
375 return err; 370 return err;
371 }
376 } 372 }
377 if (gpio_is_valid(sdev->gpio_reset)) { 373 if (gpio_is_valid(sdev->gpio_reset)) {
378 udelay(50); 374 udelay(50);
@@ -396,11 +392,12 @@ static int si4713_powerup(struct si4713_device *sdev)
396 if (client->irq) 392 if (client->irq)
397 err = si4713_write_property(sdev, SI4713_GPO_IEN, 393 err = si4713_write_property(sdev, SI4713_GPO_IEN,
398 SI4713_STC_INT | SI4713_CTS); 394 SI4713_STC_INT | SI4713_CTS);
399 } else { 395 return err;
400 if (gpio_is_valid(sdev->gpio_reset)) 396 }
401 gpio_set_value(sdev->gpio_reset, 0); 397 if (gpio_is_valid(sdev->gpio_reset))
402 err = regulator_bulk_disable(ARRAY_SIZE(sdev->supplies), 398 gpio_set_value(sdev->gpio_reset, 0);
403 sdev->supplies); 399 if (sdev->supplies) {
400 err = regulator_bulk_disable(sdev->supplies, sdev->supply_data);
404 if (err) 401 if (err)
405 v4l2_err(&sdev->sd, 402 v4l2_err(&sdev->sd,
406 "Failed to disable supplies: %d\n", err); 403 "Failed to disable supplies: %d\n", err);
@@ -432,11 +429,13 @@ static int si4713_powerdown(struct si4713_device *sdev)
432 v4l2_dbg(1, debug, &sdev->sd, "Device in reset mode\n"); 429 v4l2_dbg(1, debug, &sdev->sd, "Device in reset mode\n");
433 if (gpio_is_valid(sdev->gpio_reset)) 430 if (gpio_is_valid(sdev->gpio_reset))
434 gpio_set_value(sdev->gpio_reset, 0); 431 gpio_set_value(sdev->gpio_reset, 0);
435 err = regulator_bulk_disable(ARRAY_SIZE(sdev->supplies), 432 if (sdev->supplies) {
436 sdev->supplies); 433 err = regulator_bulk_disable(sdev->supplies,
437 if (err) 434 sdev->supply_data);
438 v4l2_err(&sdev->sd, 435 if (err)
439 "Failed to disable supplies: %d\n", err); 436 v4l2_err(&sdev->sd,
437 "Failed to disable supplies: %d\n", err);
438 }
440 sdev->power_state = POWER_OFF; 439 sdev->power_state = POWER_OFF;
441 } 440 }
442 441
@@ -1381,13 +1380,14 @@ static int si4713_probe(struct i2c_client *client,
1381 } 1380 }
1382 sdev->gpio_reset = pdata->gpio_reset; 1381 sdev->gpio_reset = pdata->gpio_reset;
1383 gpio_direction_output(sdev->gpio_reset, 0); 1382 gpio_direction_output(sdev->gpio_reset, 0);
1383 sdev->supplies = pdata->supplies;
1384 } 1384 }
1385 1385
1386 for (i = 0; i < ARRAY_SIZE(sdev->supplies); i++) 1386 for (i = 0; i < sdev->supplies; i++)
1387 sdev->supplies[i].supply = si4713_supply_names[i]; 1387 sdev->supply_data[i].supply = pdata->supply_names[i];
1388 1388
1389 rval = regulator_bulk_get(&client->dev, ARRAY_SIZE(sdev->supplies), 1389 rval = regulator_bulk_get(&client->dev, sdev->supplies,
1390 sdev->supplies); 1390 sdev->supply_data);
1391 if (rval) { 1391 if (rval) {
1392 dev_err(&client->dev, "Cannot get regulators: %d\n", rval); 1392 dev_err(&client->dev, "Cannot get regulators: %d\n", rval);
1393 goto free_gpio; 1393 goto free_gpio;
@@ -1500,7 +1500,7 @@ free_irq:
1500free_ctrls: 1500free_ctrls:
1501 v4l2_ctrl_handler_free(hdl); 1501 v4l2_ctrl_handler_free(hdl);
1502put_reg: 1502put_reg:
1503 regulator_bulk_free(ARRAY_SIZE(sdev->supplies), sdev->supplies); 1503 regulator_bulk_free(sdev->supplies, sdev->supply_data);
1504free_gpio: 1504free_gpio:
1505 if (gpio_is_valid(sdev->gpio_reset)) 1505 if (gpio_is_valid(sdev->gpio_reset))
1506 gpio_free(sdev->gpio_reset); 1506 gpio_free(sdev->gpio_reset);
@@ -1524,7 +1524,7 @@ static int si4713_remove(struct i2c_client *client)
1524 1524
1525 v4l2_device_unregister_subdev(sd); 1525 v4l2_device_unregister_subdev(sd);
1526 v4l2_ctrl_handler_free(sd->ctrl_handler); 1526 v4l2_ctrl_handler_free(sd->ctrl_handler);
1527 regulator_bulk_free(ARRAY_SIZE(sdev->supplies), sdev->supplies); 1527 regulator_bulk_free(sdev->supplies, sdev->supply_data);
1528 if (gpio_is_valid(sdev->gpio_reset)) 1528 if (gpio_is_valid(sdev->gpio_reset))
1529 gpio_free(sdev->gpio_reset); 1529 gpio_free(sdev->gpio_reset);
1530 kfree(sdev); 1530 kfree(sdev);
diff --git a/drivers/media/radio/si4713/si4713.h b/drivers/media/radio/si4713/si4713.h
index 1410cd23105a..4837cf6e0e1b 100644
--- a/drivers/media/radio/si4713/si4713.h
+++ b/drivers/media/radio/si4713/si4713.h
@@ -227,7 +227,8 @@ struct si4713_device {
227 struct v4l2_ctrl *tune_ant_cap; 227 struct v4l2_ctrl *tune_ant_cap;
228 }; 228 };
229 struct completion work; 229 struct completion work;
230 struct regulator_bulk_data supplies[SI4713_NUM_SUPPLIES]; 230 unsigned supplies;
231 struct regulator_bulk_data supply_data[SI4713_NUM_SUPPLIES];
231 int gpio_reset; 232 int gpio_reset;
232 u32 power_state; 233 u32 power_state;
233 u32 rds_enabled; 234 u32 rds_enabled;
diff --git a/include/media/si4713.h b/include/media/si4713.h
index ed7353e8a982..f98a0a7af61c 100644
--- a/include/media/si4713.h
+++ b/include/media/si4713.h
@@ -23,6 +23,8 @@
23 * Platform dependent definition 23 * Platform dependent definition
24 */ 24 */
25struct si4713_platform_data { 25struct si4713_platform_data {
26 const char * const *supply_names;
27 unsigned supplies;
26 int gpio_reset; /* < 0 if not used */ 28 int gpio_reset; /* < 0 if not used */
27}; 29};
28 30