Re: [PATCH v3 5/6] Add a V4L2 driver for SI476X MFD
On 11/16/2012 07:02 AM, Hans Verkuil wrote: Hi Andrey, Some more comments... On Tue October 23 2012 20:44:31 Andrey Smirnov wrote: This commit adds a driver that exposes all the radio related functionality of the Si476x series of chips via the V4L2 subsystem. Signed-off-by: Andrey Smirnov andrey.smir...@convergeddevices.net --- drivers/media/radio/Kconfig| 17 + drivers/media/radio/Makefile |1 + drivers/media/radio/radio-si476x.c | 1549 3 files changed, 1567 insertions(+) create mode 100644 drivers/media/radio/radio-si476x.c cut diff --git a/drivers/media/radio/radio-si476x.c b/drivers/media/radio/radio-si476x.c new file mode 100644 index 000..c8fa90f --- /dev/null +++ b/drivers/media/radio/radio-si476x.c @@ -0,0 +1,1549 @@ +#include linux/module.h +#include linux/delay.h +#include linux/interrupt.h +#include linux/slab.h +#include linux/atomic.h +#include linux/videodev2.h +#include linux/mutex.h +#include linux/debugfs.h +#include media/v4l2-common.h +#include media/v4l2-ioctl.h +#include media/v4l2-ctrls.h +#include media/v4l2-event.h +#include media/v4l2-device.h + + +#include linux/mfd/si476x-core.h + +#define FM_FREQ_RANGE_LOW 6400 +#define FM_FREQ_RANGE_HIGH 10800 + +#define AM_FREQ_RANGE_LOW52 +#define AM_FREQ_RANGE_HIGH 3000 + +#define PWRLINEFLTR (1 8) + +#define FREQ_MUL (1000 / 625) + +#define SI476X_PHDIV_STATUS_LINK_LOCKED(status) (0b1000 (status)) + +#define DRIVER_NAME si476x-radio +#define DRIVER_CARD SI476x AM/FM Receiver + +enum si476x_freq_bands { +SI476X_BAND_FM, +SI476X_BAND_AM, +}; + +static const struct v4l2_frequency_band si476x_bands[] = { +[SI476X_BAND_FM] = { +.type = V4L2_TUNER_RADIO, +.index = SI476X_BAND_FM, +.capability = V4L2_TUNER_CAP_LOW +| V4L2_TUNER_CAP_STEREO +| V4L2_TUNER_CAP_RDS +| V4L2_TUNER_CAP_RDS_BLOCK_IO +| V4L2_TUNER_CAP_FREQ_BANDS, +.rangelow = 64 * FREQ_MUL, +.rangehigh = 108 * FREQ_MUL, +.modulation = V4L2_BAND_MODULATION_FM, +}, +[SI476X_BAND_AM] = { +.type = V4L2_TUNER_RADIO, +.index = SI476X_BAND_AM, +.capability = V4L2_TUNER_CAP_LOW | V4L2_TUNER_CAP_FREQ_BANDS, +.rangelow = 0.52 * FREQ_MUL, +.rangehigh = 30 * FREQ_MUL, +.modulation = V4L2_BAND_MODULATION_AM, +}, +}; + +static inline bool si476x_radio_freq_is_inside_of_the_band(u32 freq, int band) +{ +return freq = si476x_bands[band].rangelow +freq = si476x_bands[band].rangehigh; +} + +static inline bool si476x_radio_range_is_inside_of_the_band(u32 low, u32 high, int band) +{ +return low = si476x_bands[band].rangelow +high = si476x_bands[band].rangehigh; +} + +#define PRIVATE_CTL_IDX(x) (x - V4L2_CID_PRIVATE_BASE) No. The new control IDs need to be added to include/uapi/linux/v4l2-controls.h with unique IDs. V4L2_CID_PRIVATE_BASE must not be used anymore for new controls. Since Halli Manjunatha hasn't worked on a new version of his patch with the new fm controls it might be something you want to take on (I'm referring to the FM RX control class). Should I move all controls there, even chip specific ones, like SI476X_CID_HARMONICS_COUNT or SI476X_CID_DIVERSITY_MODE? -- 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
Re: [PATCH v3 5/6] Add a V4L2 driver for SI476X MFD
Hi Andrey, Some more comments... On Tue October 23 2012 20:44:31 Andrey Smirnov wrote: This commit adds a driver that exposes all the radio related functionality of the Si476x series of chips via the V4L2 subsystem. Signed-off-by: Andrey Smirnov andrey.smir...@convergeddevices.net --- drivers/media/radio/Kconfig| 17 + drivers/media/radio/Makefile |1 + drivers/media/radio/radio-si476x.c | 1549 3 files changed, 1567 insertions(+) create mode 100644 drivers/media/radio/radio-si476x.c cut diff --git a/drivers/media/radio/radio-si476x.c b/drivers/media/radio/radio-si476x.c new file mode 100644 index 000..c8fa90f --- /dev/null +++ b/drivers/media/radio/radio-si476x.c @@ -0,0 +1,1549 @@ +#include linux/module.h +#include linux/delay.h +#include linux/interrupt.h +#include linux/slab.h +#include linux/atomic.h +#include linux/videodev2.h +#include linux/mutex.h +#include linux/debugfs.h +#include media/v4l2-common.h +#include media/v4l2-ioctl.h +#include media/v4l2-ctrls.h +#include media/v4l2-event.h +#include media/v4l2-device.h + + +#include linux/mfd/si476x-core.h + +#define FM_FREQ_RANGE_LOW 6400 +#define FM_FREQ_RANGE_HIGH 10800 + +#define AM_FREQ_RANGE_LOW52 +#define AM_FREQ_RANGE_HIGH 3000 + +#define PWRLINEFLTR (1 8) + +#define FREQ_MUL (1000 / 625) + +#define SI476X_PHDIV_STATUS_LINK_LOCKED(status) (0b1000 (status)) + +#define DRIVER_NAME si476x-radio +#define DRIVER_CARD SI476x AM/FM Receiver + +enum si476x_freq_bands { + SI476X_BAND_FM, + SI476X_BAND_AM, +}; + +static const struct v4l2_frequency_band si476x_bands[] = { + [SI476X_BAND_FM] = { + .type = V4L2_TUNER_RADIO, + .index = SI476X_BAND_FM, + .capability = V4L2_TUNER_CAP_LOW + | V4L2_TUNER_CAP_STEREO + | V4L2_TUNER_CAP_RDS + | V4L2_TUNER_CAP_RDS_BLOCK_IO + | V4L2_TUNER_CAP_FREQ_BANDS, + .rangelow = 64 * FREQ_MUL, + .rangehigh = 108 * FREQ_MUL, + .modulation = V4L2_BAND_MODULATION_FM, + }, + [SI476X_BAND_AM] = { + .type = V4L2_TUNER_RADIO, + .index = SI476X_BAND_AM, + .capability = V4L2_TUNER_CAP_LOW | V4L2_TUNER_CAP_FREQ_BANDS, + .rangelow = 0.52 * FREQ_MUL, + .rangehigh = 30 * FREQ_MUL, + .modulation = V4L2_BAND_MODULATION_AM, + }, +}; + +static inline bool si476x_radio_freq_is_inside_of_the_band(u32 freq, int band) +{ + return freq = si476x_bands[band].rangelow + freq = si476x_bands[band].rangehigh; +} + +static inline bool si476x_radio_range_is_inside_of_the_band(u32 low, u32 high, int band) +{ + return low = si476x_bands[band].rangelow + high = si476x_bands[band].rangehigh; +} + +#define PRIVATE_CTL_IDX(x) (x - V4L2_CID_PRIVATE_BASE) No. The new control IDs need to be added to include/uapi/linux/v4l2-controls.h with unique IDs. V4L2_CID_PRIVATE_BASE must not be used anymore for new controls. Since Halli Manjunatha hasn't worked on a new version of his patch with the new fm controls it might be something you want to take on (I'm referring to the FM RX control class). + +static int si476x_radio_s_ctrl(struct v4l2_ctrl *ctrl); +static int si476x_radio_g_volatile_ctrl(struct v4l2_ctrl *ctrl); + +static const char * const deemphasis[] = { + 75 us, + 50 us, +}; + +enum phase_diversity_modes_idx { + SI476X_IDX_PHDIV_DISABLED, + SI476X_IDX_PHDIV_PRIMARY_COMBINING, + SI476X_IDX_PHDIV_PRIMARY_ANTENNA, + SI476X_IDX_PHDIV_SECONDARY_ANTENNA, + SI476X_IDX_PHDIV_SECONDARY_COMBINING, +}; + +static const char * const phase_diversity_modes[] = { + [SI476X_IDX_PHDIV_DISABLED] = disabled, + [SI476X_IDX_PHDIV_PRIMARY_COMBINING]= primary w/secondary, + [SI476X_IDX_PHDIV_PRIMARY_ANTENNA] = primary(primary antenna), + [SI476X_IDX_PHDIV_SECONDARY_ANTENNA]= primary(seconadary antenna), + [SI476X_IDX_PHDIV_SECONDARY_COMBINING] = secondary w/primary, +}; + +static inline enum phase_diversity_modes_idx +si476x_phase_diversity_mode_to_idx(enum si476x_phase_diversity_mode mode) +{ + switch (mode) { + default:/* FALLTHROUGH */ + case SI476X_PHDIV_DISABLED: + return SI476X_IDX_PHDIV_DISABLED; + case SI476X_PHDIV_PRIMARY_COMBINING: + return SI476X_IDX_PHDIV_PRIMARY_COMBINING; + case SI476X_PHDIV_PRIMARY_ANTENNA: + return SI476X_IDX_PHDIV_PRIMARY_ANTENNA; + case SI476X_PHDIV_SECONDARY_ANTENNA: + return SI476X_IDX_PHDIV_SECONDARY_ANTENNA; + case SI476X_PHDIV_SECONDARY_COMBINING: + return SI476X_IDX_PHDIV_SECONDARY_COMBINING; + } +}
Re: [PATCH v3 5/6] Add a V4L2 driver for SI476X MFD
Hello Andrey, On Tue, Oct 23, 2012 at 10:44 PM, Andrey Smirnov andrey.smir...@convergeddevices.net wrote: This commit adds a driver that exposes all the radio related functionality of the Si476x series of chips via the V4L2 subsystem. Signed-off-by: Andrey Smirnov andrey.smir...@convergeddevices.net --- drivers/media/radio/Kconfig| 17 + drivers/media/radio/Makefile |1 + drivers/media/radio/radio-si476x.c | 1549 3 files changed, 1567 insertions(+) create mode 100644 drivers/media/radio/radio-si476x.c diff --git a/drivers/media/radio/Kconfig b/drivers/media/radio/Kconfig index 8090b87..3c79d09 100644 --- a/drivers/media/radio/Kconfig +++ b/drivers/media/radio/Kconfig @@ -16,6 +16,23 @@ config RADIO_SI470X bool Silicon Labs Si470x FM Radio Receiver support depends on VIDEO_V4L2 +config RADIO_SI476X + tristate Silicon Laboratories Si476x I2C FM Radio + depends on I2C VIDEO_V4L2 + select MFD_CORE + select MFD_SI476X_CORE + select SND_SOC_SI476X + ---help--- + Choose Y here if you have this FM radio chip. + + In order to control your radio card, you will need to use programs + that are compatible with the Video For Linux 2 API. Information on + this API and pointers to v4l2 programs may be found at + file:Documentation/video4linux/API.html. + + To compile this driver as a module, choose M here: the + module will be called radio-si476x. + source drivers/media/radio/si470x/Kconfig config USB_MR800 diff --git a/drivers/media/radio/Makefile b/drivers/media/radio/Makefile index c03ce4f..c4618e0 100644 --- a/drivers/media/radio/Makefile +++ b/drivers/media/radio/Makefile @@ -19,6 +19,7 @@ obj-$(CONFIG_RADIO_GEMTEK) += radio-gemtek.o obj-$(CONFIG_RADIO_TRUST) += radio-trust.o obj-$(CONFIG_I2C_SI4713) += si4713-i2c.o obj-$(CONFIG_RADIO_SI4713) += radio-si4713.o +obj-$(CONFIG_RADIO_SI476X) += radio-si476x.o obj-$(CONFIG_RADIO_MIROPCM20) += radio-miropcm20.o obj-$(CONFIG_USB_DSBR) += dsbr100.o obj-$(CONFIG_RADIO_SI470X) += si470x/ diff --git a/drivers/media/radio/radio-si476x.c b/drivers/media/radio/radio-si476x.c new file mode 100644 index 000..c8fa90f --- /dev/null +++ b/drivers/media/radio/radio-si476x.c @@ -0,0 +1,1549 @@ +#include linux/module.h +#include linux/delay.h +#include linux/interrupt.h +#include linux/slab.h +#include linux/atomic.h +#include linux/videodev2.h +#include linux/mutex.h +#include linux/debugfs.h +#include media/v4l2-common.h +#include media/v4l2-ioctl.h +#include media/v4l2-ctrls.h +#include media/v4l2-event.h +#include media/v4l2-device.h + + +#include linux/mfd/si476x-core.h + +#define FM_FREQ_RANGE_LOW 6400 +#define FM_FREQ_RANGE_HIGH 10800 + +#define AM_FREQ_RANGE_LOW52 +#define AM_FREQ_RANGE_HIGH 3000 + +#define PWRLINEFLTR (1 8) + +#define FREQ_MUL (1000 / 625) + +#define SI476X_PHDIV_STATUS_LINK_LOCKED(status) (0b1000 (status)) + +#define DRIVER_NAME si476x-radio +#define DRIVER_CARD SI476x AM/FM Receiver + +enum si476x_freq_bands { + SI476X_BAND_FM, + SI476X_BAND_AM, +}; + +static const struct v4l2_frequency_band si476x_bands[] = { + [SI476X_BAND_FM] = { + .type = V4L2_TUNER_RADIO, + .index = SI476X_BAND_FM, + .capability = V4L2_TUNER_CAP_LOW + | V4L2_TUNER_CAP_STEREO + | V4L2_TUNER_CAP_RDS + | V4L2_TUNER_CAP_RDS_BLOCK_IO + | V4L2_TUNER_CAP_FREQ_BANDS, + .rangelow = 64 * FREQ_MUL, + .rangehigh = 108 * FREQ_MUL, + .modulation = V4L2_BAND_MODULATION_FM, + }, + [SI476X_BAND_AM] = { + .type = V4L2_TUNER_RADIO, + .index = SI476X_BAND_AM, + .capability = V4L2_TUNER_CAP_LOW | V4L2_TUNER_CAP_FREQ_BANDS, + .rangelow = 0.52 * FREQ_MUL, + .rangehigh = 30 * FREQ_MUL, + .modulation = V4L2_BAND_MODULATION_AM, + }, +}; + +static inline bool si476x_radio_freq_is_inside_of_the_band(u32 freq, int band) +{ + return freq = si476x_bands[band].rangelow + freq = si476x_bands[band].rangehigh; +} + +static inline bool si476x_radio_range_is_inside_of_the_band(u32 low, u32 high, int band) +{ + return low = si476x_bands[band].rangelow + high = si476x_bands[band].rangehigh; +} + +#define PRIVATE_CTL_IDX(x) (x - V4L2_CID_PRIVATE_BASE) + +static int si476x_radio_s_ctrl(struct v4l2_ctrl *ctrl); +static int si476x_radio_g_volatile_ctrl(struct v4l2_ctrl *ctrl); + +static const char * const deemphasis[] = { + 75 us, + 50 us, +}; + +enum phase_diversity_modes_idx { +