Linux Audio

Check our new training course

Loading...
v3.15
 
  1/*
  2 * Bluetooth built-in chip control
  3 *
  4 * Copyright (c) 2008 Dmitry Baryshkov
  5 *
  6 * This program is free software; you can redistribute it and/or modify
  7 * it under the terms of the GNU General Public License version 2 as
  8 * published by the Free Software Foundation.
  9 *
 10 */
 11
 12#include <linux/kernel.h>
 13#include <linux/module.h>
 14#include <linux/platform_device.h>
 15#include <linux/gpio.h>
 16#include <linux/delay.h>
 17#include <linux/rfkill.h>
 18
 19#include <mach/tosa_bt.h>
 20
 21static void tosa_bt_on(struct tosa_bt_data *data)
 22{
 23	gpio_set_value(data->gpio_reset, 0);
 24	gpio_set_value(data->gpio_pwr, 1);
 25	gpio_set_value(data->gpio_reset, 1);
 26	mdelay(20);
 27	gpio_set_value(data->gpio_reset, 0);
 28}
 29
 30static void tosa_bt_off(struct tosa_bt_data *data)
 31{
 32	gpio_set_value(data->gpio_reset, 1);
 33	mdelay(10);
 34	gpio_set_value(data->gpio_pwr, 0);
 35	gpio_set_value(data->gpio_reset, 0);
 36}
 37
 38static int tosa_bt_set_block(void *data, bool blocked)
 39{
 40	pr_info("BT_RADIO going: %s\n", blocked ? "off" : "on");
 41
 42	if (!blocked) {
 43		pr_info("TOSA_BT: going ON\n");
 44		tosa_bt_on(data);
 45	} else {
 46		pr_info("TOSA_BT: going OFF\n");
 47		tosa_bt_off(data);
 48	}
 49
 50	return 0;
 51}
 52
 53static const struct rfkill_ops tosa_bt_rfkill_ops = {
 54	.set_block = tosa_bt_set_block,
 55};
 56
 57static int tosa_bt_probe(struct platform_device *dev)
 58{
 59	int rc;
 60	struct rfkill *rfk;
 61
 62	struct tosa_bt_data *data = dev->dev.platform_data;
 63
 64	rc = gpio_request(data->gpio_reset, "Bluetooth reset");
 65	if (rc)
 66		goto err_reset;
 67	rc = gpio_direction_output(data->gpio_reset, 0);
 68	if (rc)
 69		goto err_reset_dir;
 70	rc = gpio_request(data->gpio_pwr, "Bluetooth power");
 71	if (rc)
 72		goto err_pwr;
 73	rc = gpio_direction_output(data->gpio_pwr, 0);
 74	if (rc)
 75		goto err_pwr_dir;
 76
 77	rfk = rfkill_alloc("tosa-bt", &dev->dev, RFKILL_TYPE_BLUETOOTH,
 78			   &tosa_bt_rfkill_ops, data);
 79	if (!rfk) {
 80		rc = -ENOMEM;
 81		goto err_rfk_alloc;
 82	}
 83
 84	rc = rfkill_register(rfk);
 85	if (rc)
 86		goto err_rfkill;
 87
 88	platform_set_drvdata(dev, rfk);
 89
 90	return 0;
 91
 92err_rfkill:
 93	rfkill_destroy(rfk);
 94err_rfk_alloc:
 95	tosa_bt_off(data);
 96err_pwr_dir:
 97	gpio_free(data->gpio_pwr);
 98err_pwr:
 99err_reset_dir:
100	gpio_free(data->gpio_reset);
101err_reset:
102	return rc;
103}
104
105static int tosa_bt_remove(struct platform_device *dev)
106{
107	struct tosa_bt_data *data = dev->dev.platform_data;
108	struct rfkill *rfk = platform_get_drvdata(dev);
109
110	platform_set_drvdata(dev, NULL);
111
112	if (rfk) {
113		rfkill_unregister(rfk);
114		rfkill_destroy(rfk);
115	}
116	rfk = NULL;
117
118	tosa_bt_off(data);
119
120	gpio_free(data->gpio_pwr);
121	gpio_free(data->gpio_reset);
122
123	return 0;
124}
125
126static struct platform_driver tosa_bt_driver = {
127	.probe = tosa_bt_probe,
128	.remove = tosa_bt_remove,
129
130	.driver = {
131		.name = "tosa-bt",
132		.owner = THIS_MODULE,
133	},
134};
 
