Re: [PATCH v3 5/6] Add a V4L2 driver for SI476X MFD

2012-11-23 Thread Andrey Smirnov
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

2012-11-16 Thread Hans Verkuil
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

2012-11-16 Thread Alexey Klimov
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 {
 +