2019-06-04 11:11:33 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2015-07-27 18:04:03 +03:00
/*
* Intel LPSS ACPI support .
*
* Copyright ( C ) 2015 , Intel Corporation
*
* Authors : Andy Shevchenko < andriy . shevchenko @ linux . intel . com >
* Mika Westerberg < mika . westerberg @ linux . intel . com >
*/
2023-11-24 22:31:26 +03:00
# include <linux/device.h>
# include <linux/gfp_types.h>
2015-07-27 18:04:03 +03:00
# include <linux/ioport.h>
2023-11-24 22:31:25 +03:00
# include <linux/mod_devicetable.h>
2015-07-27 18:04:03 +03:00
# include <linux/module.h>
2023-11-24 22:31:28 +03:00
# include <linux/pm.h>
2015-07-27 18:04:03 +03:00
# include <linux/pm_runtime.h>
# include <linux/platform_device.h>
2015-11-30 18:11:42 +03:00
# include <linux/property.h>
2023-11-24 22:31:26 +03:00
2022-03-01 23:50:56 +03:00
# include <linux/pxa2xx_ssp.h>
2015-07-27 18:04:03 +03:00
2023-11-24 22:31:26 +03:00
# include <asm/errno.h>
2015-07-27 18:04:03 +03:00
# include "intel-lpss.h"
2022-03-01 23:50:56 +03:00
static const struct property_entry spt_spi_properties [ ] = {
PROPERTY_ENTRY_U32 ( " intel,spi-pxa2xx-type " , LPSS_SPT_SSP ) ,
{ }
} ;
static const struct software_node spt_spi_node = {
. properties = spt_spi_properties ,
} ;
2019-08-16 20:56:02 +03:00
static const struct intel_lpss_platform_info spt_info = {
. clk_rate = 120000000 ,
2022-03-01 23:50:56 +03:00
. swnode = & spt_spi_node ,
2019-08-16 20:56:02 +03:00
} ;
2021-03-01 17:42:20 +03:00
static const struct property_entry spt_i2c_properties [ ] = {
2015-11-30 18:11:42 +03:00
PROPERTY_ENTRY_U32 ( " i2c-sda-hold-time-ns " , 230 ) ,
{ } ,
} ;
2021-03-01 17:42:21 +03:00
static const struct software_node spt_i2c_node = {
. properties = spt_i2c_properties ,
} ;
2015-11-30 18:11:42 +03:00
static const struct intel_lpss_platform_info spt_i2c_info = {
. clk_rate = 120000000 ,
2021-03-01 17:42:21 +03:00
. swnode = & spt_i2c_node ,
2015-11-30 18:11:42 +03:00
} ;
2021-03-01 17:42:20 +03:00
static const struct property_entry uart_properties [ ] = {
2019-08-16 20:56:02 +03:00
PROPERTY_ENTRY_U32 ( " reg-io-width " , 4 ) ,
PROPERTY_ENTRY_U32 ( " reg-shift " , 2 ) ,
PROPERTY_ENTRY_BOOL ( " snps,uart-16550-compatible " ) ,
{ } ,
} ;
2021-03-01 17:42:21 +03:00
static const struct software_node uart_node = {
. properties = uart_properties ,
} ;
2019-08-16 20:56:02 +03:00
static const struct intel_lpss_platform_info spt_uart_info = {
. clk_rate = 120000000 ,
. clk_con_id = " baudclk " ,
2021-03-01 17:42:21 +03:00
. swnode = & uart_node ,
2019-08-16 20:56:02 +03:00
} ;
2022-03-01 23:50:56 +03:00
static const struct property_entry bxt_spi_properties [ ] = {
PROPERTY_ENTRY_U32 ( " intel,spi-pxa2xx-type " , LPSS_BXT_SSP ) ,
{ }
} ;
static const struct software_node bxt_spi_node = {
. properties = bxt_spi_properties ,
} ;
2015-10-21 12:41:47 +03:00
static const struct intel_lpss_platform_info bxt_info = {
. clk_rate = 100000000 ,
2022-03-01 23:50:56 +03:00
. swnode = & bxt_spi_node ,
2015-10-21 12:41:47 +03:00
} ;
2021-03-01 17:42:20 +03:00
static const struct property_entry bxt_i2c_properties [ ] = {
2016-01-26 15:17:49 +03:00
PROPERTY_ENTRY_U32 ( " i2c-sda-hold-time-ns " , 42 ) ,
PROPERTY_ENTRY_U32 ( " i2c-sda-falling-time-ns " , 171 ) ,
PROPERTY_ENTRY_U32 ( " i2c-scl-falling-time-ns " , 208 ) ,
{ } ,
} ;
2021-03-01 17:42:21 +03:00
static const struct software_node bxt_i2c_node = {
. properties = bxt_i2c_properties ,
} ;
2015-10-21 12:41:47 +03:00
static const struct intel_lpss_platform_info bxt_i2c_info = {
. clk_rate = 133000000 ,
2021-03-01 17:42:21 +03:00
. swnode = & bxt_i2c_node ,
2015-10-21 12:41:47 +03:00
} ;
2021-03-01 17:42:20 +03:00
static const struct property_entry apl_i2c_properties [ ] = {
2016-09-12 14:41:33 +03:00
PROPERTY_ENTRY_U32 ( " i2c-sda-hold-time-ns " , 207 ) ,
PROPERTY_ENTRY_U32 ( " i2c-sda-falling-time-ns " , 171 ) ,
PROPERTY_ENTRY_U32 ( " i2c-scl-falling-time-ns " , 208 ) ,
{ } ,
} ;
2021-03-01 17:42:21 +03:00
static const struct software_node apl_i2c_node = {
. properties = apl_i2c_properties ,
} ;
2016-09-12 14:41:33 +03:00
static const struct intel_lpss_platform_info apl_i2c_info = {
. clk_rate = 133000000 ,
2021-03-01 17:42:21 +03:00
. swnode = & apl_i2c_node ,
2016-09-12 14:41:33 +03:00
} ;
2022-03-01 23:50:56 +03:00
static const struct property_entry cnl_spi_properties [ ] = {
PROPERTY_ENTRY_U32 ( " intel,spi-pxa2xx-type " , LPSS_CNL_SSP ) ,
{ }
} ;
static const struct software_node cnl_spi_node = {
. properties = cnl_spi_properties ,
} ;
static const struct intel_lpss_platform_info cnl_info = {
. clk_rate = 120000000 ,
. swnode = & cnl_spi_node ,
} ;
2021-06-03 19:51:28 +03:00
static const struct intel_lpss_platform_info cnl_i2c_info = {
. clk_rate = 216000000 ,
. swnode = & spt_i2c_node ,
} ;
2015-07-27 18:04:03 +03:00
static const struct acpi_device_id intel_lpss_acpi_ids [ ] = {
/* SPT */
2019-08-16 20:56:02 +03:00
{ " INT3440 " , ( kernel_ulong_t ) & spt_info } ,
{ " INT3441 " , ( kernel_ulong_t ) & spt_info } ,
{ " INT3442 " , ( kernel_ulong_t ) & spt_i2c_info } ,
{ " INT3443 " , ( kernel_ulong_t ) & spt_i2c_info } ,
{ " INT3444 " , ( kernel_ulong_t ) & spt_i2c_info } ,
{ " INT3445 " , ( kernel_ulong_t ) & spt_i2c_info } ,
2015-11-30 18:11:42 +03:00
{ " INT3446 " , ( kernel_ulong_t ) & spt_i2c_info } ,
{ " INT3447 " , ( kernel_ulong_t ) & spt_i2c_info } ,
2019-08-16 20:56:02 +03:00
{ " INT3448 " , ( kernel_ulong_t ) & spt_uart_info } ,
{ " INT3449 " , ( kernel_ulong_t ) & spt_uart_info } ,
{ " INT344A " , ( kernel_ulong_t ) & spt_uart_info } ,
2021-06-03 19:51:28 +03:00
/* CNL */
2022-03-01 23:50:56 +03:00
{ " INT34B0 " , ( kernel_ulong_t ) & cnl_info } ,
{ " INT34B1 " , ( kernel_ulong_t ) & cnl_info } ,
2021-06-03 19:51:28 +03:00
{ " INT34B2 " , ( kernel_ulong_t ) & cnl_i2c_info } ,
{ " INT34B3 " , ( kernel_ulong_t ) & cnl_i2c_info } ,
{ " INT34B4 " , ( kernel_ulong_t ) & cnl_i2c_info } ,
{ " INT34B5 " , ( kernel_ulong_t ) & cnl_i2c_info } ,
{ " INT34B6 " , ( kernel_ulong_t ) & cnl_i2c_info } ,
{ " INT34B7 " , ( kernel_ulong_t ) & cnl_i2c_info } ,
{ " INT34B8 " , ( kernel_ulong_t ) & spt_uart_info } ,
{ " INT34B9 " , ( kernel_ulong_t ) & spt_uart_info } ,
{ " INT34BA " , ( kernel_ulong_t ) & spt_uart_info } ,
2022-03-01 23:50:56 +03:00
{ " INT34BC " , ( kernel_ulong_t ) & cnl_info } ,
2015-10-21 12:41:47 +03:00
/* BXT */
{ " 80860AAC " , ( kernel_ulong_t ) & bxt_i2c_info } ,
{ " 80860ABC " , ( kernel_ulong_t ) & bxt_info } ,
{ " 80860AC2 " , ( kernel_ulong_t ) & bxt_info } ,
/* APL */
2016-09-12 14:41:33 +03:00
{ " 80865AAC " , ( kernel_ulong_t ) & apl_i2c_info } ,
2015-10-21 12:41:47 +03:00
{ " 80865ABC " , ( kernel_ulong_t ) & bxt_info } ,
{ " 80865AC2 " , ( kernel_ulong_t ) & bxt_info } ,
2015-07-27 18:04:03 +03:00
{ }
} ;
MODULE_DEVICE_TABLE ( acpi , intel_lpss_acpi_ids ) ;
static int intel_lpss_acpi_probe ( struct platform_device * pdev )
{
2023-11-24 22:31:25 +03:00
const struct intel_lpss_platform_info * data ;
2015-07-27 18:04:03 +03:00
struct intel_lpss_platform_info * info ;
2021-11-01 22:00:08 +03:00
int ret ;
2015-07-27 18:04:03 +03:00
2023-11-24 22:31:25 +03:00
data = device_get_match_data ( & pdev - > dev ) ;
if ( ! data )
2015-07-27 18:04:03 +03:00
return - ENODEV ;
2023-11-24 22:31:25 +03:00
info = devm_kmemdup ( & pdev - > dev , data , sizeof ( * info ) , GFP_KERNEL ) ;
2015-07-27 18:04:03 +03:00
if ( ! info )
return - ENOMEM ;
2023-11-24 22:31:24 +03:00
/* No need to check mem and irq here as intel_lpss_probe() does it for us */
2015-07-27 18:04:03 +03:00
info - > mem = platform_get_resource ( pdev , IORESOURCE_MEM , 0 ) ;
info - > irq = platform_get_irq ( pdev , 0 ) ;
2021-11-01 22:00:08 +03:00
ret = intel_lpss_probe ( & pdev - > dev , info ) ;
if ( ret )
return ret ;
2015-07-27 18:04:03 +03:00
pm_runtime_set_active ( & pdev - > dev ) ;
pm_runtime_enable ( & pdev - > dev ) ;
2021-11-01 22:00:08 +03:00
return 0 ;
2015-07-27 18:04:03 +03:00
}
2023-11-23 19:56:34 +03:00
static void intel_lpss_acpi_remove ( struct platform_device * pdev )
2015-07-27 18:04:03 +03:00
{
intel_lpss_remove ( & pdev - > dev ) ;
pm_runtime_disable ( & pdev - > dev ) ;
}
static struct platform_driver intel_lpss_acpi_driver = {
. probe = intel_lpss_acpi_probe ,
2023-11-23 19:56:34 +03:00
. remove_new = intel_lpss_acpi_remove ,
2015-07-27 18:04:03 +03:00
. driver = {
. name = " intel-lpss " ,
. acpi_match_table = intel_lpss_acpi_ids ,
2023-11-24 22:31:28 +03:00
. pm = pm_ptr ( & intel_lpss_pm_ops ) ,
2015-07-27 18:04:03 +03:00
} ,
} ;
module_platform_driver ( intel_lpss_acpi_driver ) ;
MODULE_AUTHOR ( " Andy Shevchenko <andriy.shevchenko@linux.intel.com> " ) ;
MODULE_AUTHOR ( " Mika Westerberg <mika.westerberg@linux.intel.com> " ) ;
MODULE_DESCRIPTION ( " Intel LPSS ACPI driver " ) ;
MODULE_LICENSE ( " GPL v2 " ) ;
2023-11-24 22:31:27 +03:00
MODULE_IMPORT_NS ( INTEL_LPSS ) ;