135
136
137static int __init tosa_bt_init(void)
138{
139	return platform_driver_register(&tosa_bt_driver);
140}
141
142static void __exit tosa_bt_exit(void)
143{
144	platform_driver_unregister(&tosa_bt_driver);
145}
146
147module_init(tosa_bt_init);
148module_exit(tosa_bt_exit);
v5.14.15
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * Bluetooth built-in chip control
  4 *
  5 * Copyright (c) 2008 Dmitry Baryshkov
 
 
 
 
 
  6 */
  7
  8#include <linux/kernel.h>
  9#include <linux/module.h>
 10#include <linux/platform_device.h>
 11#include <linux/gpio.h>
 12#include <linux/delay.h>
 13#include <linux/rfkill.h>
 14
 15#include "tosa_bt.h"
 16
 17static void tosa_bt_on(struct tosa_bt_data *data)
 18{
 19	gpio_set_value(data->gpio_reset, 0);
 20	gpio_set_value(data->gpio_pwr, 1);
 21	gpio_set_value(data->gpio_reset, 1);
 22	mdelay(20);
 23	gpio_set_value(data->gpio_reset, 0);
 24}
 25
 26static void tosa_bt_off(struct tosa_bt_data *data)
 27{
 28	gpio_set_value(data->gpio_reset, 1);
 29	mdelay(10);
 30	gpio_set_value(data->gpio_pwr, 0);
 31	gpio_set_value(data->gpio_reset, 0);
 32}
 33
 34static int tosa_bt_set_block(void *data, bool blocked)
 35{
 36	pr_info("BT_RADIO going: %s\n", blocked ? "off" : "on");
 37
 38	if (!blocked) {
 39		pr_info("TOSA_BT: going ON\n");
 40		tosa_bt_on(data);
 41	} else {
 42		pr_info("TOSA_BT: going OFF\n");
 43		tosa_bt_off(data);
 44	}
 45
 46	return 0;
 47}
 48
 49static const struct rfkill_ops tosa_bt_rfkill_ops = {
 50	.set_block = tosa_bt_set_block,
 51};
 52
 53static int tosa_bt_probe(struct platform_device *dev)
 54{
 55	int rc;
 56	struct rfkill *rfk;
 57
 58	struct tosa_bt_data *data = dev->dev.platform_data;
 59
 60	rc = gpio_request(data->gpio_reset, "Bluetooth reset");
 61	if (rc)
 62		goto err_reset;
 63	rc = gpio_direction_output(data->gpio_reset, 0);
 64	if (rc)
 65		goto err_reset_dir;
 66	rc = gpio_request(data->gpio_pwr, "Bluetooth power");
 67	if (rc)
 68		goto err_pwr;
 69	rc = gpio_direction_output(data->gpio_pwr, 0);
 70	if (rc)
 71		goto err_pwr_dir;
 72
 73	rfk = rfkill_alloc("tosa-bt", &dev->dev, RFKILL_TYPE_BLUETOOTH,
 74			   &tosa_bt_rfkill_ops, data);
 75	if (!rfk) {
 76		rc = -ENOMEM;
 77		goto err_rfk_alloc;
 78	}
 79
 80	rc = rfkill_register(rfk);
 81	if (rc)
 82		goto err_rfkill;
 83
 84	platform_set_drvdata(dev, rfk);
 85
 86	return 0;
 87
 88err_rfkill:
 89	rfkill_destroy(rfk);
 90err_rfk_alloc:
 91	tosa_bt_off(data);
 92err_pwr_dir:
 93	gpio_free(data->gpio_pwr);
 94err_pwr:
 95err_reset_dir:
 96	gpio_free(data->gpio_reset);
 97err_reset:
 98	return rc;
 99}
100
101static int tosa_bt_remove(struct platform_device *dev)
102{
103	struct tosa_bt_data *data = dev->dev.platform_data;
104	struct rfkill *rfk = platform_get_drvdata(dev);
105
106	platform_set_drvdata(dev, NULL);
107
108	if (rfk) {
109		rfkill_unregister(rfk);
110		rfkill_destroy(rfk);
111	}
112	rfk = NULL;
113
114	tosa_bt_off(data);
115
116	gpio_free(data->gpio_pwr);
117	gpio_free(data->gpio_reset);
118
119	return 0;
120}
121
122static struct platform_driver tosa_bt_driver = {
123	.probe = tosa_bt_probe,
124	.remove = tosa_bt_remove,
125
126	.driver = {
127		.name = "tosa-bt",
 
128	},
129};
130module_platform_driver(tosa_bt_driver);
131
132MODULE_LICENSE("GPL");
133MODULE_AUTHOR("Dmitry Baryshkov");
134MODULE_DESCRIPTION("Bluetooth built-in chip control");