Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] radio-si4713: Add regulator framework support

Convert the driver to use regulator framework instead of set_power callback.
This with gpio_reset platform data provide cleaner way to manage chip VIO,
VDD and reset signal inside the driver.

Signed-off-by: Jarkko Nikula <jhnikula@gmail.com>
Cc: Eduardo Valentin <eduardo.valentin@nokia.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

authored by

Jarkko Nikula and committed by
Mauro Carvalho Chehab
00df055a bf797165

+68 -14
+63 -11
drivers/media/radio/si4713-i2c.c
··· 27 27 #include <linux/interrupt.h> 28 28 #include <linux/i2c.h> 29 29 #include <linux/slab.h> 30 + #include <linux/gpio.h> 31 + #include <linux/regulator/consumer.h> 30 32 #include <media/v4l2-device.h> 31 33 #include <media/v4l2-ioctl.h> 32 34 #include <media/v4l2-common.h> ··· 44 42 MODULE_AUTHOR("Eduardo Valentin <eduardo.valentin@nokia.com>"); 45 43 MODULE_DESCRIPTION("I2C driver for Si4713 FM Radio Transmitter"); 46 44 MODULE_VERSION("0.0.1"); 45 + 46 + static const char *si4713_supply_names[SI4713_NUM_SUPPLIES] = { 47 + "vio", 48 + "vdd", 49 + }; 47 50 48 51 #define DEFAULT_RDS_PI 0x00 49 52 #define DEFAULT_RDS_PTY 0x00 ··· 376 369 if (sdev->power_state) 377 370 return 0; 378 371 379 - sdev->platform_data->set_power(1); 372 + err = regulator_bulk_enable(ARRAY_SIZE(sdev->supplies), 373 + sdev->supplies); 374 + if (err) { 375 + v4l2_err(&sdev->sd, "Failed to enable supplies: %d\n", err); 376 + return err; 377 + } 378 + if (gpio_is_valid(sdev->gpio_reset)) { 379 + udelay(50); 380 + gpio_set_value(sdev->gpio_reset, 1); 381 + } 382 + 380 383 err = si4713_send_command(sdev, SI4713_CMD_POWER_UP, 381 384 args, ARRAY_SIZE(args), 382 385 resp, ARRAY_SIZE(resp), ··· 401 384 err = si4713_write_property(sdev, SI4713_GPO_IEN, 402 385 SI4713_STC_INT | SI4713_CTS); 403 386 } else { 404 - sdev->platform_data->set_power(0); 387 + if (gpio_is_valid(sdev->gpio_reset)) 388 + gpio_set_value(sdev->gpio_reset, 0); 389 + err = regulator_bulk_disable(ARRAY_SIZE(sdev->supplies), 390 + sdev->supplies); 391 + if (err) 392 + v4l2_err(&sdev->sd, 393 + "Failed to disable supplies: %d\n", err); 405 394 } 406 395 407 396 return err; ··· 434 411 v4l2_dbg(1, debug, &sdev->sd, "Power down response: 0x%02x\n", 435 412 resp[0]); 436 413 v4l2_dbg(1, debug, &sdev->sd, "Device in reset mode\n"); 437 - sdev->platform_data->set_power(0); 414 + if (gpio_is_valid(sdev->gpio_reset)) 415 + gpio_set_value(sdev->gpio_reset, 0); 416 + err = regulator_bulk_disable(ARRAY_SIZE(sdev->supplies), 417 + sdev->supplies); 418 + if (err) 419 + v4l2_err(&sdev->sd, 420 + "Failed to disable supplies: %d\n", err); 438 421 sdev->power_state = POWER_OFF; 439 422 } 440 423 ··· 1996 1967 const struct i2c_device_id *id) 1997 1968 { 1998 1969 struct si4713_device *sdev; 1999 - int rval; 1970 + struct si4713_platform_data *pdata = client->dev.platform_data; 1971 + int rval, i; 2000 1972 2001 1973 sdev = kzalloc(sizeof *sdev, GFP_KERNEL); 2002 1974 if (!sdev) { ··· 2006 1976 goto exit; 2007 1977 } 2008 1978 2009 - sdev->platform_data = client->dev.platform_data; 2010 - if (!sdev->platform_data) { 2011 - v4l2_err(&sdev->sd, "No platform data registered.\n"); 2012 - rval = -ENODEV; 2013 - goto free_sdev; 1979 + sdev->gpio_reset = -1; 1980 + if (pdata && gpio_is_valid(pdata->gpio_reset)) { 1981 + rval = gpio_request(pdata->gpio_reset, "si4713 reset"); 1982 + if (rval) { 1983 + dev_err(&client->dev, 1984 + "Failed to request gpio: %d\n", rval); 1985 + goto free_sdev; 1986 + } 1987 + sdev->gpio_reset = pdata->gpio_reset; 1988 + gpio_direction_output(sdev->gpio_reset, 0); 1989 + } 1990 + 1991 + for (i = 0; i < ARRAY_SIZE(sdev->supplies); i++) 1992 + sdev->supplies[i].supply = si4713_supply_names[i]; 1993 + 1994 + rval = regulator_bulk_get(&client->dev, ARRAY_SIZE(sdev->supplies), 1995 + sdev->supplies); 1996 + if (rval) { 1997 + dev_err(&client->dev, "Cannot get regulators: %d\n", rval); 1998 + goto free_gpio; 2014 1999 } 2015 2000 2016 2001 v4l2_i2c_subdev_init(&sdev->sd, client, &si4713_subdev_ops); ··· 2039 1994 client->name, sdev); 2040 1995 if (rval < 0) { 2041 1996 v4l2_err(&sdev->sd, "Could not request IRQ\n"); 2042 - goto free_sdev; 1997 + goto put_reg; 2043 1998 } 2044 1999 v4l2_dbg(1, debug, &sdev->sd, "IRQ requested.\n"); 2045 2000 } else { ··· 2057 2012 free_irq: 2058 2013 if (client->irq) 2059 2014 free_irq(client->irq, sdev); 2015 + put_reg: 2016 + regulator_bulk_free(ARRAY_SIZE(sdev->supplies), sdev->supplies); 2017 + free_gpio: 2018 + if (gpio_is_valid(sdev->gpio_reset)) 2019 + gpio_free(sdev->gpio_reset); 2060 2020 free_sdev: 2061 2021 kfree(sdev); 2062 2022 exit: ··· 2081 2031 free_irq(client->irq, sdev); 2082 2032 2083 2033 v4l2_device_unregister_subdev(sd); 2084 - 2034 + regulator_bulk_free(ARRAY_SIZE(sdev->supplies), sdev->supplies); 2035 + if (gpio_is_valid(sdev->gpio_reset)) 2036 + gpio_free(sdev->gpio_reset); 2085 2037 kfree(sdev); 2086 2038 2087 2039 return 0;
+4 -1
drivers/media/radio/si4713-i2c.h
··· 211 211 u32 enabled; 212 212 }; 213 213 214 + #define SI4713_NUM_SUPPLIES 2 215 + 214 216 /* 215 217 * si4713_device - private data 216 218 */ ··· 222 220 /* private data structures */ 223 221 struct mutex mutex; 224 222 struct completion work; 225 - struct si4713_platform_data *platform_data; 226 223 struct rds_info rds_info; 227 224 struct limiter_info limiter_info; 228 225 struct pilot_info pilot_info; 229 226 struct acomp_info acomp_info; 227 + struct regulator_bulk_data supplies[SI4713_NUM_SUPPLIES]; 228 + int gpio_reset; 230 229 u32 frequency; 231 230 u32 preemphasis; 232 231 u32 mute;
+1 -2
include/media/si4713.h
··· 23 23 * Platform dependent definition 24 24 */ 25 25 struct si4713_platform_data { 26 - /* Set power state, zero is off, non-zero is on. */ 27 - int (*set_power)(int power); 26 + int gpio_reset; /* < 0 if not used */ 28 27 }; 29 28 30 29 /*