2 * drivers/mfd/si476x-i2c.c -- Core device driver for si476x MFD
5 * Copyright (C) 2012 Innovative Converged Devices(ICD)
6 * Copyright (C) 2013 Andrey Smirnov
8 * Author: Andrey Smirnov <andrew.smirnov@gmail.com>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; version 2 of the License.
14 * This program is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
20 #include <linux/module.h>
22 #include <linux/slab.h>
23 #include <linux/interrupt.h>
24 #include <linux/delay.h>
25 #include <linux/gpio.h>
26 #include <linux/regulator/consumer.h>
27 #include <linux/i2c.h>
28 #include <linux/err.h>
30 #include <linux/mfd/si476x-core.h>
32 #define SI476X_MAX_IO_ERRORS 10
33 #define SI476X_DRIVER_RDS_FIFO_DEPTH 128
36 * si476x_core_config_pinmux() - pin function configuration function
38 * @core: Core device structure
40 * Configure the functions of the pins of the radio chip.
42 * The function returns zero in case of succes or negative error code
45 static int si476x_core_config_pinmux(struct si476x_core
*core
)
48 dev_dbg(&core
->client
->dev
, "Configuring pinmux\n");
49 err
= si476x_core_cmd_dig_audio_pin_cfg(core
,
55 dev_err(&core
->client
->dev
,
56 "Failed to configure digital audio pins(err = %d)\n",
61 err
= si476x_core_cmd_zif_pin_cfg(core
,
67 dev_err(&core
->client
->dev
,
68 "Failed to configure ZIF pins(err = %d)\n",
73 err
= si476x_core_cmd_ic_link_gpo_ctl_pin_cfg(core
,
79 dev_err(&core
->client
->dev
,
80 "Failed to configure IC-Link/GPO pins(err = %d)\n",
85 err
= si476x_core_cmd_ana_audio_pin_cfg(core
,
88 dev_err(&core
->client
->dev
,
89 "Failed to configure analog audio pins(err = %d)\n",
94 err
= si476x_core_cmd_intb_pin_cfg(core
,
98 dev_err(&core
->client
->dev
,
99 "Failed to configure interrupt pins(err = %d)\n",
107 static inline void si476x_core_schedule_polling_work(struct si476x_core
*core
)
109 schedule_delayed_work(&core
->status_monitor
,
110 usecs_to_jiffies(SI476X_STATUS_POLL_US
));
114 * si476x_core_start() - early chip startup function
115 * @core: Core device structure
116 * @soft: When set, this flag forces "soft" startup, where "soft"
117 * power down is the one done by sending appropriate command instead
118 * of using reset pin of the tuner
120 * Perform required startup sequence to correctly power
121 * up the chip and perform initial configuration. It does the
122 * following sequence of actions:
123 * 1. Claims and enables the power supplies VD and VIO1 required
124 * for I2C interface of the chip operation.
125 * 2. Waits for 100us, pulls the reset line up, enables irq,
126 * waits for another 100us as it is specified by the
128 * 3. Sends 'POWER_UP' command to the device with all provided
129 * information about power-up parameters.
130 * 4. Configures, pin multiplexor, disables digital audio and
131 * configures interrupt sources.
133 * The function returns zero in case of succes or negative error code
136 int si476x_core_start(struct si476x_core
*core
, bool soft
)
138 struct i2c_client
*client
= core
->client
;
142 if (gpio_is_valid(core
->gpio_reset
))
143 gpio_set_value_cansleep(core
->gpio_reset
, 1);
146 enable_irq(client
->irq
);
151 atomic_set(&core
->is_alive
, 1);
152 si476x_core_schedule_polling_work(core
);
156 enable_irq(client
->irq
);
158 atomic_set(&core
->is_alive
, 1);
159 si476x_core_schedule_polling_work(core
);
163 err
= si476x_core_cmd_power_up(core
,
164 &core
->power_up_parameters
);
167 dev_err(&core
->client
->dev
,
168 "Power up failure(err = %d)\n",
174 atomic_set(&core
->is_alive
, 1);
176 err
= si476x_core_config_pinmux(core
);
178 dev_err(&core
->client
->dev
,
179 "Failed to configure pinmux(err = %d)\n",
185 err
= regmap_write(core
->regmap
,
186 SI476X_PROP_INT_CTL_ENABLE
,
191 dev_err(&core
->client
->dev
,
192 "Failed to configure interrupt sources"
193 "(err = %d)\n", err
);
202 atomic_set(&core
->is_alive
, 0);
205 disable_irq(client
->irq
);
207 cancel_delayed_work_sync(&core
->status_monitor
);
209 if (gpio_is_valid(core
->gpio_reset
))
210 gpio_set_value_cansleep(core
->gpio_reset
, 0);
214 EXPORT_SYMBOL_GPL(si476x_core_start
);
217 * si476x_core_stop() - chip power-down function
218 * @core: Core device structure
219 * @soft: When set, function sends a POWER_DOWN command instead of
220 * bringing reset line low
222 * Power down the chip by performing following actions:
223 * 1. Disable IRQ or stop the polling worker
224 * 2. Send the POWER_DOWN command if the power down is soft or bring
225 * reset line low if not.
227 * The function returns zero in case of succes or negative error code
230 int si476x_core_stop(struct si476x_core
*core
, bool soft
)
233 atomic_set(&core
->is_alive
, 0);
236 /* TODO: This probably shoud be a configurable option,
237 * so it is possible to have the chips keep their
238 * oscillators running
240 struct si476x_power_down_args args
= {
243 err
= si476x_core_cmd_power_down(core
, &args
);
246 /* We couldn't disable those before
247 * 'si476x_core_cmd_power_down' since we expect to get CTS
249 if (core
->client
->irq
)
250 disable_irq(core
->client
->irq
);
252 cancel_delayed_work_sync(&core
->status_monitor
);
255 if (gpio_is_valid(core
->gpio_reset
))
256 gpio_set_value_cansleep(core
->gpio_reset
, 0);
260 EXPORT_SYMBOL_GPL(si476x_core_stop
);
263 * si476x_core_set_power_state() - set the level at which the power is
264 * supplied for the chip.
265 * @core: Core device structure
266 * @next_state: enum si476x_power_state describing power state to
269 * Switch on all the required power supplies
271 * This function returns 0 in case of suvccess and negative error code
274 int si476x_core_set_power_state(struct si476x_core
*core
,
275 enum si476x_power_state next_state
)
278 It is not clear form the datasheet if it is possible to
279 work with device if not all power domains are operational.
280 So for now the power-up policy is "power-up all the things!"
284 if (core
->power_state
== SI476X_POWER_INCONSISTENT
) {
285 dev_err(&core
->client
->dev
,
286 "The device in inconsistent power state\n");
290 if (next_state
!= core
->power_state
) {
291 switch (next_state
) {
292 case SI476X_POWER_UP_FULL
:
293 err
= regulator_bulk_enable(ARRAY_SIZE(core
->supplies
),
296 core
->power_state
= SI476X_POWER_INCONSISTENT
;
300 * Startup timing diagram recommends to have a
301 * 100 us delay between enabling of the power
302 * supplies and turning the tuner on.
306 err
= si476x_core_start(core
, false);
308 goto disable_regulators
;
310 core
->power_state
= next_state
;
313 case SI476X_POWER_DOWN
:
314 core
->power_state
= next_state
;
315 err
= si476x_core_stop(core
, false);
317 core
->power_state
= SI476X_POWER_INCONSISTENT
;
319 err
= regulator_bulk_disable(ARRAY_SIZE(core
->supplies
),
322 core
->power_state
= SI476X_POWER_INCONSISTENT
;
331 EXPORT_SYMBOL_GPL(si476x_core_set_power_state
);
334 * si476x_core_report_drainer_stop() - mark the completion of the RDS
335 * buffer drain porcess by the worker.
337 * @core: Core device structure
339 static inline void si476x_core_report_drainer_stop(struct si476x_core
*core
)
341 mutex_lock(&core
->rds_drainer_status_lock
);
342 core
->rds_drainer_is_working
= false;
343 mutex_unlock(&core
->rds_drainer_status_lock
);
347 * si476x_core_start_rds_drainer_once() - start RDS drainer worker if
348 * ther is none working, do nothing otherwise
350 * @core: Datastructure corresponding to the chip.
352 static inline void si476x_core_start_rds_drainer_once(struct si476x_core
*core
)
354 mutex_lock(&core
->rds_drainer_status_lock
);
355 if (!core
->rds_drainer_is_working
) {
356 core
->rds_drainer_is_working
= true;
357 schedule_work(&core
->rds_fifo_drainer
);
359 mutex_unlock(&core
->rds_drainer_status_lock
);
362 * si476x_drain_rds_fifo() - RDS buffer drainer.
363 * @work: struct work_struct being ppassed to the function by the
366 * Drain the contents of the RDS FIFO of
368 static void si476x_core_drain_rds_fifo(struct work_struct
*work
)
372 struct si476x_core
*core
= container_of(work
, struct si476x_core
,
375 struct si476x_rds_status_report report
;
377 si476x_core_lock(core
);
378 err
= si476x_core_cmd_fm_rds_status(core
, true, false, false, &report
);
380 int i
= report
.rdsfifoused
;
381 dev_dbg(&core
->client
->dev
,
382 "%d elements in RDS FIFO. Draining.\n", i
);
384 err
= si476x_core_cmd_fm_rds_status(core
, false, false,
389 kfifo_in(&core
->rds_fifo
, report
.rds
,
391 dev_dbg(&core
->client
->dev
, "RDS data:\n %*ph\n",
392 (int)sizeof(report
.rds
), report
.rds
);
394 dev_dbg(&core
->client
->dev
, "Drrrrained!\n");
395 wake_up_interruptible(&core
->rds_read_queue
);
399 si476x_core_unlock(core
);
400 si476x_core_report_drainer_stop(core
);
404 * si476x_core_pronounce_dead()
406 * @core: Core device structure
408 * Mark the device as being dead and wake up all potentially waiting
409 * threads of execution.
412 static void si476x_core_pronounce_dead(struct si476x_core
*core
)
414 dev_info(&core
->client
->dev
, "Core device is dead.\n");
416 atomic_set(&core
->is_alive
, 0);
418 /* Wake up al possible waiting processes */
419 wake_up_interruptible(&core
->rds_read_queue
);
421 atomic_set(&core
->cts
, 1);
422 wake_up(&core
->command
);
424 atomic_set(&core
->stc
, 1);
425 wake_up(&core
->tuning
);
429 * si476x_core_i2c_xfer()
431 * @core: Core device structure
432 * @type: Transfer type
433 * @buf: Transfer buffer for/with data
434 * @count: Transfer buffer size
436 * Perfrom and I2C transfer(either read or write) and keep a counter
437 * of I/O errors. If the error counter rises above the threshold
438 * pronounce device dead.
440 * The function returns zero on succes or negative error code on
443 int si476x_core_i2c_xfer(struct si476x_core
*core
,
444 enum si476x_i2c_type type
,
445 char *buf
, int count
)
447 static int io_errors_count
;
449 if (type
== SI476X_I2C_SEND
)
450 err
= i2c_master_send(core
->client
, buf
, count
);
452 err
= i2c_master_recv(core
->client
, buf
, count
);
455 if (io_errors_count
++ > SI476X_MAX_IO_ERRORS
)
456 si476x_core_pronounce_dead(core
);
463 EXPORT_SYMBOL_GPL(si476x_core_i2c_xfer
);
466 * si476x_get_status()
467 * @core: Core device structure
469 * Get the status byte of the core device by berforming one byte I2C
472 * The function returns a status value or a negative error code on
475 static int si476x_core_get_status(struct si476x_core
*core
)
478 int err
= si476x_core_i2c_xfer(core
, SI476X_I2C_RECV
,
479 &response
, sizeof(response
));
481 return (err
< 0) ? err
: response
;
485 * si476x_get_and_signal_status() - IRQ dispatcher
486 * @core: Core device structure
488 * Dispatch the arrived interrupt request based on the value of the
489 * status byte reported by the tuner.
492 static void si476x_core_get_and_signal_status(struct si476x_core
*core
)
494 int status
= si476x_core_get_status(core
);
496 dev_err(&core
->client
->dev
, "Failed to get status\n");
500 if (status
& SI476X_CTS
) {
501 /* Unfortunately completions could not be used for
502 * signalling CTS since this flag cannot be cleared
503 * in status byte, and therefore once it becomes true
504 * multiple calls to 'complete' would cause the
505 * commands following the current one to be completed
506 * before they actually are */
507 dev_dbg(&core
->client
->dev
, "[interrupt] CTSINT\n");
508 atomic_set(&core
->cts
, 1);
509 wake_up(&core
->command
);
512 if (status
& SI476X_FM_RDS_INT
) {
513 dev_dbg(&core
->client
->dev
, "[interrupt] RDSINT\n");
514 si476x_core_start_rds_drainer_once(core
);
517 if (status
& SI476X_STC_INT
) {
518 dev_dbg(&core
->client
->dev
, "[interrupt] STCINT\n");
519 atomic_set(&core
->stc
, 1);
520 wake_up(&core
->tuning
);
524 static void si476x_core_poll_loop(struct work_struct
*work
)
526 struct si476x_core
*core
= SI476X_WORK_TO_CORE(work
);
528 si476x_core_get_and_signal_status(core
);
530 if (atomic_read(&core
->is_alive
))
531 si476x_core_schedule_polling_work(core
);
534 static irqreturn_t
si476x_core_interrupt(int irq
, void *dev
)
536 struct si476x_core
*core
= dev
;
538 si476x_core_get_and_signal_status(core
);
544 * si476x_firmware_version_to_revision()
545 * @core: Core device structure
546 * @major: Firmware major number
547 * @minor1: Firmware first minor number
548 * @minor2: Firmware second minor number
550 * Convert a chip's firmware version number into an offset that later
551 * will be used to as offset in "vtable" of tuner functions
553 * This function returns a positive offset in case of success and a -1
554 * in case of failure.
556 static int si476x_core_fwver_to_revision(struct si476x_core
*core
,
558 int minor1
, int minor2
)
561 case SI476X_FUNC_FM_RECEIVER
:
564 return SI476X_REVISION_A10
;
566 return SI476X_REVISION_A20
;
568 return SI476X_REVISION_A30
;
570 goto unknown_revision
;
572 case SI476X_FUNC_AM_RECEIVER
:
575 return SI476X_REVISION_A10
;
577 return SI476X_REVISION_A20
;
579 return SI476X_REVISION_A30
;
581 goto unknown_revision
;
583 case SI476X_FUNC_WB_RECEIVER
:
586 return SI476X_REVISION_A10
;
588 return SI476X_REVISION_A20
;
590 return SI476X_REVISION_A30
;
592 goto unknown_revision
;
594 case SI476X_FUNC_BOOTLOADER
:
595 default: /* FALLTHROUG */
601 dev_err(&core
->client
->dev
,
602 "Unsupported version of the firmware: %d.%d.%d, "
603 "reverting to A10 comptible functions\n",
604 major
, minor1
, minor2
);
606 return SI476X_REVISION_A10
;
610 * si476x_get_revision_info()
611 * @core: Core device structure
613 * Get the firmware version number of the device. It is done in
614 * following three steps:
615 * 1. Power-up the device
616 * 2. Send the 'FUNC_INFO' command
617 * 3. Powering the device down.
619 * The function return zero on success and a negative error code on
622 static int si476x_core_get_revision_info(struct si476x_core
*core
)
625 struct si476x_func_info info
;
627 si476x_core_lock(core
);
628 rval
= si476x_core_set_power_state(core
, SI476X_POWER_UP_FULL
);
632 rval
= si476x_core_cmd_func_info(core
, &info
);
636 core
->revision
= si476x_core_fwver_to_revision(core
, info
.func
,
638 info
.firmware
.minor
[0],
639 info
.firmware
.minor
[1]);
641 si476x_core_set_power_state(core
, SI476X_POWER_DOWN
);
643 si476x_core_unlock(core
);
648 bool si476x_core_has_am(struct si476x_core
*core
)
650 return core
->chip_id
== SI476X_CHIP_SI4761
||
651 core
->chip_id
== SI476X_CHIP_SI4764
;
653 EXPORT_SYMBOL_GPL(si476x_core_has_am
);
655 bool si476x_core_has_diversity(struct si476x_core
*core
)
657 return core
->chip_id
== SI476X_CHIP_SI4764
;
659 EXPORT_SYMBOL_GPL(si476x_core_has_diversity
);
661 bool si476x_core_is_a_secondary_tuner(struct si476x_core
*core
)
663 return si476x_core_has_diversity(core
) &&
664 (core
->diversity_mode
== SI476X_PHDIV_SECONDARY_ANTENNA
||
665 core
->diversity_mode
== SI476X_PHDIV_SECONDARY_COMBINING
);
667 EXPORT_SYMBOL_GPL(si476x_core_is_a_secondary_tuner
);
669 bool si476x_core_is_a_primary_tuner(struct si476x_core
*core
)
671 return si476x_core_has_diversity(core
) &&
672 (core
->diversity_mode
== SI476X_PHDIV_PRIMARY_ANTENNA
||
673 core
->diversity_mode
== SI476X_PHDIV_PRIMARY_COMBINING
);
675 EXPORT_SYMBOL_GPL(si476x_core_is_a_primary_tuner
);
677 bool si476x_core_is_in_am_receiver_mode(struct si476x_core
*core
)
679 return si476x_core_has_am(core
) &&
680 (core
->power_up_parameters
.func
== SI476X_FUNC_AM_RECEIVER
);
682 EXPORT_SYMBOL_GPL(si476x_core_is_in_am_receiver_mode
);
684 bool si476x_core_is_powered_up(struct si476x_core
*core
)
686 return core
->power_state
== SI476X_POWER_UP_FULL
;
688 EXPORT_SYMBOL_GPL(si476x_core_is_powered_up
);
690 static int si476x_core_probe(struct i2c_client
*client
,
691 const struct i2c_device_id
*id
)
694 struct si476x_core
*core
;
695 struct si476x_platform_data
*pdata
;
696 struct mfd_cell
*cell
;
699 core
= devm_kzalloc(&client
->dev
, sizeof(*core
), GFP_KERNEL
);
701 dev_err(&client
->dev
,
702 "failed to allocate 'struct si476x_core'\n");
705 core
->client
= client
;
707 core
->regmap
= devm_regmap_init_si476x(core
);
708 if (IS_ERR(core
->regmap
)) {
709 rval
= PTR_ERR(core
->regmap
);
710 dev_err(&client
->dev
,
711 "Failed to allocate register map: %d\n",
716 i2c_set_clientdata(client
, core
);
718 atomic_set(&core
->is_alive
, 0);
719 core
->power_state
= SI476X_POWER_DOWN
;
721 pdata
= dev_get_platdata(&client
->dev
);
723 memcpy(&core
->power_up_parameters
,
724 &pdata
->power_up_parameters
,
725 sizeof(core
->power_up_parameters
));
727 core
->gpio_reset
= -1;
728 if (gpio_is_valid(pdata
->gpio_reset
)) {
729 rval
= gpio_request(pdata
->gpio_reset
, "si476x reset");
731 dev_err(&client
->dev
,
732 "Failed to request gpio: %d\n", rval
);
735 core
->gpio_reset
= pdata
->gpio_reset
;
736 gpio_direction_output(core
->gpio_reset
, 0);
739 core
->diversity_mode
= pdata
->diversity_mode
;
740 memcpy(&core
->pinmux
, &pdata
->pinmux
,
741 sizeof(struct si476x_pinmux
));
743 dev_err(&client
->dev
, "No platform data provided\n");
747 core
->supplies
[0].supply
= "vd";
748 core
->supplies
[1].supply
= "va";
749 core
->supplies
[2].supply
= "vio1";
750 core
->supplies
[3].supply
= "vio2";
752 rval
= devm_regulator_bulk_get(&client
->dev
,
753 ARRAY_SIZE(core
->supplies
),
756 dev_err(&client
->dev
, "Failet to gett all of the regulators\n");
760 mutex_init(&core
->cmd_lock
);
761 init_waitqueue_head(&core
->command
);
762 init_waitqueue_head(&core
->tuning
);
764 rval
= kfifo_alloc(&core
->rds_fifo
,
765 SI476X_DRIVER_RDS_FIFO_DEPTH
*
766 sizeof(struct v4l2_rds_data
),
769 dev_err(&client
->dev
, "Could not alloate the FIFO\n");
772 mutex_init(&core
->rds_drainer_status_lock
);
773 init_waitqueue_head(&core
->rds_read_queue
);
774 INIT_WORK(&core
->rds_fifo_drainer
, si476x_core_drain_rds_fifo
);
777 rval
= devm_request_threaded_irq(&client
->dev
,
779 si476x_core_interrupt
,
780 IRQF_TRIGGER_FALLING
,
783 dev_err(&client
->dev
, "Could not request IRQ %d\n",
787 disable_irq(client
->irq
);
788 dev_dbg(&client
->dev
, "IRQ requested.\n");
790 core
->rds_fifo_depth
= 20;
792 INIT_DELAYED_WORK(&core
->status_monitor
,
793 si476x_core_poll_loop
);
794 dev_info(&client
->dev
,
795 "No IRQ number specified, will use polling\n");
797 core
->rds_fifo_depth
= 5;
800 core
->chip_id
= id
->driver_data
;
802 rval
= si476x_core_get_revision_info(core
);
810 cell
= &core
->cells
[SI476X_RADIO_CELL
];
811 cell
->name
= "si476x-radio";
814 #ifdef CONFIG_SND_SOC_SI476X
815 if ((core
->chip_id
== SI476X_CHIP_SI4761
||
816 core
->chip_id
== SI476X_CHIP_SI4764
) &&
817 core
->pinmux
.dclk
== SI476X_DCLK_DAUDIO
&&
818 core
->pinmux
.dfs
== SI476X_DFS_DAUDIO
&&
819 core
->pinmux
.dout
== SI476X_DOUT_I2S_OUTPUT
&&
820 core
->pinmux
.xout
== SI476X_XOUT_TRISTATE
) {
821 cell
= &core
->cells
[SI476X_CODEC_CELL
];
822 cell
->name
= "si476x-codec";
826 rval
= mfd_add_devices(&client
->dev
,
827 (client
->adapter
->nr
<< 8) + client
->addr
,
828 core
->cells
, cell_num
,
834 kfifo_free(&core
->rds_fifo
);
837 if (gpio_is_valid(core
->gpio_reset
))
838 gpio_free(core
->gpio_reset
);
843 static int si476x_core_remove(struct i2c_client
*client
)
845 struct si476x_core
*core
= i2c_get_clientdata(client
);
847 si476x_core_pronounce_dead(core
);
848 mfd_remove_devices(&client
->dev
);
851 disable_irq(client
->irq
);
853 cancel_delayed_work_sync(&core
->status_monitor
);
855 kfifo_free(&core
->rds_fifo
);
857 if (gpio_is_valid(core
->gpio_reset
))
858 gpio_free(core
->gpio_reset
);
864 static const struct i2c_device_id si476x_id
[] = {
865 { "si4761", SI476X_CHIP_SI4761
},
866 { "si4764", SI476X_CHIP_SI4764
},
867 { "si4768", SI476X_CHIP_SI4768
},
870 MODULE_DEVICE_TABLE(i2c
, si476x_id
);
872 static struct i2c_driver si476x_core_driver
= {
874 .name
= "si476x-core",
875 .owner
= THIS_MODULE
,
877 .probe
= si476x_core_probe
,
878 .remove
= si476x_core_remove
,
879 .id_table
= si476x_id
,
881 module_i2c_driver(si476x_core_driver
);
884 MODULE_AUTHOR("Andrey Smirnov <andrew.smirnov@gmail.com>");
885 MODULE_DESCRIPTION("Si4761/64/68 AM/FM MFD core device driver");
886 MODULE_LICENSE("GPL");